diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 409f1c3..133a65f 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6a96c3c20704b6b52ee2e8757c9fe7e52d36dcf6b9772c9e6e88488d9ac04dc -size 764928 +oid sha256:980c05e0c87605ce728d6f896a4f42c8ba6bb4900af3a160f11be87dd57e81b8 +size 765440 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 37f9a03..6c9fbb3 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,3 +1,113 @@ [window] -exepath=F:\Games\ManTTSuperBike\ -exportpath=D:\DxWnd.develop\v2_04_01_beta\Release\ +exepath=F:\Games\Garfield\ +posx=597 +posy=556 +sizx=320 +sizy=200 +exportpath=D:\DxWnd.develop\v2_04_01_fx3_src\build\exports\ +[target] +title0=Garfield - Caught in the Act +path0=F:\Games\Garfield\GARFIELD.NOSHIM.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1208221696 +flagh0=65556 +flagi0=138412036 +flagj0=4226 +flagk0=327680 +flagl0=8421376 +flagm0=0 +tflag0=-2147477245 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=320 +initresh0=224 +title1=Titanic +path1=F:\Games\Titanic\TI.noshim.EXE +startfolder1= +launchpath1= +module1= +opengllib1= +notes1= +registry1= +ver1=0 +monitorid1=-1 +coord1=0 +flag1=-1474293718 +flagg1=1745879072 +flagh1=540692 +flagi1=138412036 +flagj1=4224 +flagk1=67584 +flagl1=269484032 +flagm1=9216 +tflag1=0 +dflag1=0 +posx1=50 +posy1=50 +sizx1=800 +sizy1=600 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=-1 +swapeffect1=0 +maxddinterface1=7 +slowratio1=2 +scanline1=0 +initresw1=800 +initresh1=600 +title2=Titanic +path2=F:\Games\Titanic\TI.noshim.EXE +startfolder2= +launchpath2= +module2= +opengllib2= +notes2= +registry2= +ver2=0 +monitorid2=-1 +coord2=0 +flag2=-1474293718 +flagg2=1745879072 +flagh2=606228 +flagi2=138412036 +flagj2=4224 +flagk2=67584 +flagl2=269484032 +flagm2=9216 +tflag2=0 +dflag2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=-1 +swapeffect2=0 +maxddinterface2=7 +slowratio2=2 +scanline2=0 +initresw2=800 +initresh2=600 diff --git a/build/exports/Garfield - Caught in the Act.dxw b/build/exports/Garfield - Caught in the Act.dxw new file mode 100644 index 0000000..75f05da --- /dev/null +++ b/build/exports/Garfield - Caught in the Act.dxw @@ -0,0 +1,36 @@ +[target] +title0=Garfield - Caught in the Act +path0=F:\Games\Garfield\GARFIELD.NOSHIM.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1208221696 +flagh0=65556 +flagi0=138412036 +flagj0=4226 +flagk0=327680 +flagl0=8421376 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=320 +initresh0=224 diff --git a/build/exports/Titanic.dxw b/build/exports/Titanic.dxw index 2843337..5cfff12 100644 --- a/build/exports/Titanic.dxw +++ b/build/exports/Titanic.dxw @@ -10,14 +10,14 @@ registry0= ver0=0 monitorid0=-1 coord0=0 -flag0=-1474293726 +flag0=-1474297814 flagg0=1745879072 flagh0=540692 flagi0=138412036 flagj0=4224 flagk0=67584 flagl0=269484032 -flagm0=1024 +flagm0=9216 tflag0=0 dflag0=0 posx0=50 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 57aa602..a7269c9 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1393,7 +1393,7 @@ fix: bug in Hybrid and GDI ddraw surface rendering fix: missing "No HAL Device" flag default to disabled fix: improvements in texture handling, dds format support for DirectDraw textures -v2.04.01 +v2.04.01/fx2 add: preliminary WinG32 handling add: minimal WinG32 replacement, thank to Wine source code add: DirectX(2)/"Create a Desktop Win" option. Fixes "Man TT Super Bike" @@ -1401,4 +1401,7 @@ add: new hooking schema for IAT organized like original "Al Unser Jr. Arcade Rac fix: in virtual registry fix to handle the '@' void label case properly fix: added hook for RegQueryValueA, used by "Warhammer 40.000 Shadow of the Horned Rat" fix: virtual registry logging - +add: added SmackW32 hooking to bypass SmackColorRemapWithTrans and SmackColorRemap: SmackColorRemap seems involved in changing screen resolution in "Civil War Generals 2" +fix: some log messages +fix: SetWindowLong hooker: eliminated a unassigned variable condition +fix: added hooker for GDI32/SetROP2 call to insert a InvalidateRect as in older OS. Makes "Titanic" working. diff --git a/build/wing32.dll b/build/wing32.dll index 624908b..32619c2 100644 --- a/build/wing32.dll +++ b/build/wing32.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:53879e29d60dcbc3d6ae8c5161d9749f3204fd2a2c5ae3e095bb81a47c3d90dc -size 41984 +oid sha256:55b44016e314b1abcbcfa27cee66899407fab0694ef995bec1fc01e460dac5ca +size 42496 diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index ab13293..6baaec5 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.04.01" +#define VERSION "2.04.01.fx3" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 489d134..3268cc4 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index b87cf78..940e169 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -70,6 +70,7 @@ static HookEntryEx_Type Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "SetPaletteEntries", (FARPROC)SetPaletteEntries, (FARPROC *)&pSetPaletteEntries, (FARPROC)extSetPaletteEntries}, {HOOK_HOT_CANDIDATE, 0, "GetSystemPaletteUse", (FARPROC)GetSystemPaletteUse, (FARPROC *)&pGetSystemPaletteUse, (FARPROC)extGetSystemPaletteUse}, {HOOK_HOT_CANDIDATE, 0, "CreateICA", (FARPROC)CreateICA, (FARPROC *)&pCreateICA, (FARPROC)extCreateICA}, // Riven + {HOOK_HOT_CANDIDATE, 0, "SetROP2", (FARPROC)SetROP2, (FARPROC *)&pSetROP2, (FARPROC)extSetROP2}, // Titanic #ifdef TRACEPALETTE {HOOK_IAT_CANDIDATE, 0, "ResizePalette", (FARPROC)ResizePalette, (FARPROC *)&pResizePalette, (FARPROC)extResizePalette}, #endif @@ -1705,7 +1706,8 @@ int WINAPI extSetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, { int ret; if(IsTraceDW){ - OutTrace("SetDIBits: hdc=%x hbmp=%x lines=(%d,%d) ColorUse=%x(%s)\n", hdc, hbmp, uStartScan, cScanLines, fuColorUse, ExplainDIBUsage(fuColorUse)); + OutTrace("SetDIBits: hdc=%x%s hbmp=%x lines=(%d,%d) ColorUse=%x(%s)\n", + hdc, dxw.IsToRemap(hdc)?"(R)":"", hbmp, uStartScan, cScanLines, fuColorUse, ExplainDIBUsage(fuColorUse)); TraceBITMAPINFOHEADER("SetDIBits", (BITMAPINFOHEADER *)&(lpbmi->bmiHeader)); } @@ -3287,6 +3289,20 @@ UINT WINAPI extSetPaletteEntries(HPALETTE hpal, UINT iStart, UINT cEntries, cons return ret; } +int WINAPI extSetROP2(HDC hdc, int fnDrawMode) +{ + // In early OS the SetROP2 caused some sort of screen refresh, that does no longer happen in recent ones. + // So wrapping the function and inserting a InvalidateRect right after that fixes the problem. + // This trick fixes the black screens in "Titanic - an adventure out of time" on Win10. + // N.b. Titanic calls SetTextColor, SetBkColor and SetROP2 in sequence, it might be possible that the + // API to hook for refreshing is another, or even them all! + int ret; + OutTrace("SetROP2: hdc=%x drawmode=%d\n", hdc, fnDrawMode); + ret = (*pSetROP2)(hdc, fnDrawMode); + (*pInvalidateRect)(WindowFromDC(hdc), NULL, 0); + return ret; +} + #if 0 LONG WINAPI extSetBitmapBits(HBITMAP hbmp, DWORD cBytes, VOID *lpBits) { diff --git a/dll/iatpatch.cpp b/dll/iatpatch.cpp index 0bdc193..abbed0e 100644 --- a/dll/iatpatch.cpp +++ b/dll/iatpatch.cpp @@ -146,6 +146,7 @@ void *IATPatchSequential(HMODULE module, DWORD ordinal, char *dll, void *apiproc } pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva); + // move fname pointer to first API name char *fname; while(pidesc->FirstThunk){ impmodule = (PSTR)(base + pidesc->Name); @@ -154,7 +155,7 @@ void *IATPatchSequential(HMODULE module, DWORD ordinal, char *dll, void *apiproc pidesc ++; } pidesc = (PIMAGE_IMPORT_DESCRIPTOR)(base + rva); - OutTrace("IATPatch: no PE OFTs - first call=%s\n", fname); + OutTraceB("IATPatch: first call=%s\n", fname); while(pidesc->FirstThunk){ impmodule = (PSTR)(base + pidesc->Name); @@ -204,7 +205,7 @@ void *IATPatchSequential(HMODULE module, DWORD ordinal, char *dll, void *apiproc } if(ptaddr->u1.Function) { - OutTraceDW("IATPatch: hooking %s\n", fname); + OutTraceDW("IATPatch: hooking %s\n", apiname); org = (void *)ptaddr->u1.Function; if(org == hookproc) return 0; // already hooked @@ -466,7 +467,7 @@ BOOL IsIATSequential(HMODULE module) // skip first string for(; *fname; fname++); for(; !*fname; fname++); // if second string is another DLL it is sequential, otherwise not. - // OutTrace("IsIATSequential: second entry=%s\n", fname); + OutTraceB("IsIATSequential: second entry=%s\n", fname); return (BOOL)stristr(fname, ".DLL"); } __except(EXCEPTION_EXECUTE_HANDLER) diff --git a/dll/smack.cpp b/dll/smack.cpp index d73a35f..822f433 100644 --- a/dll/smack.cpp +++ b/dll/smack.cpp @@ -24,10 +24,14 @@ typedef struct { typedef Smack * (WINAPI *SmackOpen_Type)(HANDLE, UINT32, INT32); typedef Smack * (WINAPI *Smacker_Type)(HANDLE); typedef Smack * (WINAPI *Smacker2_Type)(HANDLE, UINT32); +typedef Smack * (WINAPI *SmackColorRemap_Type)(HANDLE, const void PTR4 *, u32, u32); +typedef Smack * (WINAPI *SmackColorRemapWithTrans_Type)(HANDLE, const void PTR4 *, u32, u32, u32); SmackOpen_Type pSmackOpen; Smacker_Type pSmackClose, pSmackWait, pSmackDoFrame, pSmackNextFrame, pSmackSoundUseMSS, pSmackSoundUseDirectSound; Smacker2_Type pSmackSoundOnOff, pSmackGoto; +SmackColorRemap_Type pSmackColorRemap; +SmackColorRemapWithTrans_Type pSmackColorRemapWithTrans; Smack * WINAPI extSmackOpen(HANDLE, UINT32, INT32); Smack * WINAPI extSmackClose(HANDLE); @@ -38,6 +42,8 @@ Smack * WINAPI extSmackSoundUseMSS(HANDLE); Smack * WINAPI extSmackSoundUseDirectSound(HANDLE); Smack * WINAPI extSmackSoundOnOff(HANDLE, UINT32); Smack * WINAPI extSmackGoto(HANDLE, UINT32); +Smack * WINAPI extSmackColorRemap(HANDLE, const void PTR4 *, u32, u32); +Smack * WINAPI extSmackColorRemapWithTrans(HANDLE, const void PTR4 *, u32, u32, u32); static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0x000E, "_SmackOpen@12", (FARPROC)NULL, (FARPROC *)&pSmackOpen, (FARPROC)extSmackOpen}, @@ -49,6 +55,8 @@ static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0x001B, "_SmackGoto@8", (FARPROC)NULL, (FARPROC *)&pSmackGoto, (FARPROC)extSmackGoto}, {HOOK_IAT_CANDIDATE, 0x0015, "_SmackNextFrame@4", (FARPROC)NULL, (FARPROC *)&pSmackNextFrame, (FARPROC)extSmackNextFrame}, {HOOK_IAT_CANDIDATE, 0x0026, "_SmackSoundUseDirectSound@4", (FARPROC)NULL, (FARPROC *)&pSmackSoundUseDirectSound, (FARPROC)extSmackSoundUseDirectSound}, + {HOOK_IAT_CANDIDATE, 0x0000, "_SmackColorRemap@16", (FARPROC)NULL, (FARPROC *)&pSmackColorRemap, (FARPROC)extSmackColorRemap}, + {HOOK_IAT_CANDIDATE, 0x0000, "_SmackColorRemapWithTrans@20", (FARPROC)NULL, (FARPROC *)&pSmackColorRemapWithTrans, (FARPROC)extSmackColorRemapWithTrans}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -185,6 +193,24 @@ Smack * WINAPI extSmackGoto(HANDLE h, UINT32 flag) return (*pSmackGoto)(h, flag); } +Smack * WINAPI extSmackColorRemap(HANDLE h, const void PTR4 *remappal, u32 numcolors, u32 paltype) +{ + OutTraceDW("SmackColorRemap: h=%x numcolors=%d paltype=%d\n", h, numcolors, paltype); + DumpSmack((Smack *)h); + // BYPASS the call to avoid resolution changes + //return (*pSmackColorRemap)(h, remappal, numcolors, paltype); + return (Smack *)h; +} + +Smack * WINAPI extSmackColorRemapWithTrans(HANDLE h, const void PTR4 *remappal, u32 numcolors, u32 paltype, u32 transindex) +{ + OutTraceDW("SmackColorRemapWithTrans: h=%x numcolors=%d paltype=%d transindex=%d\n", h, numcolors, paltype, transindex); + DumpSmack((Smack *)h); + // BYPASS the call to avoid resolution changes + //return (*pSmackColorRemapWithTrans)(h, remappal, numcolors, paltype); + return (Smack *)h; +} + /* --------------------------------------------------------------- Used by M2 Tank Platoon II: Ordinal 0x0015 name _SmackNextFrame@4 diff --git a/dll/syslibs.h b/dll/syslibs.h index a0dcacc..bb2349d 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -109,35 +109,36 @@ typedef BOOL (WINAPI *GDIGetPixelFormat_Type)(HDC); typedef int (WINAPI *ChoosePixelFormat_Type)(HDC, const PIXELFORMATDESCRIPTOR *); typedef int (WINAPI *DescribePixelFormat_Type)(HDC, int, UINT, LPPIXELFORMATDESCRIPTOR); typedef DWORD (WINAPI *GetObjectType_Type)(HGDIOBJ); -typedef int (WINAPI *SetDIBits_Type)(HDC, HBITMAP, UINT, UINT, const VOID *, const BITMAPINFO *, UINT); -typedef int (WINAPI *OffsetRgn_Type)(HRGN, int, int); +typedef int (WINAPI *SetDIBits_Type)(HDC, HBITMAP, UINT, UINT, const VOID *, const BITMAPINFO *, UINT); +typedef int (WINAPI *OffsetRgn_Type)(HRGN, int, int); typedef COLORREF (WINAPI *GetPixel_Type)(HDC, int, int); -typedef BOOL (WINAPI *PlgBlt_Type)(HDC, const POINT *, HDC, int, int, int, int, HBITMAP, int, int); -typedef BOOL (WINAPI *SetPixelV_Type)(HDC, int, int, COLORREF); -typedef BOOL (WINAPI *Chord_Type)(HDC, int, int, int, int, int, int, int, int); -typedef BOOL (WINAPI *PolyTextOutA_Type)(HDC, const POLYTEXTA *, int); -typedef BOOL (WINAPI *PolyTextOutW_Type)(HDC, const POLYTEXTW *, int); -typedef int (WINAPI *GetDIBits_Type)(HDC, HBITMAP, UINT, UINT, LPVOID, LPBITMAPINFO, UINT); +typedef BOOL (WINAPI *PlgBlt_Type)(HDC, const POINT *, HDC, int, int, int, int, HBITMAP, int, int); +typedef BOOL (WINAPI *SetPixelV_Type)(HDC, int, int, COLORREF); +typedef BOOL (WINAPI *Chord_Type)(HDC, int, int, int, int, int, int, int, int); +typedef BOOL (WINAPI *PolyTextOutA_Type)(HDC, const POLYTEXTA *, int); +typedef BOOL (WINAPI *PolyTextOutW_Type)(HDC, const POLYTEXTW *, int); +typedef int (WINAPI *GetDIBits_Type)(HDC, HBITMAP, UINT, UINT, LPVOID, LPBITMAPINFO, UINT); typedef HBITMAP (WINAPI *CreateDIBitmap_Type)(HDC, BITMAPINFOHEADER *, DWORD, const VOID *, const BITMAPINFO *, UINT); typedef HBITMAP (WINAPI *CreateDIBSection_Type)(HDC, const BITMAPINFO *, UINT, VOID **, HANDLE, DWORD); typedef HBITMAP (WINAPI *CreateDiscardableBitmap_Type)(HDC, int, int); -typedef BOOL (WINAPI *ExtFloodFill_Type)(HDC, int, int, COLORREF, UINT); -typedef BOOL (WINAPI *GdiAlphaBlend_Type)(HDC, int, int, int, int, HDC, int, int, int, int, BLENDFUNCTION); -typedef BOOL (WINAPI *GdiGradientFill_Type)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG); -typedef BOOL (WINAPI *GdiTransparentBlt_Type)(HDC, int, int, int, int, HDC, int, int, int, int, UINT); -typedef BOOL (WINAPI *Pie_Type)(HDC, int, int, int, int, int, int, int, int); -typedef BOOL (WINAPI *AngleArc_Type)(HDC, int, int, DWORD, FLOAT, FLOAT); -typedef BOOL (WINAPI *PolyPolyline_Type)(HDC, const POINT *, const DWORD *, DWORD); -typedef BOOL (WINAPI *FillRgn_Type)(HDC, HRGN, HBRUSH); -typedef BOOL (WINAPI *FrameRgn_Type)(HDC, HRGN, HBRUSH, int, int); -typedef BOOL (WINAPI *InvertRgn_Type)(HDC, HRGN); -typedef BOOL (WINAPI *PaintRgn_Type)(HDC, HRGN); -typedef int (WINAPI *SetMapMode_Type)(HDC, int); -typedef BOOL (WINAPI *RoundRect_Type)(HDC, int, int, int, int, int, int); -typedef BOOL (WINAPI *PolyPolygon_Type)(HDC, const POINT *, const INT *, int); -//typedef BOOL (WINAPI *DPtoLP_Type)(HDC, LPPOINT, int); -typedef BOOL (WINAPI *PlayEnhMetaFile_Type)(HDC, HENHMETAFILE, const RECT *); -typedef UINT (WINAPI *SetPaletteEntries_Type)(HPALETTE, UINT, UINT, const PALETTEENTRY *); +typedef BOOL (WINAPI *ExtFloodFill_Type)(HDC, int, int, COLORREF, UINT); +typedef BOOL (WINAPI *GdiAlphaBlend_Type)(HDC, int, int, int, int, HDC, int, int, int, int, BLENDFUNCTION); +typedef BOOL (WINAPI *GdiGradientFill_Type)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG); +typedef BOOL (WINAPI *GdiTransparentBlt_Type)(HDC, int, int, int, int, HDC, int, int, int, int, UINT); +typedef BOOL (WINAPI *Pie_Type)(HDC, int, int, int, int, int, int, int, int); +typedef BOOL (WINAPI *AngleArc_Type)(HDC, int, int, DWORD, FLOAT, FLOAT); +typedef BOOL (WINAPI *PolyPolyline_Type)(HDC, const POINT *, const DWORD *, DWORD); +typedef BOOL (WINAPI *FillRgn_Type)(HDC, HRGN, HBRUSH); +typedef BOOL (WINAPI *FrameRgn_Type)(HDC, HRGN, HBRUSH, int, int); +typedef BOOL (WINAPI *InvertRgn_Type)(HDC, HRGN); +typedef BOOL (WINAPI *PaintRgn_Type)(HDC, HRGN); +typedef int (WINAPI *SetMapMode_Type)(HDC, int); +typedef BOOL (WINAPI *RoundRect_Type)(HDC, int, int, int, int, int, int); +typedef BOOL (WINAPI *PolyPolygon_Type)(HDC, const POINT *, const INT *, int); +//typedef BOOL (WINAPI *DPtoLP_Type)(HDC, LPPOINT, int); +typedef BOOL (WINAPI *PlayEnhMetaFile_Type)(HDC, HENHMETAFILE, const RECT *); +typedef UINT (WINAPI *SetPaletteEntries_Type)(HPALETTE, UINT, UINT, const PALETTEENTRY *); +typedef int (WINAPI *SetROP2_Type)(HDC, int); // Kernel32.dll: typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); @@ -406,6 +407,7 @@ DXWEXTERN PolyPolygon_Type pPolyPolygon DXWINITIALIZED; //DXWEXTERN DPtoLP_Type pDPtoLP DXWINITIALIZED; DXWEXTERN PlayEnhMetaFile_Type pPlayEnhMetaFile DXWINITIALIZED; DXWEXTERN SetPaletteEntries_Type pSetPaletteEntries DXWINITIALIZED; +DXWEXTERN SetROP2_Type pSetROP2 DXWINITIALIZED; // Kernel32.dll: DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED; @@ -664,6 +666,7 @@ extern BOOL WINAPI extPolyPolygon(HDC, const POINT *, const INT *, int); //extern BOOL WINAPI extDPtoLP(HDC, LPPOINT, int); extern BOOL WINAPI extPlayEnhMetaFile(HDC, HENHMETAFILE, const RECT *); extern UINT WINAPI extSetPaletteEntries(HPALETTE, UINT, UINT, const PALETTEENTRY *); +extern int WINAPI extSetROP2(HDC, int); // Kernel32.dll: extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); diff --git a/dll/user32.cpp b/dll/user32.cpp index 5ff1fb9..d310742 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -899,7 +899,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon // v2.03.94.fx2: removed dxw.IsFullScreen() check here ... WinProc routine must be verified in all conditions // fixes "Nascar Racing 3" that was setting the WinProc while still in non fullscreen mode! if ((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) { - WNDPROC lres; + LONG lres; WNDPROC OldProc; DWORD WinStyle; BOOL bHooked = FALSE; @@ -921,42 +921,48 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon OldProc = (WNDPROC)(*pGetWindowLong)(hwnd, nIndex); WinStyle = (*pGetWindowLong)(hwnd, GWL_STYLE); - // hook extWindowProc to main win .... - if(dxw.IsDesktop(hwnd) && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ - if(OldProc==extWindowProc) OldProc=dxwws.GetProc(hwnd); - dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); - res=(LONG)OldProc; - SetLastError(0); - lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extWindowProc); - OutTraceDW("SetWindowLong: DESKTOP hooked %x->%x\n", dwNewLong, extWindowProc); - bHooked = TRUE; - } + while(TRUE){ // fake loop + lres = -1; // initialize with not 0 value since 0 means error + if(!(dxw.dwFlags6 & NOWINDOWHOOKS)){ + // hook extWindowProc to main win .... + if(dxw.IsDesktop(hwnd)){ + if(OldProc==extWindowProc) OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); + res=(LONG)OldProc; + SetLastError(0); + lres=(*pSetWindowLong)(hwnd, nIndex, (LONG)extWindowProc); + OutTraceDW("SetWindowLong: DESKTOP hooked %x->%x\n", dwNewLong, extWindowProc); + break; + } - // hook extChildWindowProc to child win .... - if((WinStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN) && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ - if(OldProc==extChildWindowProc) OldProc=dxwws.GetProc(hwnd); - dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); - res=(LONG)OldProc; - SetLastError(0); - lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extChildWindowProc); - OutTraceDW("SetWindowLong: CHILD hooked %x->%x\n", dwNewLong, extChildWindowProc); - bHooked = TRUE; - } + // hook extDlgWindowProc to dialog win .... + if((WinStyle & DWL_DLGPROC) && (dxw.dwFlags1 & HOOKCHILDWIN)){ + if(OldProc==extDialogWindowProc) OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); + res=(LONG)OldProc; + SetLastError(0); + lres=(*pSetWindowLong)(hwnd, nIndex, (LONG)extDialogWindowProc); + OutTraceDW("SetWindowLong: DIALOG hooked %x->%x\n", dwNewLong, extDialogWindowProc); + break; + } - // hook extDlgWindowProc to dialog win .... - if((WinStyle & DWL_DLGPROC) && (dxw.dwFlags1 & HOOKCHILDWIN) && !(dxw.dwFlags6 & NOWINDOWHOOKS)){ - if(OldProc==extDialogWindowProc) OldProc=dxwws.GetProc(hwnd); - dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); - res=(LONG)OldProc; - SetLastError(0); - lres=(WNDPROC)(*pSetWindowLong)(hwnd, nIndex, (LONG)extDialogWindowProc); - OutTraceDW("SetWindowLong: DIALOG hooked %x->%x\n", dwNewLong, extDialogWindowProc); - bHooked = TRUE; - } + // hook extChildWindowProc to child win .... + if((WinStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN)){ + if(OldProc==extChildWindowProc) OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); + res=(LONG)OldProc; + SetLastError(0); + lres=(*pSetWindowLong)(hwnd, nIndex, (LONG)extChildWindowProc); + OutTraceDW("SetWindowLong: CHILD hooked %x->%x\n", dwNewLong, extChildWindowProc); + break; + } + } - // hook dwNewLong if not done otherwise - if(!bHooked) res=(*pSetWindowLong)(hwnd, nIndex, dwNewLong); - if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); + // hook dwNewLong if not done otherwise + res = (*pSetWindowLong)(hwnd, nIndex, dwNewLong); + break; + } + if(!lres && GetLastError()) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } else{ // through here for any message different from GWL_WNDPROC or DWL_DLGPROC @@ -3747,7 +3753,7 @@ BOOL WINAPI extSwitchDesktop(HDESK hDesktop) HDESK WINAPI extOpenDesktop(LPTSTR lpszDesktop, DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess) { - OutTraceDW("CreateDesktop: SUPPRESS flags=%x access=%x\n", dwFlags, dwDesiredAccess); + OutTraceDW("OpenDesktop: SUPPRESS flags=%x access=%x\n", dwFlags, dwDesiredAccess); return (HDESK)0xDEADBEEF; // fake handle //return (HDESK)NULL; // fake handle } diff --git a/wing/wing32.suo b/wing/wing32.suo index b17a27b..6828bd1 100644 Binary files a/wing/wing32.suo and b/wing/wing32.suo differ