From 4ebc06ad719d9bfd42c5c5f2d33b711b2d7af4c2 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 22 Jan 2017 11:49:46 -0500 Subject: [PATCH] v2_04_07_src_fx1 Former-commit-id: 82828630775664a91be4eb87cb7dfea0f73601b2 --- build/dxwnd.dll | 4 +- build/exports/Wizardry Chronicles.dxw | 4 +- build/exports/dxwnd.log | 228 +++++++++++++++++++- build/readme-relnotes.txt | 5 + dll/ddraw.cpp | 289 ++------------------------ dll/ddtexture.cpp | 6 +- dll/dxwcore.cpp | 18 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 606208 -> 639186 bytes dll/dxwnd.vs2008.vcproj | 4 + dll/hd3d7.cpp | 123 ++--------- dll/queryint.cpp | 226 ++++++++++++++++++++ 12 files changed, 505 insertions(+), 404 deletions(-) create mode 100644 dll/queryint.cpp diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 5869122..9bb1960 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a035cc2206b5dcd8fed40fafdef29abe8b54f47acfbceb0568cd7d09f17be7d8 -size 782848 +oid sha256:03d7a189e3b95c69545b045eeef01fffafe7178f6c0892f1fa1d61eb810faa5c +size 780800 diff --git a/build/exports/Wizardry Chronicles.dxw b/build/exports/Wizardry Chronicles.dxw index fa9d3c3..f25636c 100644 --- a/build/exports/Wizardry Chronicles.dxw +++ b/build/exports/Wizardry Chronicles.dxw @@ -1,6 +1,6 @@ [target] -title0=Wizardry Chronicles -path0=D:\Games\Wizardry Chronicle\Wiz.exe +title0=Wizardry Chronicles.exe +path0=F:\Games\Wizardry Chronicle\Wizardry Chronicles.exe startfolder0= launchpath0= module0= diff --git a/build/exports/dxwnd.log b/build/exports/dxwnd.log index 0bc5ed2..b9701b9 100644 --- a/build/exports/dxwnd.log +++ b/build/exports/dxwnd.log @@ -1,4 +1,228 @@ -OnRun idx=6 prog="D:\Games\Tomb Raider III\tomb3.exe" +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 setwindowshook mode -OnRun idx=6 prog="D:\Games\Tomb Raider III\tomb3.exe" +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=7 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=7 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe.noshim" dir="F:\RhemE\RhemE" +Target handle=67c +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe.noshim" dir="F:\RhemE\RhemE" +Target handle=908 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +debugger mode +create process: path="F:\RhemE\RhemE" +create process: base=0x20000000 path="F:\RhemE\RhemE\RHEM1(scalable).exe" +create thread: th=0xA18 base=0x2F1000 start=0x76C68500 +load dll: base=0x77BD0000 path="C:\Windows\SysWOW64\ntdll.dll" +unload dll: base=0x540000 +load dll: base=0x76C40000 path="C:\Windows\SysWOW64\kernel32.dll" +unload dll: base=0x76C40000 +unload dll: base=0x540000 +unload dll: base=0x6A0000 +load dll: base=0x76C40000 path="C:\Windows\SysWOW64\kernel32.dll" +load dll: base=0x74830000 path="C:\Windows\SysWOW64\KernelBase.dll" +load dll: base=0x6E490000 path="C:\Windows\SysWOW64\apphelp.dll" +load dll: base=0x78E50000 path="C:\Windows\AppPatch\AcLayers.dll" +load dll: base=0x773E0000 path="C:\Windows\SysWOW64\msvcrt.dll" +load dll: base=0x74C00000 path="C:\Windows\SysWOW64\user32.dll" +load dll: base=0x774A0000 path="C:\Windows\SysWOW64\win32u.dll" +load dll: base=0x75600000 path="C:\Windows\SysWOW64\gdi32.dll" +load dll: base=0x75450000 path="C:\Windows\SysWOW64\gdi32full.dll" +load dll: base=0x75850000 path="C:\Windows\SysWOW64\shell32.dll" +load dll: base=0x75800000 path="C:\Windows\SysWOW64\cfgmgr32.dll" +load dll: base=0x76DD0000 path="C:\Windows\SysWOW64\windows.storage.dll" +load dll: base=0x749E0000 path="C:\Windows\SysWOW64\combase.dll" +load dll: base=0x75630000 path="C:\Windows\SysWOW64\ucrtbase.dll" +load dll: base=0x75300000 path="C:\Windows\SysWOW64\rpcrt4.dll" +load dll: base=0x74690000 path="C:\Windows\SysWOW64\sspicli.dll" +load dll: base=0x74680000 path="C:\Windows\SysWOW64\cryptbase.dll" +load dll: base=0x76D70000 path="C:\Windows\SysWOW64\bcryptprimitives.dll" +load dll: base=0x77980000 path="C:\Windows\SysWOW64\sechost.dll" +load dll: base=0x777F0000 path="C:\Windows\SysWOW64\powrprof.dll" +load dll: base=0x779D0000 path="C:\Windows\SysWOW64\advapi32.dll" +load dll: base=0x76D20000 path="C:\Windows\SysWOW64\shlwapi.dll" +load dll: base=0x77BC0000 path="C:\Windows\SysWOW64\kernel.appcore.dll" +load dll: base=0x776F0000 path="C:\Windows\SysWOW64\SHCore.dll" +load dll: base=0x773A0000 path="C:\Windows\SysWOW64\profapi.dll" +load dll: base=0x77650000 path="C:\Windows\SysWOW64\oleaut32.dll" +load dll: base=0x74D60000 path="C:\Windows\SysWOW64\msvcp_win.dll" +load dll: base=0x74E40000 path="C:\Windows\SysWOW64\setupapi.dll" +load dll: base=0x74000000 path="C:\Windows\SysWOW64\mpr.dll" +load dll: base=0x66680000 path="C:\Windows\SysWOW64\sfc.dll" +load dll: base=0x73930000 path="C:\Windows\SysWOW64\winspool.drv" +load dll: base=0x72FA0000 path="C:\Windows\SysWOW64\bcrypt.dll" +load dll: base=0x640C0000 path="C:\Windows\SysWOW64\sfc_os.dll" +output debug: len=115 unicode=0 +output debug: len=115 unicode=0 +load dll: base=0x67100000 path="C:\Windows\SysWOW64\SortServer2003Compat.dll" +load dll: base=0x773B0000 path="C:\Windows\SysWOW64\imm32.dll" +exception: code=0x80000003(Breakpoint) addr=0x77C7748C first=1 +exit thread: exitcode=0x0 +load dll: base=0x10000000 path="C:\Users\user\AppData\Local\Temp\TempFolder.aad\proj.dll" +create thread: th=0x414 base=0x2F4000 start=0x77C067C0 +create thread: th=0x670 base=0x2F7000 start=0x77C067C0 +load dll: base=0x69000000 path="C:\Users\user\AppData\Local\Temp\TempFolder.aad\iml32.dll" +load dll: base=0x774C0000 path="C:\Windows\SysWOW64\comdlg32.dll" +create thread: th=0x670 base=0x2FA000 start=0x77C067C0 +load dll: base=0x72DE0000 path="C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.14393.447_none_5507ded2cb4f7f4c\comctl32.dll" +load dll: base=0x75710000 path="C:\Windows\SysWOW64\ole32.dll" +load dll: base=0x68000000 path="C:\Users\user\AppData\Local\Temp\TempFolder.aad\dirapi.dll" +load dll: base=0x73050000 path="C:\Windows\SysWOW64\winmm.dll" +load dll: base=0x740F0000 path="C:\Windows\SysWOW64\version.dll" +load dll: base=0x72F70000 path="C:\Windows\SysWOW64\winmmbase.dll" +load dll: base=0x720000 path="C:\Windows\SysWOW64\winmmbase.dll" +load dll: base=0x2180000 path="C:\Windows\SysWOW64\winmmbase.dll" +unload dll: base=0x72F70000 +unload dll: base=0x720000 +load dll: base=0x6C670000 path="C:\Windows\SysWOW64\uxtheme.dll" +create thread: th=0x414 base=0x2FD000 start=0x78E7C3C0 +load dll: base=0x77840000 path="C:\Windows\SysWOW64\msctf.dll" +load dll: base=0x92E0000 path="D:\DxWnd.develop\v2_04_07_beta\Release\dxwnd.dll" +create thread: th=0xC88 base=0x300000 start=0x73953B70 +load dll: base=0x64080000 path="C:\Windows\SysWOW64\msvfw32.dll" +load dll: base=0x755B0000 path="C:\Windows\SysWOW64\wintrust.dll" +load dll: base=0x9400000 path="C:\Windows\SysWOW64\msasn1.dll" +load dll: base=0x746B0000 path="C:\Windows\SysWOW64\crypt32.dll" +load dll: base=0x64590000 path="C:\Windows\SysWOW64\avifil32.dll" +load dll: base=0x72FD0000 path="C:\Windows\SysWOW64\msacm32.dll" +exit thread: exitcode=0x1 +exit thread: exitcode=0x1 +exit thread: exitcode=0x1 +exit thread: exitcode=0x1 +exit thread: exitcode=0x1 +exit process +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=6 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe" dir="F:\RhemE\RhemE" +Target handle=888 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe" dir="F:\RhemE\RhemE" +Target handle=828 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe" dir="F:\RhemE\RhemE" +Target handle=a04 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe" dir="F:\RhemE\RhemE" +Target handle=6bc +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe" dir="F:\RhemE\RhemE" +Target handle=878 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM1(scalable).exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM1(scalable).exe" dir="F:\RhemE\RhemE" +Target handle=86c +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM.noshim.exe" dir="F:\RhemE\RhemE" +Target handle=8a0 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +self elevation +injectsuspended mode +InjectSuspended: exe="F:\RhemE\RhemE\RHEM.noshim.exe" dir="F:\RhemE\RhemE" +Target handle=cb0 +NT Header offset=E8 +AddressOfEntryPoint=3D84 ImageBase=20000000 +Thread start address=20003d84 +wait cycle 0 eip=20003d84 +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +self elevation +setwindowshook mode +OnRun idx=8 prog="F:\RhemE\RhemE\RHEM.noshim.exe" unhooked=0 +self elevation setwindowshook mode diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index c8f014a..f224a5c 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1469,3 +1469,8 @@ fix: log messages for CloseHandle wrapper fix: log messages for GetPixel wrapper fix: window position in MoveWindow for ANCHORED mode and big windows fix: DialogBoxParamA wrapper + +v2.04.07 +fix: QueryInterface wrapper for ddraw classes unified in a single procedure. +fix: D3D2 SwapTextureHandles hook fix - fixes "Wizardry Chronicle" texture problems +fix: string overflow in TextureHack procedure for D3D1-7 textures \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index d7822d0..58fd01d 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -32,6 +32,7 @@ extern BOOL IsChangeDisplaySettingsHotPatched; extern void TextureHandling(LPDIRECTDRAWSURFACE, int); extern void SetMinimalCaps(int, LPDDCAPS, LPDDCAPS); ColorConversion_Type pColorConversion = NULL; +extern HRESULT WINAPI extQueryInterfaceDX(int, QueryInterface_Type, void *, REFIID, LPVOID *); HDC hFlippedDC = NULL; BOOL bFlippedDC = FALSE; @@ -1449,7 +1450,7 @@ void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPrim) } -static void HookGammaControl(LPVOID *obp) +void HookGammaControl(LPVOID *obp) { // IDirectDrawGammaControl::GetGammaRamp SetHook((void *)(**(DWORD **)obp + 12), extDDGetGammaRamp, (void **)&pDDGetGammaRamp, "GetGammaRamp(G)"); @@ -1926,293 +1927,27 @@ HRESULT WINAPI extGetScanLine4(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) HRESULT WINAPI extGetScanLine7(LPDIRECTDRAW lpdd, LPDWORD lpdwScanLine) { return extGetScanLine(7, pGetScanLine7, lpdd, lpdwScanLine); } -static HRESULT WINAPI extQueryInterfaceD(int dxversion, QueryInterface_Type pQueryInterfaceD, void *lpdd, REFIID riid, LPVOID *obp) -{ - HRESULT res; - unsigned int dwLocalDDVersion; - unsigned int dwLocalD3DVersion; - - res = (*pQueryInterfaceD)(lpdd, riid, obp); - OutTraceDDRAW("QueryInterface(D%d): lpdd=%x REFIID=%x(%s) obp=%x ret=%x at %d\n", - dxversion, lpdd, riid.Data1, ExplainGUID((GUID *)&riid), *obp, res, __LINE__); - - if(res) { - OutTraceE("QueryInterface(D) ERROR: res=%x(%s)\n", res, ExplainDDError(res)); - return res; - } - - dwLocalDDVersion=0; - dwLocalD3DVersion=0; - switch(riid.Data1){ - case 0x6C14DB80: //DirectDraw1 - dwLocalDDVersion = 1; - break; - case 0xB3A6F3E0: //DirectDraw2 - dwLocalDDVersion = 2; - break; - case 0x618f8ad4: //DirectDraw3 - dwLocalDDVersion = 3; - break; - case 0x9c59509a: //DirectDraw4 - dwLocalDDVersion = 4; - break; - case 0x15e65ec0: //DirectDraw7 - dwLocalDDVersion = 7; - break; - case 0x3BBA0080: //Direct3D - dwLocalD3DVersion = 1; - break; - case 0x6aae1ec1: //Direct3D2 - dwLocalD3DVersion = 2; - break; - case 0xbb223240: //Direct3D3 - dwLocalD3DVersion = 3; - break; - case 0xf5049e77: //Direct3D7 - dwLocalD3DVersion = 7; - break; - } - if (! *obp){ - OutTraceDDRAW("QueryInterface(D): Interface for DX version %d not found\n", dwLocalDDVersion); - return(0); - } - if(dwLocalDDVersion) OutTraceDW("QueryInterface(D): Got interface for DX version %d\n", dwLocalDDVersion); - if(dwLocalD3DVersion) OutTraceDW("QueryInterface(D): Got interface for D3D version %d\n", dwLocalD3DVersion); - - if (dwLocalDDVersion > dxw.dwMaxDDVersion) { - *obp = NULL; - OutTraceDW("QueryInterface(D): lpdd=%x REFIID=%x obp=(NULL) ret=%x at %d\n", - lpdd, riid.Data1, res, __LINE__); - return(0); - } - - switch (dwLocalDDVersion){ - case 1: // you never know .... - case 2: - case 3: - case 4: - // it's not supposed to be written for DDVersion==7, but it works .... - case 7: - dxw.dwDDVersion=dwLocalDDVersion; - HookDDSession((LPDIRECTDRAW *)obp, dxw.dwDDVersion); - break; - } - - extern void HookDirect3DSession(LPDIRECTDRAW *, int); - switch (dwLocalD3DVersion){ - case 1: - case 2: - case 3: - case 7: - HookDirect3DSession((LPDIRECTDRAW *)obp, dwLocalD3DVersion); - break; - } - - OutTraceDDRAW("QueryInterface(D): lpdd=%x REFIID=%x obp=%x DDVersion=%d ret=0\n", - lpdd, riid.Data1, *obp, dxw.dwDDVersion); - - return 0; -} - HRESULT WINAPI extQueryInterfaceD1(void *lpdd, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceD(1, pQueryInterfaceD1, lpdd, riid, obp); } +{ return extQueryInterfaceDX(1, pQueryInterfaceD1, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD2(void *lpdd, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceD(2, pQueryInterfaceD2, lpdd, riid, obp); } +{ return extQueryInterfaceDX(2, pQueryInterfaceD2, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD3(void *lpdd, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceD(3, pQueryInterfaceD3, lpdd, riid, obp); } +{ return extQueryInterfaceDX(3, pQueryInterfaceD3, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD4(void *lpdd, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceD(4, pQueryInterfaceD4, lpdd, riid, obp); } +{ return extQueryInterfaceDX(4, pQueryInterfaceD4, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceD7(void *lpdd, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceD(7, pQueryInterfaceD7, lpdd, riid, obp); } - -// some unhandled interfaces in emulation mode: -// REFIID={84e63de0-46aa-11cf-816f-0000c020156e}: IID_IDirect3DHALDevice - -static HRESULT WINAPI extQueryInterfaceS(int dxversion, QueryInterface_Type pQueryInterfaceS, void *lpdds, REFIID riid, LPVOID *obp) -{ - HRESULT res; - BOOL IsPrim; - BOOL IsBack; - BOOL IsGammaRamp; - unsigned int dwLocalDDVersion; - unsigned int dwLocalTexVersion; - unsigned int dwLocalD3DDeviceVersion; - - IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); - IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); - OutTraceDDRAW("QueryInterface(S%d): lpdds=%x%s REFIID=%x(%s)\n", - dxversion, lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); - - IsGammaRamp=FALSE; - - dwLocalDDVersion=0; - dwLocalTexVersion=0; - dwLocalD3DDeviceVersion=0; - switch(riid.Data1){ - case 0x6C14DB81: - dwLocalDDVersion = 1; - break; - case 0x57805885: //DDSurface2 - WIP (Dark Reign) - dwLocalDDVersion = 2; - break; - case 0xDA044E00: //DDSurface3 - dwLocalDDVersion = 3; - break; - case 0x0B2B8630: - dwLocalDDVersion = 4; - break; - case 0x06675a80: - dwLocalDDVersion = 7; - break; - // Direct3DDevice - case 0x84e63de0: - OutTraceDW("QueryInterface: IID_IDirect3DHALDevice\n"); - dwLocalD3DDeviceVersion = 1; - break; - case 0xA4665C60: // IID_IDirect3DRGBDevice - OutTraceDW("QueryInterface: IID_IDirect3DRGBDevice\n"); - dwLocalD3DDeviceVersion = 1; - break; - case 0xF2086B20: // IID_IDirect3DRampDevice - OutTraceDW("QueryInterface: IID_IDirect3DRampDevice\n"); - dwLocalD3DDeviceVersion = 1; - break; - case 0x881949a1: // IID_IDirect3DMMXDevice - OutTraceDW("QueryInterface: IID_IDirect3DMMXDevice\n"); - dwLocalD3DDeviceVersion = 1; - break; - case 0x50936643: // IID_IDirect3DRefDevice - OutTraceDW("QueryInterface: IID_IDirect3DRefDevice\n"); - dwLocalD3DDeviceVersion = 2; - break; - case 0x8767df22: // IID_IDirect3DNullDevice - OutTraceDW("QueryInterface: IID_IDirect3DNullDevice\n"); - dwLocalD3DDeviceVersion = 2; - break; - case 0xf5049e78: // IID_IDirect3DTnLHalDevice, - OutTraceDW("QueryInterface: IID_IDirect3DTnLHalDevice\n"); - dwLocalD3DDeviceVersion = 3; - break; - case 0x64108800: // IID_IDirect3DDevice - OutTraceDW("QueryInterface: IID_IDirect3DDevice\n"); - dwLocalD3DDeviceVersion = 1; - break; - case 0x93281501: // IID_IDirect3DDevice2 - OutTraceDW("QueryInterface: IID_IDirect3DDevice2\n"); - dwLocalD3DDeviceVersion = 2; - break; - case 0xb0ab3b60: // IID_IDirect3DDevice3 - OutTraceDW("QueryInterface: IID_IDirect3DDevice3\n"); - dwLocalD3DDeviceVersion = 3; - break; - case 0xf5049e79: // IID_IDirect3DDevice7 - OutTraceDW("QueryInterface: IID_IDirect3DDevice7\n"); - dwLocalD3DDeviceVersion = 7; - break; - case 0x4B9F0EE0: - OutTraceDW("QueryInterface: IID_IDirectDrawColorControl\n"); - break; - case 0x69C11C3E: - OutTraceDW("QueryInterface: IID_IDirectDrawGammaControl\n"); - IsGammaRamp=TRUE; - break; - // textures - case 0x2CDCD9E0: - OutTraceDW("QueryInterface: IID_IDirect3DTexture\n"); - dwLocalTexVersion = 1; - break; - case 0x93281502: - OutTraceDW("QueryInterface: IID_IDirect3DTexture2\n"); - dwLocalTexVersion = 2; - break; - } - - if (dwLocalDDVersion > dxw.dwMaxDDVersion) { - *obp = NULL; - OutTraceDW("QueryInterface(S): DDVersion=%d SUPPRESS lpdds=%x(%s) REFIID=%x obp=(NULL) ret=0 at %d\n", - dwLocalDDVersion, lpdds, IsPrim?"":"(PRIM)", riid.Data1, __LINE__); - return(0); - } - - // fix the target for gamma ramp creation: if it is a primary surface, use the real one!! - // v2.03.37: do this just when in esurface emulated mode!! - if( IsGammaRamp && - (dxw.dwFlags1 & EMULATESURFACE) && - dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds)) - lpdds = lpDDSEmu_Prim; - - res = (*pQueryInterfaceS)(lpdds, riid, obp); - - if(res) // added trace - { - OutTraceDW("QueryInterface(S): ERROR lpdds=%x%s REFIID=%x obp=%x ret=%x(%s) at %d\n", - lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, res, ExplainDDError(res), __LINE__); - return res; - } - - if (! *obp) { - OutTraceDW("QueryInterface(S): Interface for DX version %d not found\n", dwLocalDDVersion); - return 0; - } - - // added trace - OutTraceDW("QueryInterface(S): lpdds=%x%s REFIID=%x obp=%x DDVersion=%d TexVersion=%d GammaRamp=%d D3DDevice=%d ret=0\n", - lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, dwLocalDDVersion, dwLocalTexVersion, IsGammaRamp, dwLocalD3DDeviceVersion); - - if (dwLocalDDVersion) { - switch (dwLocalDDVersion){ - case 1: // added for The Sims - case 2: - case 3: - case 4: - case 7: - dxw.dwDDVersion=dwLocalDDVersion; - if(IsPrim){ - OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); - dxwss.PushPrimarySurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); - HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, TRUE); - } - else{ - if(IsBack) dxwss.PushBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); - else dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); - // v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition? - HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, FALSE); - } - DWORD dwCaps; - if (dwCaps = dxwcdb.GetCaps((LPDIRECTDRAWSURFACE)lpdds)) { - OutTrace("QueryInterface(S): PASS caps=%x lpdds=%x->%x\n", dwCaps, lpdds, *obp); - dxwcdb.PushCaps(*(LPDIRECTDRAWSURFACE *)obp,dwCaps); - } - break; - } - } - - if(dwLocalTexVersion) { - // Texture Handling on QueryInterface - if(dxw.dwFlags5 & TEXTUREMASK) TextureHandling((LPDIRECTDRAWSURFACE)lpdds, dxversion); - HookTexture(obp, dwLocalTexVersion); - } - - if(IsGammaRamp) HookGammaControl(obp); - - if(dwLocalD3DDeviceVersion) { - extern void HookDirect3DDevice(void **, int); - HookDirect3DDevice(obp, dwLocalD3DDeviceVersion); - } - return 0; -} +{ return extQueryInterfaceDX(7, pQueryInterfaceD7, lpdd, riid, obp); } HRESULT WINAPI extQueryInterfaceS1(void *lpdds, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceS(1, pQueryInterfaceS1, lpdds, riid, obp); } +{ return extQueryInterfaceDX(1, pQueryInterfaceS1, lpdds, riid, obp); } HRESULT WINAPI extQueryInterfaceS2(void *lpdds, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceS(2, pQueryInterfaceS2, lpdds, riid, obp); } +{ return extQueryInterfaceDX(2, pQueryInterfaceS2, lpdds, riid, obp); } HRESULT WINAPI extQueryInterfaceS3(void *lpdds, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceS(3, pQueryInterfaceS3, lpdds, riid, obp); } +{ return extQueryInterfaceDX(3, pQueryInterfaceS3, lpdds, riid, obp); } HRESULT WINAPI extQueryInterfaceS4(void *lpdds, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceS(4, pQueryInterfaceS4, lpdds, riid, obp); } +{ return extQueryInterfaceDX(4, pQueryInterfaceS4, lpdds, riid, obp); } HRESULT WINAPI extQueryInterfaceS7(void *lpdds, REFIID riid, LPVOID *obp) -{ return extQueryInterfaceS(7, pQueryInterfaceS7, lpdds, riid, obp); } - +{ return extQueryInterfaceDX(7, pQueryInterfaceS7, lpdds, riid, obp); } HRESULT WINAPI extSetDisplayMode(int dxversion, LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index b128f1b..c0c5d70 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -397,8 +397,8 @@ static void TextureHack(LPDIRECTDRAWSURFACE s, int dxversion) return; } if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) while (TRUE) { // fake loop to ensure final Unlock - OutTrace("TextureHack(%d): lpdds=%x BitCount=%d size=(%dx%d)\n", - dxversion, s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); + OutTrace("TextureHack(%d): lpdds=%x BitCount=%d size=(%dx%d) surface=%x\n", + dxversion, s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight, ddsd.lpSurface); w = ddsd.dwWidth; h = ddsd.dwHeight; iSurfaceSize = ddsd.dwHeight * ddsd.lPitch; @@ -406,7 +406,7 @@ static void TextureHack(LPDIRECTDRAWSURFACE s, int dxversion) FILE *hf; BITMAPFILEHEADER hdr; // bitmap file-header BITMAPINFOHEADER pbi; // bitmap info-header - char pszFile[81]; + char pszFile[MAX_PATH]; int iSizeImage; // calculate the bitmap hash diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 8a15ab1..6faa2e3 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -1171,16 +1171,18 @@ void dxwCore::FixWindowFrame(HWND hwnd) OutTraceDW("FixWindowFrame: hwnd=%x foreground=%x\n", hwnd, GetForegroundWindow()); nStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); - if (!nStyle){ - OutTraceE("FixWindowFrame: GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); - return; - } + // beware: 0 is a valid return code! + //if (!nStyle){ + // OutTraceE("FixWindowFrame: GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); + // return; + //} nExStyle=(*pGetWindowLong)(hwnd, GWL_EXSTYLE); - if (!nExStyle){ - OutTraceE("FixWindowFrame: GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); - return; - } + // beware: 0 is a valid return code! + //if (!nExStyle){ + // OutTraceE("FixWindowFrame: GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); + // return; + //} OutTraceDW("FixWindowFrame: style=%x(%s) exstyle=%x(%s)\n", nStyle, ExplainStyle(nStyle), diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 16222f5..8a9611a 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.06.fx4" +#define VERSION "2.04.07.fx1" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 3345144926d0f10093d7b3c468a03811cc25aad4..14a71b998d4c2a2c1f1bc1773261fe5693b619c6 100644 GIT binary patch delta 28975 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 ObeZ6*Q;-#V=>Gwb!Ct=r delta 4033 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 + + diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 05051a1..d101f5d 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -13,6 +13,8 @@ //#define OutTraceD3D OutTrace extern LPDIRECTDRAW lpPrimaryDD; +typedef HRESULT (WINAPI *QueryInterface_Type)(void *, REFIID, LPVOID *); +extern HRESULT WINAPI extQueryInterfaceDX(int, QueryInterface_Type, void *, REFIID, LPVOID *); // exported API @@ -310,7 +312,6 @@ HRESULT WINAPI extExecute(void *, LPDIRECT3DEXECUTEBUFFER, LPDIRECT3DVIEWPORT, D Execute_Type pExecute = NULL; extern char *ExplainDDError(DWORD); -int GD3DDeviceVersion; static char *sFourCC(DWORD fcc) { @@ -504,7 +505,6 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) void HookDirect3DDevice(void **lpd3ddev, int d3dversion) { OutTraceD3D("HookDirect3DDevice: d3ddev=%x d3dversion=%d\n", lpd3ddev, d3dversion); - GD3DDeviceVersion = d3dversion; switch(d3dversion){ case 1: @@ -525,7 +525,7 @@ void HookDirect3DDevice(void **lpd3ddev, int d3dversion) SetHook((void *)(**(DWORD **)lpd3ddev + 0), extQueryInterfaceD3D2, (void **)&pQueryInterfaceD3D2, "QueryInterface(D3DD2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 8), extReleaseD3D2, (void **)&pReleaseD3D2, "ReleaseD3D(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 12), extD3DGetCaps2, (void **)&pD3DGetCaps2, "GetCaps(2)"); - SetHook((void *)(**(DWORD **)lpd3ddev + 16), extSwapTextureHandles, (void **)&pSwapTextureHandles, "SwapTextureHandles(2)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 16), extSwapTextureHandles2, (void **)&pSwapTextureHandles2, "SwapTextureHandles(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 24), extAddViewport2, (void **)&pAddViewport2, "AddViewport(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 28), extDeleteViewport2, (void **)&pDeleteViewport2, "DeleteViewport(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 32), extNextViewport2, (void **)&pNextViewport2, "NextViewport(2)"); @@ -702,118 +702,23 @@ void HookTexture(LPVOID *lpTexture, int version) } } -HRESULT WINAPI extQueryInterfaceD3(int d3dversion, QueryInterfaceD3_Type pQueryInterfaceD3, void *lpd3d, REFIID riid, LPVOID *obp) -{ - HRESULT res; - unsigned int dwLocalDDVersion; - unsigned int dwLocalD3DVersion; - - res = (*pQueryInterfaceD3)(lpd3d, riid, obp); - OutTraceDDRAW("QueryInterface(D3D%d): lpdd=%x REFIID=%x(%s) obp=%x ret=%x at %d\n", - d3dversion, lpd3d, riid.Data1, ExplainGUID((GUID *)&riid), *obp, res, __LINE__); - - if(res) { - OutTraceE("QueryInterface(D3D) ERROR: res=%x(%s)\n", res, ExplainDDError(res)); - return res; - } - - dwLocalDDVersion=0; - dwLocalD3DVersion=0; - switch(riid.Data1){ - case 0x6C14DB80: //DirectDraw1 - dwLocalDDVersion = 1; - break; - case 0xB3A6F3E0: //DirectDraw2 - dwLocalDDVersion = 2; - break; - case 0x618f8ad4: //DirectDraw3 - dwLocalDDVersion = 3; - break; - case 0x9c59509a: //DirectDraw4 - dwLocalDDVersion = 4; - break; - case 0x15e65ec0: //DirectDraw7 - dwLocalDDVersion = 7; - break; - case 0x3BBA0080: //Direct3D - dwLocalD3DVersion = 1; - break; - case 0x6aae1ec1: //Direct3D2 - dwLocalD3DVersion = 2; - break; - case 0xbb223240: //Direct3D3 - dwLocalD3DVersion = 3; - break; - case 0xf5049e77: //Direct3D7 - dwLocalD3DVersion = 7; - break; - } - if (! *obp){ - OutTraceDDRAW("QueryInterface(D): Interface for DX version %d not found\n", dwLocalDDVersion); - return(0); - } - if(dwLocalDDVersion) OutTraceDW("QueryInterface(D): Got interface for DX version %d\n", dwLocalDDVersion); - if(dwLocalD3DVersion) OutTraceDW("QueryInterface(D): Got interface for D3D version %d\n", dwLocalD3DVersion); - - if (dwLocalDDVersion > dxw.dwMaxDDVersion) { - *obp = NULL; - OutTraceDW("QueryInterface(D): lpdd=%x REFIID=%x obp=(NULL) ret=%x at %d\n", - lpd3d, riid.Data1, res, __LINE__); - return(0); - } - - switch (dwLocalDDVersion){ - case 1: // you never know .... - case 2: - case 3: - case 4: - case 7: - dxw.dwDDVersion=dwLocalDDVersion; - extern void HookDDSession(LPDIRECTDRAW *, int); - HookDDSession((LPDIRECTDRAW *)obp, dxw.dwDDVersion); - break; - } - - switch (dwLocalD3DVersion){ - case 1: - case 2: - case 3: - case 7: - HookDirect3DSession((LPDIRECTDRAW *)obp, dwLocalD3DVersion); - break; - } - - OutTraceDDRAW("QueryInterface(D3D): lpdd=%x REFIID=%x obp=%x DDVersion=%d ret=0\n", - lpd3d, riid.Data1, *obp, dxw.dwDDVersion); - - return D3D_OK; -} - HRESULT WINAPI extQueryInterfaceD31(void *lpd3d, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3(1, pQueryInterfaceD31, lpd3d, riid, ppvObj); } +{ return extQueryInterfaceDX(1, pQueryInterfaceD31, lpd3d, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD32(void *lpd3d, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3(2, pQueryInterfaceD32, lpd3d, riid, ppvObj); } +{ return extQueryInterfaceDX(2, pQueryInterfaceD32, lpd3d, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD33(void *lpd3d, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3(3, pQueryInterfaceD33, lpd3d, riid, ppvObj); } +{ return extQueryInterfaceDX(3, pQueryInterfaceD33, lpd3d, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD37(void *lpd3d, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3(7, pQueryInterfaceD37, lpd3d, riid, ppvObj); } - -HRESULT WINAPI extQueryInterfaceD3D(int d3dversion, QueryInterfaceD3D_Type pQueryInterface, void *lpd3ddev, REFIID riid, LPVOID *ppvObj) -{ - HRESULT res; - OutTraceD3D("QueryInterface(D3DD%d): d3ddev=%x REFIID=%x obj=%x\n", d3dversion, lpd3ddev, riid.Data1, ppvObj); - res=(*pQueryInterface)(lpd3ddev, riid, ppvObj); - return res; -} +{ return extQueryInterfaceDX(7, pQueryInterfaceD37, lpd3d, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD3D1(void *lpd3ddev, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3D(1, pQueryInterfaceD3D1, lpd3ddev, riid, ppvObj); } +{ return extQueryInterfaceDX(1, pQueryInterfaceD3D1, lpd3ddev, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD3D2(void *lpd3ddev, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3D(2, pQueryInterfaceD3D2, lpd3ddev, riid, ppvObj); } +{ return extQueryInterfaceDX(2, pQueryInterfaceD3D2, lpd3ddev, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD3D3(void *lpd3ddev, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3D(3, pQueryInterfaceD3D3, lpd3ddev, riid, ppvObj); } +{ return extQueryInterfaceDX(3, pQueryInterfaceD3D3, lpd3ddev, riid, ppvObj); } HRESULT WINAPI extQueryInterfaceD3D7(void *lpd3ddev, REFIID riid, LPVOID *ppvObj) -{ return extQueryInterfaceD3D(7, pQueryInterfaceD3D7, lpd3ddev, riid, ppvObj); } +{ return extQueryInterfaceDX(7, pQueryInterfaceD3D7, lpd3ddev, riid, ppvObj); } ULONG WINAPI extReleaseD3D(int d3dversion, ReleaseD3D_Type pReleaseD3D, LPDIRECT3DDEVICE lpd3dd) { @@ -1021,7 +926,7 @@ HRESULT WINAPI extCreateMaterial1(void *lpd3d, LPDIRECT3DMATERIAL *lpMaterial, I res=(*pCreateMaterial1)(lpd3d, lpMaterial, p0); if(res) OutTraceE("CreateMaterial ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("CreateMaterial: OK\n"); - HookMaterial(lpMaterial, GD3DDeviceVersion); + HookMaterial(lpMaterial, 0); return res; } @@ -1033,7 +938,7 @@ HRESULT WINAPI extCreateMaterial2(void *lpd3d, LPDIRECT3DMATERIAL2 *lpMaterial, res=(*pCreateMaterial2)(lpd3d, lpMaterial, p0); if(res) OutTraceE("CreateMaterial ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("CreateMaterial: OK\n"); - //HookMaterial(lpMaterial, GD3DDeviceVersion); + //HookMaterial(lpMaterial, 0); return res; } @@ -1045,7 +950,7 @@ HRESULT WINAPI extCreateMaterial3(void *lpd3d, LPDIRECT3DMATERIAL3 *lpMaterial, res=(*pCreateMaterial3)(lpd3d, lpMaterial, p0); if(res) OutTraceE("CreateMaterial ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("CreateMaterial: OK\n"); - //HookMaterial(lpMaterial, GD3DDeviceVersion); + //HookMaterial(lpMaterial, 0); return res; } #endif diff --git a/dll/queryint.cpp b/dll/queryint.cpp new file mode 100644 index 0000000..9f4dfa3 --- /dev/null +++ b/dll/queryint.cpp @@ -0,0 +1,226 @@ +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include "dxwnd.h" +#include "dxwcore.hpp" +#include "dxhook.h" +#include "syslibs.h" +#include "dxhelper.h" +#include "hddraw.h" + +extern void HookDDSurface(LPDIRECTDRAWSURFACE *, int, BOOL); +extern void HookGammaControl(LPVOID *); +extern void HookDDSession(LPDIRECTDRAW *, int); +extern void HookDirect3DSession(LPDIRECTDRAW *, int); +extern void HookDirect3DDevice(LPVOID *, int); +extern void HookViewport(LPDIRECT3DVIEWPORT *, int); + +// extQueryInterfaceDX: this is the single procedure that manages all QueryInterface methods within the DirectX classes +// it is better to have it unique because of the transitive and reflexive properties of QueryInterface, that means +// that every DirectX COM object can QueryInterface itself to become another object type belonging to this family. + +// some unhandled interfaces in emulation mode: +// REFIID={84e63de0-46aa-11cf-816f-0000c020156e}: IID_IDirect3DHALDevice + +typedef enum { + TYPE_OBJECT_UNKNOWN = 0, + TYPE_OBJECT_DIRECTDRAW, + TYPE_OBJECT_DDRAWSURFACE, + TYPE_OBJECT_DIRECT3D, + TYPE_OBJECT_D3DDEVICE, + TYPE_OBJECT_GAMMARAMP, + TYPE_OBJECT_TEXTURE, + TYPE_OBJECT_VIEWPORT }; + +HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInterface, void *lpdds, REFIID riid, LPVOID *obp) +{ + HRESULT res; + BOOL IsPrim; + BOOL IsBack; + int iObjectType; + int iObjectVersion; + extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim; + + IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); + IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); + OutTraceDDRAW("QueryInterface(%d): lpdds=%x%s REFIID=%x(%s)\n", + dxversion, lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); + + iObjectVersion = 0; + switch(riid.Data1){ + // DirectDraw + case 0x6C14DB80: // IID_IDirectDraw + iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=1; break; + case 0xB3A6F3E0: // IID_IDirectDraw2 + iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=2; break; + case 0x618f8ad4: // IID_IDirectDraw3 + iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=3; break; + case 0x9c59509a: // IID_IDirectDraw4 + iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=4; break; + case 0x15e65ec0: // IID_IDirectDraw7 + iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=7; break; + // DirectDrawSurface + case 0x6C14DB81: + iObjectType=TYPE_OBJECT_DDRAWSURFACE; iObjectVersion=1; break; + case 0x57805885: //DDSurface2 - WIP (Dark Reign) + iObjectType=TYPE_OBJECT_DDRAWSURFACE; iObjectVersion=2; break; + case 0xDA044E00: + iObjectType=TYPE_OBJECT_DDRAWSURFACE; iObjectVersion=3; break; + case 0x0B2B8630: + iObjectType=TYPE_OBJECT_DDRAWSURFACE; iObjectVersion=4; break; + case 0x06675a80: + iObjectType=TYPE_OBJECT_DDRAWSURFACE; iObjectVersion=7; break; + // Direct3D + case 0x3BBA0080: // IID_IDirect3D + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=1; break; + case 0x6aae1ec1: // IID_IDirect3D2 + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=2; break; + case 0xbb223240: // IID_IDirect3D3 + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=3; break; + case 0xf5049e77: // IID_IDirect3D7 + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=7; break; + // Direct3DDevice + case 0x84e63de0: // IID_IDirect3DHALDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=1; break; + case 0xA4665C60: // IID_IDirect3DRGBDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=1; break; + case 0xF2086B20: // IID_IDirect3DRampDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=1; break; + case 0x881949a1: // IID_IDirect3DMMXDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=1; break; + case 0x50936643: // IID_IDirect3DRefDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=2; break; + case 0x8767df22: // IID_IDirect3DNullDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=2; break; + case 0xf5049e78: // IID_IDirect3DTnLHalDevice, + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=3; break; + case 0x64108800: // IID_IDirect3DDevice + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=1; break; + case 0x93281501: // IID_IDirect3DDevice2 + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=2; break; + case 0xb0ab3b60: // IID_IDirect3DDevice3 + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=3; break; + case 0xf5049e79: // IID_IDirect3DDevice7 + iObjectType=TYPE_OBJECT_D3DDEVICE; iObjectVersion=7; break; + case 0x4B9F0EE0: + OutTraceDW("QueryInterface: IID_IDirectDrawColorControl\n"); + break; + case 0x69C11C3E: + iObjectType=TYPE_OBJECT_GAMMARAMP; iObjectVersion=1; break; + // textures + case 0x2CDCD9E0: + iObjectType=TYPE_OBJECT_TEXTURE; iObjectVersion=1; break; + case 0x93281502: + iObjectType=TYPE_OBJECT_TEXTURE; iObjectVersion=2; break; + case 0x4417C146: //IID_IDirect3DViewport + iObjectType=TYPE_OBJECT_VIEWPORT; iObjectVersion=1; break; + case 0x93281500: //IID_IDirect3DViewport2 + iObjectType=TYPE_OBJECT_VIEWPORT; iObjectVersion=2; break; + case 0xb0ab3b61: //IID_IDirect3DViewport3 + iObjectType=TYPE_OBJECT_VIEWPORT; iObjectVersion=3; break; + } + + char *sLabel; + switch(iObjectType){ + case TYPE_OBJECT_UNKNOWN: sLabel = "(unknown)"; break; + case TYPE_OBJECT_DIRECTDRAW: sLabel = "IID_IDirectDraw"; break; + case TYPE_OBJECT_DDRAWSURFACE: sLabel = "IID_IDirectDrawSurface"; break; + case TYPE_OBJECT_DIRECT3D: sLabel = "IID_IDirect3D"; break; + case TYPE_OBJECT_D3DDEVICE: sLabel = "IID_IDirect3DDevice"; break; + case TYPE_OBJECT_GAMMARAMP: sLabel = "IID_IDirectDrawGammaRamp"; break; + case TYPE_OBJECT_TEXTURE: sLabel = "IID_IDirect3DTexture"; break; + case TYPE_OBJECT_VIEWPORT: sLabel = "IID_IDirect3DViewport"; break; + } + OutTraceDW("QueryInterface: Got interface for %s version %d\n", sLabel, iObjectVersion); + + switch(iObjectType){ + // simulate unavailable interfaces (useful?) + case TYPE_OBJECT_DIRECTDRAW: + if (iObjectVersion > (int)dxw.dwMaxDDVersion) { + *obp = NULL; + OutTraceDW("QueryInterface: DDVersion=%d SUPPRESS lpdds=%x(%s) REFIID=%x obp=(NULL) ret=0 at %d\n", + iObjectVersion, lpdds, IsPrim?"":"(PRIM)", riid.Data1, __LINE__); + return(0); + } + break; + case TYPE_OBJECT_DDRAWSURFACE: + if (iObjectVersion > (int)dxw.dwMaxDDVersion) { + *obp = NULL; + OutTraceDW("QueryInterface: DDSVersion=%d SUPPRESS lpdds=%x(%s) REFIID=%x obp=(NULL) ret=0 at %d\n", + iObjectVersion, lpdds, IsPrim?"":"(PRIM)", riid.Data1, __LINE__); + return(0); + } + break; + case TYPE_OBJECT_GAMMARAMP: + // fix the target for gamma ramp creation: if it is a primary surface, use the real one!! + // v2.03.37: do this just when in esurface emulated mode!! + if((dxw.dwFlags1 & EMULATESURFACE) && + dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds)) + lpdds = lpDDSEmu_Prim; + break; + } + + res = (*pQueryInterface)(lpdds, riid, obp); + + if(res) { + OutTraceDW("QueryInterface: ERROR lpdds=%x%s REFIID=%x obp=%x ret=%x(%s) at %d\n", + lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, res, ExplainDDError(res), __LINE__); + return res; + } + + if (! *obp) { + OutTraceDW("QueryInterface: Interface for object %x not found\n", riid.Data1); + return res; + } + + // added trace + OutTraceDW("QueryInterface: lpdds=%x%s REFIID=%x obp=%x obj=%s version=%d ret=0\n", + lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, sLabel, iObjectVersion); + +// --------- here ..... + switch(iObjectType){ + // simulate unavailable interfaces (useful?) + case TYPE_OBJECT_DIRECTDRAW: + HookDDSession((LPDIRECTDRAW *)obp, iObjectVersion); + break; + case TYPE_OBJECT_DDRAWSURFACE: + dxw.dwDDVersion=iObjectVersion; + if(IsPrim){ + OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); + dxwss.PushPrimarySurface((LPDIRECTDRAWSURFACE)*obp, iObjectVersion); + HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, TRUE); + } + else{ + if(IsBack) dxwss.PushBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, iObjectVersion); + else dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); + // v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition? + HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, FALSE); + } + DWORD dwCaps; + if (dwCaps = dxwcdb.GetCaps((LPDIRECTDRAWSURFACE)lpdds)) { + OutTrace("QueryInterface(S): PASS caps=%x lpdds=%x->%x\n", dwCaps, lpdds, *obp); + dxwcdb.PushCaps(*(LPDIRECTDRAWSURFACE *)obp,dwCaps); + } + break; + case TYPE_OBJECT_DIRECT3D: + HookDirect3DSession((LPDIRECTDRAW *)obp, iObjectVersion); + break; + case TYPE_OBJECT_D3DDEVICE: + HookDirect3DDevice(obp, iObjectVersion); + break; + case TYPE_OBJECT_GAMMARAMP: + HookGammaControl(obp); + break; + case TYPE_OBJECT_TEXTURE: + HookTexture(obp, iObjectVersion); + break; + case TYPE_OBJECT_VIEWPORT: + HookViewport((LPDIRECT3DVIEWPORT *)obp, iObjectVersion); + break; + } + + return res; +} +