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 3345144..14a71b9 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 49993fb..9ea3b7d 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -509,6 +509,10 @@ RelativePath=".\opengl.cpp" > + + 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; +} +