diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 19c1618..4fc9c00 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:922db77cc7f8ea50e92a54d5579754a304cb92bdc3e422ac9d4f10d5e34f9227 -size 657920 +oid sha256:b93d0975ec2a090848ed1953cd908344cb91d8e459ffebd7f63b231f23274473 +size 660480 diff --git a/build/exports/Arcade Pool 2.dxw b/build/exports/Arcade Pool 2.dxw new file mode 100644 index 0000000..a0d75e7 --- /dev/null +++ b/build/exports/Arcade Pool 2.dxw @@ -0,0 +1,31 @@ +[target] +title0=Arcade Pool 2 +path0=D:\Games\Arcade Pool 2\Arcade Pool II.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138543108 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Hyper Crazy Climber.dxw b/build/exports/Hyper Crazy Climber.dxw new file mode 100644 index 0000000..c4ca9e7 --- /dev/null +++ b/build/exports/Hyper Crazy Climber.dxw @@ -0,0 +1,31 @@ +[target] +title0=Hyper Crazy Climber +path0=D:\Games\Hyper Crazy Climber\CRAZY.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=1 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=196608 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Need For Speed 3.dxw b/build/exports/Need For Speed 3.dxw new file mode 100644 index 0000000..38050fe --- /dev/null +++ b/build/exports/Need For Speed 3.dxw @@ -0,0 +1,31 @@ +[target] +title0=Need For Speed 3 +path0=D:\Games\Need For Speed III\NFS3.EXE +launchpath0= +module0= +opengllib0= +notes0=To install the game on x64 systems copy the following folders and files from\nthe CD to a NFS3 directory on the hard drive:\nFEDATA\\nGAMEDATA\\nd3da.dll\neacsnd.dll\nnfs3.exe\nsofttria.dll\n\nThen copy paste the text below to notepad and save it to your NFS3 directory\nas "INSTALL.WIN". (Remember to set file type to "All Files" when saving.)\n\nenglish\nlocal\n.\GameData\\n.\GameData\Tracks\\n.\GameData\Tracks\Tutor\\n.\GameData\CarModel\\n.\GameData\Render\pc\\n.\GameData\DashHud\\n.\GameData\Audio\pc\\n.\GameData\Audio\SFX\\n.\GameData\Audio\Speech\English\\n.\GameData\Audio\Speech\German\\n.\GameData\Audio\Speech\French\\n.\GameData\Audio\Speech\Spanish\\n.\GameData\Audio\Speech\Italian\\n.\FeData\art\\n.\FeData\text\\n.\FeData\text\\n.\FeData\save\\n.\FeData\stats\\n.\FeData\config\\n.\FeData\audio\\n.\FeData\Art\Slides\\n.\FeData\Art\Track\\n.\FeData\Art\Showcase\\n.\FeData\movies\\n.\FeData\stats\prh\\n +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Need For Speed III]\n"3D Card"="[Direct 3D]"\n"Thrash Driver"="d3d"\n"Group"="D3D"\n"Hardware Acceleration"=dword:00000001\n\n# These values set up NFS3 to run in Direct3D mode. If you want to run the\n# game in software rendering mode turn off the Compat. tab option\n# "Emulate Registry".\n +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1744830464 +flagh0=1556 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Return to Castle Wolfenstein.dxw b/build/exports/Return to Castle Wolfenstein.dxw new file mode 100644 index 0000000..a87abd3 --- /dev/null +++ b/build/exports/Return to Castle Wolfenstein.dxw @@ -0,0 +1,31 @@ +[target] +title0=Return to Castle Wolfenstein +path0=D:\Games\Return to Castle Wolfenstein\WolfSP.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=673194498 +flagg0=1208090624 +flagh0=65556 +flagi0=138412038 +flagj0=4224 +flagk0=-2147418112 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=1 diff --git a/build/exports/Sherlock Holmes - Mistery of the Mummy (steam).dxw b/build/exports/Sherlock Holmes - Mistery of the Mummy (steam).dxw new file mode 100644 index 0000000..d0b8013 --- /dev/null +++ b/build/exports/Sherlock Holmes - Mistery of the Mummy (steam).dxw @@ -0,0 +1,31 @@ +[target] +title0=Sherlock Holmes - Mystery of the Mummy (steam) +path0=D:\Games\Sherlock Holmes - Mystery of the Mummy\game.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1073741824 +flagh0=65556 +flagi0=134217732 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/St. Row the Third (DX11).dxw b/build/exports/St. Row the Third (DX11).dxw new file mode 100644 index 0000000..601fd9f --- /dev/null +++ b/build/exports/St. Row the Third (DX11).dxw @@ -0,0 +1,31 @@ +[target] +title0=St. Row the Third (DX11) +path0=D:\Games\St. Row the Third\Saints Row The Third\saintsrowthethird_dx11.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=11 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138416132 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=4 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/St. Row the Third (DX9).dxw b/build/exports/St. Row the Third (DX9).dxw new file mode 100644 index 0000000..5b17a6b --- /dev/null +++ b/build/exports/St. Row the Third (DX9).dxw @@ -0,0 +1,31 @@ +[target] +title0=St. Row the Third (DX9) +path0=D:\Games\St. Row the Third\Saints Row The Third\SaintsRowTheThird.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=9 +coord0=0 +flag0=136314914 +flagg0=1744830464 +flagh0=20 +flagi0=136314884 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=1024 +sizy0=768 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Star Defender 1.dxw b/build/exports/Star Defender 1.dxw new file mode 100644 index 0000000..24be6d4 --- /dev/null +++ b/build/exports/Star Defender 1.dxw @@ -0,0 +1,31 @@ +[target] +title0=Star Defender 1 +path0=D:\Games\Star Defender 123Special\sd1\StarDefender.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=1 +coord0=0 +flag0=136314922 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=329728 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Star Defender 2.dxw b/build/exports/Star Defender 2.dxw new file mode 100644 index 0000000..a77177a --- /dev/null +++ b/build/exports/Star Defender 2.dxw @@ -0,0 +1,31 @@ +[target] +title0=Star Defender 2 +path0=D:\Games\Star Defender 123Special\sd2\game.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=8 +coord0=0 +flag0=136315434 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=329728 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Steel Saviour demo (T-Zwei).dxw b/build/exports/Steel Saviour demo (T-Zwei).dxw new file mode 100644 index 0000000..0b69609 --- /dev/null +++ b/build/exports/Steel Saviour demo (T-Zwei).dxw @@ -0,0 +1,31 @@ +[target] +title0=Steel Saviour demo (T-Zwei) +path0=D:\Games\T-Zwei\TZwei.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=8 +coord0=0 +flag0=136314914 +flagg0=1744961536 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Steel Saviour.dxw b/build/exports/Steel Saviour.dxw new file mode 100644 index 0000000..7b266d6 --- /dev/null +++ b/build/exports/Steel Saviour.dxw @@ -0,0 +1,31 @@ +[target] +title0=Steel Saviour +path0=D:\Games\Steel Saviour\SteelSaviour.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=8 +coord0=0 +flag0=136314922 +flagg0=1744961536 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Warhammer 40K Rites of War.dxw b/build/exports/Warhammer 40K Rites of War.dxw new file mode 100644 index 0000000..aec7e30 --- /dev/null +++ b/build/exports/Warhammer 40K Rites of War.dxw @@ -0,0 +1,31 @@ +[target] +title0=Warhammer 40K Rites of War +path0=D:\Games\Warhammer 40K Rites Of War\game\RoW.exe +launchpath0= +module0= +opengllib0= +notes0=After installing the game copy the "Map" -folder from the CD to the \nRites of War\ directory on your hard drive.\n\nThis will fix the issue where the game crashes when starting a campaign. +registry0= +ver0=0 +coord0=0 +flag0=685772838 +flagg0=1207959680 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 0cb617c..24c5765 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1129,3 +1129,9 @@ v2.03.71 fix: no need to save configuration before running with fake registry add: icons to notify for non-empty registry and notes tabs fix: hooked ddrawex.dll DirectDrawEx methods - fixes "Whiteout", what else? + +v2.03.72 +fix: inserted bypass for DirectDraw::Compact method, that is unimplemented but can return errors. Fixes "Crazy Climber" error detection. +fix: error in d3d9::CrerateDeviceEx method preventing it to work when moving fullscreen devices to window mode, as tipically happens using DxWnd. Fixes d3d9 version of "Saint's Row the Third" +fix: accurate determination of ".text" or "CODE" segments where to apply the REPLACERTSC and REPLACEPRIVOPS flags. +fix: error in logic to add extra reference to backbuffer surface: fixes "Warhammer 40k Rites of War". \ No newline at end of file diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 6e635e5..645289b 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -29,12 +29,20 @@ static HookEntryEx_Type Hooks[]={ void HookAdvApi32(HMODULE module) { + if( (dxw.dwFlags3 & EMULATEREGISTRY) || + (dxw.dwFlags4 & OVERRIDEREGISTRY) || + (dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) || + (dxw.dwTFlags & OUTREGISTRY)) HookLibraryEx(module, Hooks, "ADVAPI32.dll"); } FARPROC Remap_AdvApi32_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; + if(!(dxw.dwFlags3 & EMULATEREGISTRY) || + (dxw.dwFlags4 & OVERRIDEREGISTRY) || + (dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) || + (dxw.dwTFlags & OUTREGISTRY)) return NULL; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; return NULL; } diff --git a/dll/comctl32.cpp b/dll/comctl32.cpp new file mode 100644 index 0000000..5144b53 --- /dev/null +++ b/dll/comctl32.cpp @@ -0,0 +1,59 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include "dxwnd.h" +#include "dxwcore.hpp" +#include "syslibs.h" +#include "dxhook.h" +#include "dxhelper.h" + +typedef BOOL (WINAPI *InitializeFlatSB_Type)(HWND); +InitializeFlatSB_Type pInitializeFlatSB = NULL; +BOOL WINAPI extInitializeFlatSB(HWND); +typedef BOOL (WINAPI *UninitializeFlatSB_Type)(HWND); +InitializeFlatSB_Type pUninitializeFlatSB = NULL; +BOOL WINAPI extUninitializeFlatSB(HWND); + +static HookEntryEx_Type Hooks[]={ + {HOOK_IAT_CANDIDATE, 0, "InitializeFlatSB", NULL, (FARPROC *)&pInitializeFlatSB, (FARPROC)extInitializeFlatSB}, + {HOOK_IAT_CANDIDATE, 0, "UninitializeFlatSB", NULL, (FARPROC *)&pUninitializeFlatSB, (FARPROC)extUninitializeFlatSB}, + {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator +}; + +void HookComCtl32(HMODULE module) +{ + HookLibraryEx(module, Hooks, "comtl32.dll"); +} + +FARPROC Remap_ComCtl32_ProcAddress(LPCSTR proc, HMODULE hModule) +{ + FARPROC addr; + if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; + return NULL; +} + +BOOL WINAPI extInitializeFlatSB(HWND hwnd) +{ + BOOL ret; + OutTraceDW("InitializeFlatSB: hwnd=%x\n", hwnd); + if(dxw.IsFullScreen() && dxw.IsRealDesktop(hwnd)) { + OutTraceDW("InitializeFlatSB: hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + hwnd = dxw.GethWnd(); + } + ret = (*pInitializeFlatSB)(hwnd); + if(!ret)OutTraceDW("InitializeFlatSB: ret=%x\n", ret); + return ret; +} + +BOOL WINAPI extUninitializeFlatSB(HWND hwnd) +{ + BOOL ret; + OutTraceDW("InitializeFlatSB: hwnd=%x\n", hwnd); + if(dxw.IsFullScreen() && dxw.IsRealDesktop(hwnd)) { + OutTraceDW("UninitializeFlatSB: hwnd=%x->%x\n", hwnd, dxw.GethWnd()); + hwnd = dxw.GethWnd(); + } + ret = (*pUninitializeFlatSB)(hwnd); + if(!ret)OutTraceDW("UninitializeFlatSB: ret=%x\n", ret); + return ret; +} diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index 842d1e7..e11185f 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -101,6 +101,21 @@ static HRESULT sBltNoPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__); res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx); break; + case DDERR_UNSUPPORTED: + // to be fixed: parameters coming from BltFast in Star Defender 1 are not compatible with Blt transformation, so clear all.... + if(dwflags & (DDBLT_KEYDEST|DDBLT_KEYSRC)){ +#if 1 + res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, 0, 0); +#else + DDBLTFX ddbltfx; + memset(&ddbltfx, 0, sizeof(ddbltfx)); + ddbltfx.dwSize = sizeof(ddbltfx); + if(dwflags & DDBLT_KEYDEST) ddbltfx.dwROP |= DDCKEYCAPS_DESTBLT; + if(dwflags & DDBLT_KEYSRC ) ddbltfx.dwROP |= DDCKEYCAPS_SRCBLT; + res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_ROP, &ddbltfx); +#endif + } + break; default: break; } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 492e7a2..0cd05af 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -15,6 +15,18 @@ #define EMULATEZBUFFERATTACH FALSE +#ifdef CHECKMETHODPOINTERS +static void NullMethodPointer(char *s) +{ + char msg[80]; + sprintf(msg, "NULL %s method", s); + MessageBox(0, msg, "DxWnd", MB_OK); +} +#define CHECKPTR(p, s) if(!p) NullMethodPointer(s) +#else +#define CHECKPTR(p, s) +#endif + extern BOOL IsChangeDisplaySettingsHotPatched; DWORD dwBackBufferCaps; extern void TextureHandling(LPDIRECTDRAWSURFACE, int); @@ -42,7 +54,9 @@ ULONG WINAPI extReleaseD1(LPDIRECTDRAW); ULONG WINAPI extReleaseD2(LPDIRECTDRAW); ULONG WINAPI extReleaseD4(LPDIRECTDRAW); ULONG WINAPI extReleaseD7(LPDIRECTDRAW); + /*** IDirectDraw methods ***/ +HRESULT WINAPI extCompact(LPDIRECTDRAW); // unimplemented method ??? HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); @@ -758,6 +772,8 @@ static void BypassGOGDDrawRedirector() int HookDirectDraw(HMODULE module, int version) { + if(dxw.dwTargetDDVersion == HOOKDDRAWNONE) return 0; + if ((dxw.dwFlags2 & SETCOMPATIBILITY) || (dxw.dwFlags6 & DISABLEMAXWINMODE)){ static BOOL AlreadyDone = FALSE; @@ -842,6 +858,7 @@ CreatePalette_Type pCreatePaletteMethod(int dxversion) case 4: pCreatePalette = pCreatePalette4; break; case 7: pCreatePalette = pCreatePalette7; break; } + CHECKPTR(pCreatePalette, "CreatePalette"); return pCreatePalette; } @@ -854,6 +871,7 @@ SetPalette_Type pSetPaletteMethod(int dxversion) case 4: pSetPalette=pSetPalette4; break; case 7: pSetPalette=pSetPalette7; break; } + CHECKPTR(pSetPalette, "SetPalette"); return pSetPalette; } @@ -867,6 +885,7 @@ ReleaseS_Type pReleaseSMethod(int dxversion) case 4: pReleaseS=pReleaseS4; break; case 7: pReleaseS=pReleaseS7; break; } + CHECKPTR(pReleaseS, "Surface::Release"); return pReleaseS; } @@ -880,6 +899,7 @@ ReleaseDC_Type pReleaseDCMethod() case 4: pReleaseDC=pReleaseDC4; break; case 7: pReleaseDC=pReleaseDC7; break; } + CHECKPTR(pReleaseDC, "ReleaseDC"); return pReleaseDC; } @@ -893,6 +913,7 @@ SetClipper_Type pSetClipperMethod(int dxversion) case 4: pSetClipper=pSetClipper4; break; case 7: pSetClipper=pSetClipper7; break; } + CHECKPTR(pSetClipper, "SetClipper"); return pSetClipper; } @@ -906,6 +927,7 @@ Blt_Type pBltMethod() case 4: pBlt=pBlt4; break; case 7: pBlt=pBlt7; break; } + CHECKPTR(pBlt, "Blt"); return pBlt; } @@ -919,6 +941,7 @@ GetDC_Type pGetDCMethod() case 4: pGetDC=pGetDC4; break; case 7: pGetDC=pGetDC7; break; } + CHECKPTR(pGetDC, "GetDC"); return pGetDC; } @@ -932,6 +955,7 @@ Unlock4_Type pUnlockMethod(int dxversion) case 4: pUnlock=(Unlock4_Type)pUnlock4; break; case 7: pUnlock=(Unlock4_Type)pUnlock7; break; } + CHECKPTR(pUnlock, "Unlock"); return pUnlock; } @@ -945,6 +969,7 @@ Lock_Type pLockMethod(int dxversion) case 4: pLock=pLock4; break; case 7: pLock=pLock7; break; } + CHECKPTR(pLock, "Lock"); return pLock; } @@ -958,6 +983,7 @@ CreateSurface2_Type pCreateSurfaceMethod(int dxversion) case 4: pCreateSurface=(CreateSurface2_Type)pCreateSurface4; break; case 7: pCreateSurface=(CreateSurface2_Type)pCreateSurface7; break; } + CHECKPTR(pCreateSurface, "CreateSurface"); return pCreateSurface; } @@ -972,6 +998,7 @@ GetSurfaceDesc2_Type pGetSurfaceDescMethod() case 4: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc4; break; case 7: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc7; break; } + CHECKPTR(pGetSurfaceDesc, "GetSurfaceDesc"); return pGetSurfaceDesc; } @@ -985,6 +1012,7 @@ GetGDISurface_Type pGetGDISurfaceMethod(int dxversion) case 4: pGetGDISurface = pGetGDISurface4; break; case 7: pGetGDISurface = pGetGDISurface7; break; } + CHECKPTR(pGetGDISurface, "GetGDISurface"); return pGetGDISurface; } @@ -1091,6 +1119,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", *lplpdd, dxversion, GetCurrentThreadId()); + SetHook((void *)(**(DWORD **)lplpdd + 12), extCompact, (void **)&pCompact, "Compact"); switch(dxversion) { case 1: SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)"); @@ -3123,7 +3152,9 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate // v2.2.84: avoid the extra referenced in non windowed mode since it causes the window shift reported by gsky916 // for Wind Fantasy SP. // v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2 - if((dxw.dwDDVersion>=2) && dxw.Windowize) lpdd->AddRef(); + // v2.3.72: fixed previous fix: condition is <=2, not >=2 ! + // Be aware that it may perhaps become <=3, if we get the same problem elsewhere + if((dxw.dwDDVersion<=2) && dxw.Windowize) lpdd->AddRef(); return DD_OK; } @@ -3812,7 +3843,8 @@ HRESULT WINAPI extBlt4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRA HRESULT WINAPI extBlt7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) { return extBlt(7, pBlt7, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } -HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, +HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast, + LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) { // BltFast is supported just on screen surfaces, so it has to be replaced @@ -3834,8 +3866,18 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdd char sRect[81]; if (lpsrcrect) sprintf(sRect, "(%d,%d)-(%d,%d)", lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom); else strcpy(sRect, "(NULL)"); - OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) srcrect=%s\n", - lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy, sRect); + OutTrace("BltFast(%d): dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) srcrect=%s\n", + dxversion, lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy, sRect); + } + + // try the actual method first, it may work in some corcumstances.... + // when ret is DDERR_UNSUPPORTED try the emulated path. + if(!(ToPrim || FromPrim)) { + ret = pBltFast(lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); + if(ret != DDERR_UNSUPPORTED) { + if(ret) OutTraceE("BltFast ERROR: res=%x(%s)\n", ret, ExplainDDError(ret)); + return ret; + } } // consistency check .... @@ -3849,7 +3891,6 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdd if(dwtrans & DDBLTFAST_WAIT) flags = DDBLT_WAIT; if(dwtrans & DDBLTFAST_DESTCOLORKEY) flags |= DDBLT_KEYDEST; if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC; - //if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_COLORFILL; if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){ return sBlt(dxversion, pBlt, "BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE); @@ -3890,15 +3931,15 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdd } HRESULT WINAPI extBltFast1(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) -{ return extBltFast(1, pBlt1, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +{ return extBltFast(1, pBlt1, pBltFast1, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } HRESULT WINAPI extBltFast2(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) -{ return extBltFast(2, pBlt2, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +{ return extBltFast(2, pBlt2, pBltFast2, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } HRESULT WINAPI extBltFast3(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) -{ return extBltFast(3, pBlt3, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +{ return extBltFast(3, pBlt3, pBltFast3, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } HRESULT WINAPI extBltFast4(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) -{ return extBltFast(4, pBlt4, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +{ return extBltFast(4, pBlt4, pBltFast4, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } HRESULT WINAPI extBltFast7(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) -{ return extBltFast(7, pBlt7, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } +{ return extBltFast(7, pBlt7, pBltFast7, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); } HRESULT WINAPI extWaitForVerticalBlank(WaitForVerticalBlank_Type pWaitForVerticalBlank, LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) { @@ -4139,8 +4180,8 @@ static HRESULT WINAPI extLock(int dxversion, Lock_Type pLock, LPDIRECTDRAWSURFAC char sRect[81]; if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); else strcpy(sRect, "(NULL)"); - OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", - lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); + OutTrace("Lock(%d): lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", + dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); @@ -4202,8 +4243,8 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR char sRect[81]; if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); else strcpy(sRect, "(NULL)"); - OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", - lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); + OutTrace("Lock(%d): lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", + dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } switch(dxversion){ @@ -5806,3 +5847,9 @@ HRESULT WINAPI extAddOverlayDirtyRect4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) { return extAddOverlayDirtyRect(4, pAddOverlayDirtyRect4, lpdds, lpRect); } HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) { return extAddOverlayDirtyRect(7, pAddOverlayDirtyRect7, lpdds, lpRect); } + +HRESULT WINAPI extCompact(LPDIRECTDRAW lpdd) +{ + OutTraceDW("Compact: lpdd=%x\n", lpdd); + return DD_OK; +} diff --git a/dll/dinput.cpp b/dll/dinput.cpp index 2f2d3c6..55a3e47 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -156,6 +156,8 @@ void HookDirectInput(HMODULE module) HINSTANCE hinst; LPDIRECTINPUT lpdi; + if(!(dxw.dwFlags1 & HOOKDI)) return; + HookLibraryEx(module, diHooks, "dinput.dll"); if(!pDirectInputCreateA && !pDirectInputCreateW && !pDirectInputCreateExA){ hinst = LoadLibrary("dinput.dll"); @@ -176,6 +178,8 @@ void HookDirectInput8(HMODULE module) HINSTANCE hinst; LPDIRECTINPUT lpdi; + if(!(dxw.dwFlags1 & HOOKDI8)) return; + HookLibraryEx(module, di8Hooks, "dinput8.dll"); if(!pDirectInput8Create){ hinst = LoadLibrary("dinput8.dll"); diff --git a/dll/dsound.cpp b/dll/dsound.cpp index b3a3820..0c0b0a5 100644 --- a/dll/dsound.cpp +++ b/dll/dsound.cpp @@ -44,6 +44,7 @@ static HookEntryEx_Type Hooks[]={ FARPROC Remap_DSound_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; + if(!(dxw.dwFlags7 & HOOKDIRECTSOUND)) return NULL; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; return NULL; } @@ -52,6 +53,7 @@ static char *libname = "dsound.dll"; void HookDirectSound(HMODULE hModule) { + if(!(dxw.dwFlags7 & HOOKDIRECTSOUND)) return; HookLibraryEx(hModule, Hooks, "dsound.dll"); } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 68183b8..822162c 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "dxwnd.h" #include "dxwcore.hpp" #include "shareddc.hpp" @@ -36,6 +37,8 @@ extern LRESULT CALLBACK MessageHook(int, WPARAM, LPARAM); extern DWORD WINAPI CpuLimit(LPVOID); extern DWORD WINAPI CpuSlow(LPVOID); +extern HMODULE SysLibs[]; + typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); typedef int (*Preparedisasm_Type)(void); typedef void (*Finishdisasm_Type)(void); @@ -72,7 +75,7 @@ static char *FlagNames[32]={ static char *Flag2Names[32]={ "RECOVERSCREENMODE", "REFRESHONRESIZE", "BACKBUFATTACH", "MODALSTYLE", "KEEPASPECTRATIO", "INIT8BPP", "FORCEWINRESIZE", "INIT16BPP", - "KEEPCURSORFIXED", "DISABLEGAMMARAMP", "**", "FIXNCHITTEST", + "KEEPCURSORFIXED", "DISABLEGAMMARAMP", "INDEPENDENTREFRESH", "FIXNCHITTEST", "LIMITFPS", "SKIPFPS", "SHOWFPS", "HIDEMULTIMONITOR", "TIMESTRETCH", "HOOKOPENGL", "WALLPAPERMODE", "SHOWHWCURSOR", "GDISTRETCHED", "SHOWFPSOVERLAY", "FAKEVERSION", "FULLRECTBLT", @@ -897,31 +900,55 @@ void HookExceptionHandler(void) (*pSetUnhandledExceptionFilter)((LPTOP_LEVEL_EXCEPTION_FILTER)myUnhandledExceptionFilter); } +static void InitModuleHooks() +{ + for (int i=0; iFileHeader.NumberOfSections); + for(int i=0; iFileHeader.NumberOfSections; i++){ + char *name = (char *)pSectionHdr->Name; + if ((memcmp(name, ".text", 5) == 0) || (memcmp(name, "CODE", 4) == 0)){ + *start = (unsigned char *)mi.lpBaseOfDll + pSectionHdr->VirtualAddress; + *len = pSectionHdr->SizeOfRawData; + break; + } + } + FreeLibrary(hDbgLib); + return (*start != NULL); +} + static void ReplaceRDTSC() { typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD); HMODULE disasmlib; unsigned char *opcodes; t_disasm da; - MODULEINFO mi; - HMODULE psapilib; - GetModuleInformation_Type pGetModuleInformation; DWORD dwSegSize; DWORD oldprot; if (!(disasmlib=LoadDisasm())) return; - - // getting segment size - psapilib=(*pLoadLibraryA)("psapi.dll"); - if(!psapilib) { - OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "psapi.dll", GetLastError()); - return; - } - pGetModuleInformation=(GetModuleInformation_Type)(*pGetProcAddress)(psapilib, "GetModuleInformation"); - (*pGetModuleInformation)(GetCurrentProcess(), GetModuleHandle(NULL), &mi, sizeof(mi)); - dwSegSize = mi.SizeOfImage; - FreeLibrary(psapilib); - (*pPreparedisasm)(); - opcodes = (unsigned char *)mi.lpBaseOfDll; + + if(!GetTextSegment(NULL, &opcodes, &dwSegSize)) return; + unsigned int offset = 0; BOOL cont = TRUE; - OutTraceDW("DXWND: opcode starting at addr=%x size=%x\n", opcodes, dwSegSize); + OutTraceDW("DXWND: ReplaceRDTSC starting at addr=%x size=%x\n", opcodes, dwSegSize); while (cont) { int cmdlen = 0; __try{ @@ -1036,13 +1094,7 @@ static void ReplaceRDTSC() } __except (EXCEPTION_EXECUTE_HANDLER){ OutTrace("exception at offset=%x\n", offset); - if(opcodes+offset < mi.EntryPoint) { - offset = (unsigned char *)mi.EntryPoint - (unsigned char *)mi.lpBaseOfDll; - OutTraceDW("DXWND: opcode resuming at addr=%x\n", opcodes+offset); - continue; - } - else - cont=FALSE; + cont=FALSE; } if (cmdlen==0) break; // search for RDTSC opcode 0x0F31 @@ -1075,7 +1127,7 @@ static void ReplaceRDTSC() } } offset+=cmdlen; - if((offset+0x10) > (int)mi.lpBaseOfDll + dwSegSize) break; // skip last 16 bytes, just in case.... + if((offset+0x10) > dwSegSize) break; // skip last 16 bytes, just in case.... } return; @@ -1085,54 +1137,49 @@ static void ReplaceRDTSC() static void ReplacePrivilegedOps() { - typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD); HMODULE disasmlib; unsigned char *opcodes; t_disasm da; - MODULEINFO mi; - HMODULE psapilib; - GetModuleInformation_Type pGetModuleInformation; DWORD dwSegSize; DWORD oldprot; + static BOOL bDoOnce=FALSE; + + if(bDoOnce) return; + bDoOnce = TRUE; if (!(disasmlib=LoadDisasm())) return; - - // getting segment size - psapilib=(*pLoadLibraryA)("psapi.dll"); - if(!psapilib) { - OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "psapi.dll", GetLastError()); - return; - } - pGetModuleInformation=(GetModuleInformation_Type)(*pGetProcAddress)(psapilib, "GetModuleInformation"); - (*pGetModuleInformation)(GetCurrentProcess(), GetModuleHandle(NULL), &mi, sizeof(mi)); - dwSegSize = mi.SizeOfImage; - FreeLibrary(psapilib); - (*pPreparedisasm)(); - opcodes = (unsigned char *)mi.lpBaseOfDll; + + if(!GetTextSegment(NULL, &opcodes, &dwSegSize)) return; + unsigned int offset = 0; BOOL cont = TRUE; - OutTraceDW("DXWND: opcode starting at addr=%x size=%x\n", opcodes, dwSegSize); + OutTraceDW("DXWND: ReplacePrivilegedOps starting at addr=%x size=%x\n", opcodes, dwSegSize); while (cont) { int cmdlen = 0; + char *sOpcode; + BOOL bPriv; __try{ cmdlen=(*pDisasm)(opcodes+offset,20,offset,&da,0,NULL,NULL); //OutTrace("offset=%x opcode=%x\n", offset, *(opcodes+offset)); } __except (EXCEPTION_EXECUTE_HANDLER){ OutTrace("exception at offset=%x\n", offset); - if(opcodes+offset < mi.EntryPoint) { - offset = (unsigned char *)mi.EntryPoint - (unsigned char *)mi.lpBaseOfDll; - OutTraceDW("DXWND: opcode resuming at addr=%x\n", opcodes+offset); - continue; - } - else - cont=FALSE; + cont=FALSE; } if (cmdlen==0) break; - // search for IN opcode 0xEC (IN AL, DX) - if(*(opcodes+offset) == 0xEC){ - OutTraceDW("DXWND: IN opcode found at addr=%x\n", (opcodes+offset)); + // search for following opcodes: + // 0xEC (IN AL, DX) + // 0x6D (INS DWORD PTR ES:[EDI],DX) + // 0x6E (OUTS DX,BYTE PTR DS:[ESI]) + bPriv = FALSE; + switch(*(opcodes+offset)){ + case 0x6D: sOpcode = "INS"; bPriv=TRUE; break; + case 0x6E: sOpcode = "OUTS"; bPriv=TRUE; break; + case 0xEC: sOpcode = "IN"; bPriv=TRUE; break; + } + if(bPriv){ + OutTraceDW("DXWND: %s opcode found at addr=%x\n", sOpcode, (opcodes+offset)); if(!VirtualProtect((LPVOID)(opcodes+offset), 8, PAGE_READWRITE, &oldprot)) { OutTrace("VirtualProtect ERROR: target=%x err=%d at %d\n", opcodes+offset, GetLastError(), __LINE__); return; // error condition @@ -1150,7 +1197,7 @@ static void ReplacePrivilegedOps() } } offset+=cmdlen; - if((offset+0x10) > (int)mi.lpBaseOfDll + dwSegSize) break; // skip last 16 bytes, just in case.... + if((offset+0x10) > dwSegSize) break; // skip last 16 bytes, just in case.... } return; @@ -1264,6 +1311,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) if(DoOnce){ DoOnce = FALSE; + InitModuleHooks(); dxw.VirtualDesktop.left = GetSystemMetrics(SM_XVIRTUALSCREEN); dxw.VirtualDesktop.top = GetSystemMetrics(SM_YVIRTUALSCREEN); dxw.VirtualDesktop.right = dxw.VirtualDesktop.left + GetSystemMetrics(SM_CXVIRTUALSCREEN); @@ -1508,6 +1556,7 @@ FARPROC RemapLibraryEx(LPCSTR proc, HMODULE hModule, HookEntryEx_Type *Hooks) void HookLibraryEx(HMODULE hModule, HookEntryEx_Type *Hooks, char *DLLName) { HMODULE hDLL = NULL; + //OutTrace("HookLibrary: hModule=%x dll=%s\n", hModule, DLLName); for(; Hooks->APIName; Hooks++){ void *remapped_addr; diff --git a/dll/dxhook.h b/dll/dxhook.h index dd5e82e..1b98896 100644 --- a/dll/dxhook.h +++ b/dll/dxhook.h @@ -9,18 +9,21 @@ extern void HookDirectSound(HMODULE); extern void HookImeLib(HMODULE); extern void HookKernel32(HMODULE); extern void HookUser32(HMODULE); +extern void HookTrust(HMODULE); extern void HookWinMM(HMODULE, char *libname); extern void HookAdvApi32(HMODULE); extern void HookImagehlp(HMODULE); extern void HookSmackW32(HMODULE); extern void HookAVIFil32(HMODULE); extern void HookComDlg32(HMODULE); +extern void HookComCtl32(HMODULE); extern void InitPosition(int, int, int, int, int, int); //void InitWindowPos(int, int, int, int); extern LPCSTR ProcToString(LPCSTR proc); extern HRESULT HookDxDiag(REFIID, LPVOID FAR*); +extern FARPROC Remap_AVIFil32_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_ddraw_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_d3d7_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_d3d8_ProcAddress(LPCSTR, HMODULE); @@ -43,6 +46,8 @@ extern FARPROC Remap_Glide_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_Imagehlp_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_DInput_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_DInput8_ProcAddress(LPCSTR, HMODULE); +extern FARPROC Remap_ComCtl32_ProcAddress(LPCSTR, HMODULE); +extern FARPROC Remap_ComDlg32_ProcAddress(LPCSTR, HMODULE); typedef enum { HOOK_IAT_CANDIDATE = 0, diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index c40269c..05ccd00 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -259,6 +259,42 @@ extern dxwCore dxw; extern dxwSStack dxwss; extern dxwWStack dxwws; +#if 0 +typedef enum { + SYSLIBIDX_VERSION = 0, + SYSLIBIDX_DPLAYX, + SYSLIBIDX_WSOCK, + SYSLIBIDX_SHFOLDER, + SYSLIBIDX_SHELL32, + SYSLIBIDX_WS2_32, + SYSLIBIDX_TAPI32, + SYSLIBIDX_NETAPI32, + SYSLIBIDX_GLIDE, + SYSLIBIDX_GLIDE2X, + SYSLIBIDX_GLIDE3X, +} +enum_skipsyslibraries; + +#ifdef SYSLIBNAMES_DEFINES +char *SkipNames[]={ + "version", + "dplayx", + "wsock32", + "shfolder", + "shell32", + "ws2_32", + "tapi32", + "netapi32", + "glide", + "glide2x", + "glide3x", + NULL +} +#else +extern char *SkipNames[]; +#endif +#endif + typedef enum { SYSLIBIDX_KERNEL32 = 0, SYSLIBIDX_USER32, @@ -275,29 +311,20 @@ typedef enum { SYSLIBIDX_OPENGL, SYSLIBIDX_MSVFW, SYSLIBIDX_SMACK, - SYSLIBIDX_VERSION, - SYSLIBIDX_DPLAYX, SYSLIBIDX_DSOUND, SYSLIBIDX_WINMM, SYSLIBIDX_IMM32, - SYSLIBIDX_WSOCK, SYSLIBIDX_DINPUT, SYSLIBIDX_DINPUT8, - SYSLIBIDX_SHFOLDER, - SYSLIBIDX_SHELL32, - SYSLIBIDX_WS2_32, - SYSLIBIDX_TAPI32, - SYSLIBIDX_NETAPI32, SYSLIBIDX_WINTRUST, SYSLIBIDX_DIRECT3D, SYSLIBIDX_DIRECT3D700, -// SYSLIBIDX_DBGHELP, SYSLIBIDX_IMAGEHLP, -// SYSLIBIDX_GLIDE, -// SYSLIBIDX_GLIDE2X, -// SYSLIBIDX_GLIDE3X, SYSLIBIDX_COMDLG32, - SYSLIBIDX_MAX } + SYSLIBIDX_COMCTL32, + SYSLIBIDX_AVIFIL32, + SYSLIBIDX_MAX +} enum_syslibraries; #ifdef SYSLIBNAMES_DEFINES @@ -317,27 +344,18 @@ char *SysNames[]={ "opengl32", "msvfw32", "smackw32", - "version", - "dplayx", "dsound", "winmm", "imm32", - "wsock32", "dinput", "dinput8", - "shfolder", - "shell32", - "ws2_32", - "tapi32", - "netapi32", "wintrust", "d3dim", "d3dim700", "imagehlp", -// "+glide", -// "+glide2x", -// "+glide3x", "comdlg32", + "comctl32", + "AVIFIL32", NULL }; #else diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 77bb028..6bbb8ad 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.03.70" +#define VERSION "2.03.72" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index b1a7d62..e5886d3 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index a1c9194..8ff50c9 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -237,6 +237,10 @@ RelativePath=".\avifile.cpp" > + + diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 5ad0162..b604ea5 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -128,6 +128,9 @@ BOOL WINAPI extPolyPolygon(HDC, const POINT *, const INT *, int); //typedef BOOL (WINAPI *DPtoLP_Type)(HDC, LPPOINT, int); //DPtoLP_Type pDPtoLP = NULL; //BOOL WINAPI extDPtoLP(HDC, LPPOINT, int); +typedef BOOL (WINAPI *PlayEnhMetaFile_Type)(HDC, HENHMETAFILE, const RECT *); +PlayEnhMetaFile_Type pPlayEnhMetaFile = NULL; +BOOL WINAPI extPlayEnhMetaFile(HDC, HENHMETAFILE, const RECT *); static HookEntryEx_Type Hooks[]={ @@ -168,6 +171,7 @@ static HookEntryEx_Type RemapHooks[]={ //{HOOK_IAT_CANDIDATE, 0, "GetRegionData", (FARPROC)NULL, (FARPROC *)&pGetRegionData, (FARPROC)extGetRegionData}, {HOOK_IAT_CANDIDATE, 0, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extGDICreateCompatibleDC}, /* to check */ //TODO {HOOK_IAT_CANDIDATE, 0, "DrawEscape", (FARPROC)DrawEscape, (FARPROC *)&pDrawEscape, (FARPROC)extDrawEscape}, /* to check */ + {HOOK_IAT_CANDIDATE, 0, "GetDCOrgEx", (FARPROC)GetDCOrgEx, (FARPROC *)&pGetDCOrgEx, (FARPROC)extGetDCOrgEx}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -226,6 +230,9 @@ static HookEntryEx_Type SyscallHooks[]={ {HOOK_IAT_CANDIDATE, 0, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC}, // for tracing only! {HOOK_IAT_CANDIDATE, 0, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDCA, (FARPROC)extGDICreateDCA}, {HOOK_IAT_CANDIDATE, 0, "CreateDCW", (FARPROC)CreateDCW, (FARPROC *)&pGDICreateDCW, (FARPROC)extGDICreateDCW}, + + {HOOK_IAT_CANDIDATE, 0, "PlayEnhMetaFile", (FARPROC)PlayEnhMetaFile, (FARPROC *)&pPlayEnhMetaFile, (FARPROC)extPlayEnhMetaFile}, + // CreateDCW ..... {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -3312,3 +3319,23 @@ BOOL WINAPI extDPtoLP(HDC hdc, LPPOINT lpPoints, int nCount) return ret; } #endif + +BOOL WINAPI extPlayEnhMetaFile(HDC hdc, HENHMETAFILE hemf, const RECT *lpRect) +{ + BOOL ret; + MessageBox(0, "PlayEnhMetaFile", "dxwnd", MB_OK); + ret = pPlayEnhMetaFile(hdc, hemf, lpRect); + return ret; +} + +BOOL WINAPI extGetDCOrgEx(HDC hdc, LPPOINT lpPoint) +{ + BOOL ret; + ret = pGetDCOrgEx(hdc, lpPoint); + OutTraceDW("GetDCOrgEx: hdc=%x pt=(%d,%d)\n", hdc, lpPoint->x, lpPoint->y); + if(ret && dxw.IsFullScreen()){ // ?? and dxw.isDesktop() ??? + dxw.UnmapClient(lpPoint); + OutTraceDW("GetDCOrgEx: fixed pt=(%d,%d)\n", lpPoint->x, lpPoint->y); + } + return ret; +} diff --git a/dll/glhook.h b/dll/glhook.h index 82b1efc..85beb8c 100644 --- a/dll/glhook.h +++ b/dll/glhook.h @@ -1,6 +1,6 @@ #include "gl.h" -extern void HookOpenGLLibs(HMODULE, char *); +extern void HookOpenGL(HMODULE, char *); typedef GLenum (WINAPI *glGetError_Type)(); typedef void (WINAPI *glViewport_Type)(GLint, GLint, GLsizei, GLsizei); diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 42cc126..dcdd5b5 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -31,6 +31,7 @@ typedef void* (WINAPI *Direct3DCreate9_Type)(UINT); typedef HRESULT (WINAPI *Direct3DCreate9Ex_Type)(UINT, IDirect3D9Ex **); typedef HRESULT (WINAPI *CheckFullScreen_Type)(void); typedef BOOL (WINAPI * DisableD3DSpy_Type)(void); +typedef void (WINAPI * D3DPERF_SetOptions_Type)(DWORD); void* WINAPI extDirect3DCreate8(UINT); void* WINAPI extDirect3DCreate9(UINT); @@ -41,12 +42,14 @@ void WINAPI voidDebugSetLevel(void); void WINAPI voidDebugSetMute(void); BOOL WINAPI voidDisableD3DSpy(void); BOOL WINAPI extDisableD3DSpy(void); +void WINAPI extD3DPERF_SetOptions(DWORD); Direct3DCreate8_Type pDirect3DCreate8 = 0; Direct3DCreate9_Type pDirect3DCreate9 = 0; Direct3DCreate9Ex_Type pDirect3DCreate9Ex = 0; CheckFullScreen_Type pCheckFullScreen = 0; DisableD3DSpy_Type pDisableD3DSpy = 0; +D3DPERF_SetOptions_Type pD3DPERF_SetOptions = 0; // IDirect3D8/9 methods @@ -294,6 +297,7 @@ static HookEntryEx_Type d3d9Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "Direct3DCreate9Ex", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9Ex, (FARPROC)extDirect3DCreate9Ex}, {HOOK_HOT_CANDIDATE, 0, "CheckFullScreen", (FARPROC)NULL, (FARPROC *)&pCheckFullScreen, (FARPROC)extCheckFullScreen}, {HOOK_HOT_CANDIDATE, 0, "DisableD3DSpy", (FARPROC)NULL, (FARPROC *)&pDisableD3DSpy, (FARPROC)extDisableD3DSpy}, + {HOOK_HOT_CANDIDATE, 0, "D3DPERF_SetOptions", (FARPROC)NULL, (FARPROC *)&pD3DPERF_SetOptions, (FARPROC)extD3DPERF_SetOptions}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -1083,12 +1087,12 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi } res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); if(res){ - OutTraceD3D("switching to mode=%x\n", mode.Format); + OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format); param[2] = mode.Format; // first attempt: current screen mode res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } if(res){ - OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n"); + OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res); param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } @@ -1106,19 +1110,19 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi } res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); if(res){ - OutTraceD3D("switching to mode=%x\n", mode.Format); + OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format); param[2] = mode.Format; // first attempt: current screen mode res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } if(res){ - OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n"); + OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res); param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } } if(res){ - OutTraceD3D("FAILED! %x\n", res); + OutTraceD3D("FAILED! err=%x\n", res); return res; } OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd); @@ -1216,21 +1220,26 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp param[8] = 1; //Windowed param[12] = 0; //FullScreen_RefreshRateInHz; param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + // from MSDN: + // The display mode for when the device is set to fullscreen. See D3DDISPLAYMODEEX. + // If BehaviorFlags specifies D3DCREATE_ADAPTERGROUP_DEVICE, this parameter is an array. + // This parameter must be NULL for windowed mode. + pFullscreenDisplayMode = NULL; } res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); if(res){ - OutTraceD3D("switching to mode=%x\n", mode.Format); + OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format); param[2] = mode.Format; // first attempt: current screen mode res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); } if(res){ - OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n"); + OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res); param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); } if(res){ - OutTraceD3D("FAILED! %x\n", res); + OutTraceD3D("FAILED! err=%x\n", res); return res; } OutTraceD3D("SUCCESS!\n"); @@ -2244,6 +2253,12 @@ HRESULT WINAPI extUnlockRect8(void *lpd3dtex, UINT Level) HRESULT WINAPI extUnlockRect9(void *lpd3dtex, UINT Level) { return extUnlockRect(pUnlockRect9, lpd3dtex, Level, D3D9TextureHandling); } +void WINAPI extD3DPERF_SetOptions(DWORD dwOptions) +{ + if(dwOptions) OutTraceD3D("circumvent D3DPERF_SetOptions\n"); + pD3DPERF_SetOptions(0); +} + void RestoreD3DSurfaces(BOOL bFullScreen) { //DWORD param[64]; diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index f32a60d..c3b5075 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -257,15 +257,18 @@ typedef HRESULT (WINAPI *TexLoad_Type)(void *, LPDIRECT3DTEXTURE); typedef HRESULT (WINAPI *TexUnload_Type)(void *); TexInitialize_Type pTInitialize = NULL; -TexGetHandle_Type pTGetHandle = NULL; -TexPaletteChanged_Type pTPaletteChanged = NULL; -TexLoad_Type pTLoad = NULL; +TexGetHandle_Type pTGetHandle1, pTGetHandle2; +TexPaletteChanged_Type pTPaletteChanged1, pTPaletteChanged2; +TexLoad_Type pTLoad1, pTLoad2; TexUnload_Type pTUnload = NULL; HRESULT WINAPI extTexInitialize(void *, LPDIRECT3DDEVICE, LPDIRECTDRAWSURFACE); -HRESULT WINAPI extTexGetHandle(void *, LPDIRECT3DDEVICE, LPD3DTEXTUREHANDLE); -HRESULT WINAPI extTexPaletteChanged(void *, DWORD, DWORD); -HRESULT WINAPI extTexLoad(void *, LPDIRECT3DTEXTURE); +HRESULT WINAPI extTexGetHandle1(void *, LPDIRECT3DDEVICE, LPD3DTEXTUREHANDLE); +HRESULT WINAPI extTexGetHandle2(void *, LPDIRECT3DDEVICE2, LPD3DTEXTUREHANDLE); +HRESULT WINAPI extTexPaletteChanged1(void *, DWORD, DWORD); +HRESULT WINAPI extTexPaletteChanged2(void *, DWORD, DWORD); +HRESULT WINAPI extTexLoad1(void *, LPDIRECT3DTEXTURE); +HRESULT WINAPI extTexLoad2(void *, LPDIRECT3DTEXTURE); HRESULT WINAPI extTexUnload(void *); extern char *ExplainDDError(DWORD); @@ -634,15 +637,15 @@ void HookTexture(LPVOID *lpTexture, int version) switch(version){ case 1: SetHook((void *)(**(DWORD **)lpTexture + 12), extTexInitialize, (void **)&pTInitialize, "Initialize(T1)"); - SetHook((void *)(**(DWORD **)lpTexture + 16), extTexGetHandle, (void **)&pTGetHandle, "GetHandle(T1)"); - SetHook((void *)(**(DWORD **)lpTexture + 20), extTexPaletteChanged, (void **)&pTPaletteChanged, "PaletteChanged(T1)"); - SetHook((void *)(**(DWORD **)lpTexture + 24), extTexLoad, (void **)&pTLoad, "Load(T1)"); + SetHook((void *)(**(DWORD **)lpTexture + 16), extTexGetHandle1, (void **)&pTGetHandle1, "GetHandle(T1)"); + SetHook((void *)(**(DWORD **)lpTexture + 20), extTexPaletteChanged1, (void **)&pTPaletteChanged1, "PaletteChanged(T1)"); + SetHook((void *)(**(DWORD **)lpTexture + 24), extTexLoad1, (void **)&pTLoad1, "Load(T1)"); SetHook((void *)(**(DWORD **)lpTexture + 28), extTexUnload, (void **)&pTUnload, "Unload(T1)"); break; case 2: - SetHook((void *)(**(DWORD **)lpTexture + 12), extTexGetHandle, (void **)&pTGetHandle, "GetHandle(T2)"); - SetHook((void *)(**(DWORD **)lpTexture + 16), extTexPaletteChanged, (void **)&pTPaletteChanged, "PaletteChanged(T2)"); - SetHook((void *)(**(DWORD **)lpTexture + 20), extTexLoad, (void **)&pTLoad, "Load(T2)"); + SetHook((void *)(**(DWORD **)lpTexture + 12), extTexGetHandle2, (void **)&pTGetHandle2, "GetHandle(T2)"); + SetHook((void *)(**(DWORD **)lpTexture + 16), extTexPaletteChanged2, (void **)&pTPaletteChanged2, "PaletteChanged(T2)"); + SetHook((void *)(**(DWORD **)lpTexture + 20), extTexLoad2, (void **)&pTLoad2, "Load(T2)"); break; } } @@ -1590,7 +1593,7 @@ HRESULT WINAPI extTexInitialize(void *t, LPDIRECT3DDEVICE lpd3dd, LPDIRECTDRAWSU return (*pTInitialize)(t, lpd3dd, lpdds); } -HRESULT WINAPI extTexGetHandle(void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHANDLE lpth) +HRESULT WINAPI extTexGetHandle(TexGetHandle_Type pTGetHandle, void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHANDLE lpth) { HRESULT ret; OutTrace("Texture::GetHandle lpt=%x lpd3dd=%x lpth=%x\n", t, lpd3dd, lpth); @@ -1599,7 +1602,13 @@ HRESULT WINAPI extTexGetHandle(void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHAN return ret; } -HRESULT WINAPI extTexPaletteChanged(void *t, DWORD dw1, DWORD dw2) +HRESULT WINAPI extTexGetHandle1(void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHANDLE lpth) +{ return extTexGetHandle(pTGetHandle1, t, lpd3dd, lpth); } +HRESULT WINAPI extTexGetHandle2(void *t, LPDIRECT3DDEVICE2 lpd3dd, LPD3DTEXTUREHANDLE lpth) +{ return extTexGetHandle(pTGetHandle2, t, (LPDIRECT3DDEVICE)lpd3dd, lpth); } + + +HRESULT WINAPI extTexPaletteChanged(TexPaletteChanged_Type pTPaletteChanged, void *t, DWORD dw1, DWORD dw2) { HRESULT ret; OutTrace("Texture::PaletteChanged lpt=%x dw1=%x dw2=%x\n", t, dw1, dw2); @@ -1608,7 +1617,12 @@ HRESULT WINAPI extTexPaletteChanged(void *t, DWORD dw1, DWORD dw2) return ret; } -HRESULT WINAPI extTexLoad(void *t, LPDIRECT3DTEXTURE lpt) +HRESULT WINAPI extTexPaletteChanged1(void *t, DWORD dw1, DWORD dw2) +{ return extTexPaletteChanged(pTPaletteChanged1, t, dw1, dw2); } +HRESULT WINAPI extTexPaletteChanged2(void *t, DWORD dw1, DWORD dw2) +{ return extTexPaletteChanged(pTPaletteChanged2, t, dw1, dw2); } + +HRESULT WINAPI extTexLoad(TexLoad_Type pTLoad, void *t, LPDIRECT3DTEXTURE lpt) { HRESULT ret; OutTrace("Texture::Load lpt=%x lpd3dt=%x\n", t, lpt); @@ -1617,6 +1631,11 @@ HRESULT WINAPI extTexLoad(void *t, LPDIRECT3DTEXTURE lpt) return ret; } +HRESULT WINAPI extTexLoad1(void *t, LPDIRECT3DTEXTURE lpt) +{ return extTexLoad(pTLoad1, t, lpt); } +HRESULT WINAPI extTexLoad2(void *t, LPDIRECT3DTEXTURE lpt) +{ return extTexLoad(pTLoad2, t, lpt); } + HRESULT WINAPI extTexUnload(void *t) { HRESULT ret; diff --git a/dll/imelib.cpp b/dll/imelib.cpp index 9888fa3..22f7a33 100644 --- a/dll/imelib.cpp +++ b/dll/imelib.cpp @@ -23,12 +23,14 @@ static HookEntryEx_Type Hooks[]={ void HookImeLib(HMODULE module) { + if(!(dxw.dwFlags2 & SUPPRESSIME)) return; HookLibraryEx(module, Hooks, "IMM32.dll"); } FARPROC Remap_ImeLib_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; + if(!(dxw.dwFlags2 & SUPPRESSIME)) return NULL; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; return NULL; } diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 88110b6..ac2ece1 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -591,6 +591,9 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) if((DWORD)proc & 0xFFFF0000){ FARPROC remap; switch(idx){ + case SYSLIBIDX_AVIFIL32: + if (remap=Remap_AVIFil32_ProcAddress(proc, hModule)) return remap; + break; case SYSLIBIDX_DIRECTDRAW: if (remap=Remap_ddraw_ProcAddress(proc, hModule)) return remap; break; @@ -630,11 +633,6 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) case SYSLIBIDX_OPENGL: if(dxw.Windowize) if (remap=Remap_gl_ProcAddress(proc, hModule)) return remap; break; -// case SYSLIBIDX_GLIDE: -// case SYSLIBIDX_GLIDE2X: -// case SYSLIBIDX_GLIDE3X: -// if (remap=Remap_Glide_ProcAddress(proc, hModule)) return remap; -// break; case SYSLIBIDX_MSVFW: if (remap=Remap_vfw_ProcAddress(proc, hModule)) return remap; break; @@ -662,6 +660,12 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) case SYSLIBIDX_DINPUT8: if (remap=Remap_DInput8_ProcAddress(proc, hModule)) return remap; break; + case SYSLIBIDX_COMCTL32: + if (remap=Remap_ComCtl32_ProcAddress(proc, hModule)) return remap; + break; + case SYSLIBIDX_COMDLG32: + if (remap=Remap_ComDlg32_ProcAddress(proc, hModule)) return remap; + break; default: break; } diff --git a/dll/opengl.cpp b/dll/opengl.cpp index 2cb4f76..cba996d 100644 --- a/dll/opengl.cpp +++ b/dll/opengl.cpp @@ -55,6 +55,7 @@ PROC Remap_wgl_ProcAddress(LPCSTR proc) { int i; HookEntryEx_Type *Hook; + if(!(dxw.dwFlags2 & HOOKOPENGL)) return NULL; for(i=0; Hooks[i].APIName; i++){ Hook=&Hooks[i]; if (!strcmp(proc,Hook->APIName)){ @@ -97,22 +98,19 @@ void ForceHookOpenGL(HMODULE base) // to do ..... return; } -void HookOpenGL(HMODULE module, char *customlib) +void HookOpenGL(HMODULE module, char *customlib) { - HookLibraryEx(module, Hooks, customlib); -} + if(!(dxw.dwFlags2 & HOOKOPENGL)) return; -void HookOpenGLLibs(HMODULE module, char *customlib) -{ char *DefOpenGLModule="OpenGL32.dll"; if (!customlib) customlib=DefOpenGLModule; - OutTraceDW("HookOpenGLLibs module=%x lib=\"%s\" forced=%x\n", module, customlib, (dxw.dwFlags3 & FORCEHOOKOPENGL)?1:0); + OutTraceDW("HookOpenGL module=%x lib=\"%s\" forced=%x\n", module, customlib, (dxw.dwFlags3 & FORCEHOOKOPENGL)?1:0); if (dxw.dwFlags3 & FORCEHOOKOPENGL) ForceHookOpenGL(module); else - HookOpenGL(module, customlib); + HookLibraryEx(module, Hooks, customlib); return; } diff --git a/dll/shareddc.cpp b/dll/shareddc.cpp index a479ec2..aedede8 100644 --- a/dll/shareddc.cpp +++ b/dll/shareddc.cpp @@ -185,8 +185,8 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc) POINT origin = {}; POINT mainwin = {}; - GetDCOrgEx(hdc, &origin); - GetDCOrgEx((*pGDIGetDC)(dxw.GethWnd()), &mainwin); + (*pGetDCOrgEx)(hdc, &origin); + (*pGetDCOrgEx)((*pGDIGetDC)(dxw.GethWnd()), &mainwin); origin.x -= mainwin.x; origin.y -= mainwin.y; OutTraceB("dxwSDC::GetPrimaryDC: origin=(%d,%d)\n", origin.x, origin.y); @@ -398,7 +398,7 @@ void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT origin) //(*pClientToScreen)(dxw.GethWnd(), &upleft); (*pClientToScreen)(CurrenthWnd, &upleft); if(IsDebug){ - OutTraceB("dxwSDC::setClippingRegion: upleft=(%d,%d)\n", upleft.x, upleft.y); + OutTraceB("dxwSDC::setClippingRegion: hwnd=%x upleft=(%d,%d)\n", CurrenthWnd, upleft.x, upleft.y); } OffsetRgn(clipRgn, -upleft.x, -upleft.y); if(IsDebug){ diff --git a/dll/smack.cpp b/dll/smack.cpp index 5f09831..7ac6e8b 100644 --- a/dll/smack.cpp +++ b/dll/smack.cpp @@ -30,6 +30,7 @@ static HookEntryEx_Type Hooks[]={ FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; + if(!(dxw.dwFlags7 & HOOKSMACKW32)) return NULL; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; // NULL -> keep the original call address return NULL; @@ -39,6 +40,7 @@ static char *libname = "smackw32.dll"; void HookSmackW32(HMODULE hModule) { + if(!(dxw.dwFlags7 & HOOKSMACKW32)) return; HookLibraryEx(hModule, Hooks, libname); return; } diff --git a/dll/syslibs.h b/dll/syslibs.h index 997f5fa..bf82c4b 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -49,6 +49,7 @@ typedef BOOL (WINAPI *DeleteDC_Type)(HDC); typedef BOOL (WINAPI *ExtTextOutW_Type)(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); typedef BOOL (WINAPI *ExtTextOutA_Type)(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *); typedef int (WINAPI *GetClipBox_Type)(HDC, LPRECT); +typedef BOOL (WINAPI *GetDCOrgEx_Type)(HDC, LPPOINT); typedef int (WINAPI *GetRgnBox_Type)(HRGN, LPRECT); typedef DWORD (WINAPI *GetRegionData_Type)(HRGN, DWORD, LPRGNDATA); typedef int (WINAPI *GetDeviceCaps_Type)(HDC, int); @@ -285,6 +286,7 @@ DXWEXTERN ExtTextOutA_Type pExtTextOutA DXWINITIALIZED; DXWEXTERN GetClipBox_Type pGDIGetClipBox DXWINITIALIZED; DXWEXTERN GetRgnBox_Type pGetRgnBox DXWINITIALIZED; DXWEXTERN GetRegionData_Type pGetRegionData DXWINITIALIZED; +DXWEXTERN GetDCOrgEx_Type pGetDCOrgEx DXWINITIALIZED; DXWEXTERN GetDeviceCaps_Type pGDIGetDeviceCaps DXWINITIALIZED; DXWEXTERN GetDeviceGammaRamp_Type pGDIGetDeviceGammaRamp DXWINITIALIZED; DXWEXTERN GetSystemPaletteEntries_Type pGDIGetSystemPaletteEntries DXWINITIALIZED; @@ -513,6 +515,7 @@ extern BOOL WINAPI extExtTextOutW(HDC, int, int, UINT, const RECT *, LPCWSTR, UI extern BOOL WINAPI extExtTextOutA(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *); extern BOOL WINAPI extGDIDeleteDC(HDC); extern int WINAPI extGetClipBox(HDC, LPRECT); +extern BOOL WINAPI extGetDCOrgEx(HDC, LPPOINT); extern int WINAPI extGetRgnBox(HRGN, LPRECT); extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA); extern int WINAPI extGetDeviceCaps(HDC, int); diff --git a/host/dxwnd.ini b/host/dxwnd.ini deleted file mode 100644 index 7f729a0..0000000 --- a/host/dxwnd.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window] -posx=50 -posy=50 -sizx=320 -sizy=200 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 93a3e43..481ac1a 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ