From 46ef0171d4eb8a129ff771898a4a6cdc5155c4a2 Mon Sep 17 00:00:00 2001 From: gho tik Date: Tue, 27 Dec 2016 11:48:55 -0500 Subject: [PATCH] v2_04_01_src_fx3 Former-commit-id: 7373e879fbf64993eef4fcf8e677427372e26d23 --- build/dxwnd.dll | 4 +- build/dxwnd.ini | 114 +++++++++++++++++- .../exports/Garfield - Caught in the Act.dxw | 36 ++++++ build/exports/Titanic.dxw | 4 +- build/readme-relnotes.txt | 7 +- build/wing32.dll | 4 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 452096 -> 452096 bytes dll/gdi32.cpp | 18 ++- dll/iatpatch.cpp | 7 +- dll/smack.cpp | 26 ++++ dll/syslibs.h | 53 ++++---- dll/user32.cpp | 76 ++++++------ wing/wing32.suo | Bin 28160 -> 28160 bytes 14 files changed, 276 insertions(+), 75 deletions(-) create mode 100644 build/exports/Garfield - Caught in the Act.dxw 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 489d1346fd0f1ff8f159a92d5aac55c1a7772745..3268cc499811905a0fdbc818fad58ebbb018f209 100644 GIT binary patch delta 6197 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 delta 4479 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 IlG%0t1|1gCMF0Q* 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 b17a27bbe2390d2db70938239e5c93b349c9a15d..6828bd18b0d03067c785edcf0a0fd024d2e328da 100644 GIT binary patch delta 1198 zcmZuxTTfF#5T0$%sizkTJ*9!RU|S1P6hu-;fN%|!5U2u*SBPQ&gIa!k=Lmvpv(!m_Y&^BZ^1H}rBn0;kI7>K3V26F2r|$~}chS(7Nnasc zC0rv6P{RJjq1hEh5;E@_!%bgQz6D8$V!gFROIedb3~Ik@pUe%ftxshr4bchI{k_km)|X4wd3+=#j8xcAq}x5L8u>sKrew zjIB0F_K~B?llDtwCH4AH_`F(S$!FmxA@ZQr8-W^BttSp`SF#&)j|)U6u2{IoxQyu@pd&!4;DZ7;M};5tcjLM)R6j^)1?E{0_i==w5Ahe#dO4U delta 1204 zcmZ{jT}YEr7{||f_rCL;&AF|;eyseME}YC@ex-$9qoqPdmJWsCAGj5a)kt4 z&Zir1rJ{(ad~byeyvYc%C?dRy?!qMK!k}Ewvpvd!I7*QtammFT6SH~Tp{)N1S*js54*gP<;uIc$mDQwU-7JwC9g(7^qByyfuaw&l(MM!i~(_8P`(_nAemF#9;nN2P^BNA4P5X4=ltT*}eD zAL*Tv{zO2mywbN|U041)t5qoIa{CMX_{Hl-4eqU-Zz+i@(PBjL{Hlor=YnnfdH_~!Gvor0AxGXL}s_=wHsTgFiRv}Fam@ay0lV0TA86jTW z3#)1Y8GzfdY%OSJ=fT2it`dH#6y&4^& zJ(EmHkM!?VOUYD^X5v;SXGB=kiB2;yUMqu!xT)RwM}hk2E{N@>F3w8H7qC+P08(Xv z93fO1gd4s>7Yz?#UVB->bKh;bFP%!f!Y*M@kLa{tYIv_27X8Y6^R1)QrAZcxGR3Yy zzQ_EKqYt&m%+ENML;ImiuCLsq!fp~ndsTQgGZWR)hDSx2IXIH$WHva~p;pLT#<3PP zA9FRw5Nbi@`Yf%Hxs{{9^+h{&==OzoMdU8lPO?^s+9~GVEZ