From f37215c5dcb74e18b678ea7f3b6826614e774838 Mon Sep 17 00:00:00 2001 From: gho tik Date: Tue, 12 Jul 2016 12:48:29 -0400 Subject: [PATCH] v2_03_99_src Former-commit-id: c27808ea4ecc17b6cb1142194301389efa4eabe9 --- Include/dxwnd.h | 6 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/readme-relnotes.txt | 8 ++ dll/ddraw.cpp | 32 ++++- dll/dsound.cpp | 2 + dll/dxhook.cpp | 21 ++- dll/dxwcore.cpp | 2 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 274432 -> 306688 bytes dll/hd3d7.cpp | 281 ++++++++++++++++++++++++++++++++------ dll/ole32.cpp | 2 +- dll/user32.cpp | 7 +- dll/winproc.cpp | 12 +- host/TabDirect3D.cpp | 1 + host/TabDirectX2.cpp | 1 + host/TabInput.cpp | 7 +- host/TargetDlg.cpp | 6 +- host/TargetDlg.h | 8 +- host/dxwndhost.aps | Bin 221388 -> 254504 bytes host/dxwndhost.cpp | 1 + host/dxwndhost.rc | Bin 139468 -> 140352 bytes host/dxwndhost.vs2008.suo | Bin 89600 -> 105472 bytes host/dxwndhostView.cpp | 122 ++++++++++++----- host/host.aps | Bin 47508 -> 47504 bytes host/resource | Bin 51342 -> 51802 bytes 26 files changed, 421 insertions(+), 108 deletions(-) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index c3eb578..26d76bd 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -27,7 +27,7 @@ #define FIXWINFRAME 0x00002000 #define HIDEHWCURSOR 0x00004000 #define SLOWDOWN 0x00008000 -#define ENABLECLIPPING 0x00010000 +#define DISABLECLIPPING 0x00010000 #define LOCKWINSTYLE 0x00020000 #define MAPGDITOPRIMARY 0x00040000 #define FIXTEXTOUT 0x00080000 @@ -254,6 +254,9 @@ #define FORCEVSYNC 0x00000004 // Forces hardware VSync #define FORCENOVSYNC 0x00000008 // Forces NO hardware VSync #define VSYNCSCANLINE 0x00000010 // Activates WaitForVerticalBlank algorythm based on reaching a given scan line +#define TRIMTEXTUREFORMATS 0x00000020 // Emulates "DirectXTrimTextureFormats" shim to fix textures in Heavy Gear II +#define NOHALDEVICE 0x00000040 // Simulates a situation of lack of 3D hardware support, like in presence of remote desktop +#define CLIPLOCKED 0x00000080 // never destroy cursor clipper on window move events .... // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general @@ -354,6 +357,7 @@ void OutTraceHex(BYTE *, int); void *HookAPI(HMODULE, char *, void *, const char *, void *); void AdjustWindowFrame(HWND, DWORD, DWORD); char *hexdump(unsigned char *, int); +void HexTrace(unsigned char *, int); LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK extChildWindowProc(HWND, UINT, WPARAM, LPARAM); diff --git a/build/dxwnd.dll b/build/dxwnd.dll index a6d21ec..a4b7974 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c17fbc2f441f7355d88a7b189dfbba0ab31f0295b6900c1343849006fcce9f68 -size 706560 +oid sha256:bb1649c75e814ca6706d0e6951fb34ade18b013d75a1c8d2afce83c6c8143042 +size 709632 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 6e6fa7e..a06d146 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4c369251987e49585a3cb5776a808fafe262ccf2d6b0ef0265275ba2080189ac -size 667136 +oid sha256:ef6bb4b84f380a5e3e519d08ce9fca17bb67783b32655728f48197f403477976 +size 668160 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 0a79872..8c5109f 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1371,3 +1371,11 @@ fix: fixed CreateDialogIndirectParam and CreateDialogParam wrappers to make inne fix: recovered DEFAULTMESSAGES option fix: normalized output for ddraw GetScanLine() method fix: fixed the policy for redrecting the WindowProc routine. Fixes "Ultimate Spiderman" clipping problems, and possibly much more + +v2.03.99 +fix: unwanted hook to directsound when passing by CoCreateInstance() +fix: transient mode, now checks for both the target and the launcher to be dead before terminating +add: Direct3D TRIMTEXTUREFORMAT flag, to mimic MS "DirectXTrimTextureFormat" shim. Fixes problems in "Heavy Gear 2" and "Star Wars: Rogue Squardon 3D". +add: D3DDevice GetCaps hooking and full dump of D3DDevice capabilities +add: "No HAL Device" flag, making it unavailable the IID_Direct3DHALDevice device. Fixes "Grand Prix World" when the 3D car models are invisible. +add: reorganization of mouse clipper fields, with the addition of LOCK mode (useful for Tribal Rage) diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 0e02daf..7b3749f 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1555,6 +1555,7 @@ static void HandleCapsD(char *sLabel, LPDDCAPS c) sLabel, c->dwVidMemTotal, c->dwVidMemFree, c->dwZBufferBitDepths, ExplainZBufferBitDepths(c->dwZBufferBitDepths)); OutTraceDDRAW("GetCaps(%s): MaxVisibleOverlays=%x CurrVisibleOverlays=%x\n", sLabel, c->dwMaxVisibleOverlays, c->dwCurrVisibleOverlays); + if(IsDebug) HexTrace((unsigned char *)c, c->dwSize); if(dxw.bHintActive){ if(c->dwVidMemTotal > dwMaxMem) ShowHint(HINT_LIMITMEM); @@ -1591,13 +1592,14 @@ static HRESULT WINAPI extGetCapsD(int dxversion, GetCapsD_Type pGetCapsD, LPDIRE HRESULT res; OutTraceDDRAW("GetCaps(D%d): lpdd=%x %s %s\n", dxversion, lpdd, c1?"c1":"NULL", c2?"c2":"NULL"); res=(*pGetCapsD)(lpdd, c1, c2); - if(res) + if(res) { OutTraceE("GetCaps(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else { - if (c1) HandleCapsD("D-HW", c1); - if (c2) HandleCapsD("D-SW", c2); + return res; } + if (c1) HandleCapsD("D-HW", c1); + if (c2) HandleCapsD("D-SW", c2); + if((dxw.dwFlags3 & FORCESHEL) && c1) { DDCAPS_DX7 swcaps; // DDCAPS_DX7 because it is the bigger in size int size; @@ -1619,6 +1621,20 @@ static HRESULT WINAPI extGetCapsD(int dxversion, GetCapsD_Type pGetCapsD, LPDIRE if (c2) HandleCapsD("D-SW(fixed)", c2); } + if((dxw.dwFlags8 & NOHALDEVICE) && c1) { + OutTraceDW("GetCaps(D): NOHALDEVICE\n"); + c1->ddsCaps.dwCaps = DDCAPS_NOHARDWARE; + c1->ddsCaps.dwCaps2 = DDCAPS2_CANRENDERWINDOWED; + c1->dwPalCaps = 0; + c1->dwFXCaps = 0; + c1->dwFXAlphaCaps = 0; + c1->dwCKeyCaps = 0; + c1->dwVidMemTotal = c1->dwVidMemFree = 0; + c1->dwZBufferBitDepths = 0; + c1->dwMaxVisibleOverlays = c1->dwCurrVisibleOverlays = 0; + HandleCapsD("D-HW(NoHAL)", c1); + } + if((dxw.dwFlags3 & MINIMALCAPS)) SetMinimalCaps(c1, c2); if(dxw.dwFlags3 & CAPMASK) MaskCapsD(c1, c2); @@ -2602,6 +2618,13 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet return DDERR_NOTFOUND; } } + + if((dxw.dwFlags8 & NOHALDEVICE) && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ + // tested with "Grand Prix World": if a ZBUFFER is returned, CreateDevice fails! + *lplpddas = NULL; + OutTraceDW("GetAttachedSurface(%d): NOHALDEVICE no attached ZBUFFER\n", dxversion); + return DDERR_NOTFOUND; + } } else { // Virtual primary surfaces are created with no DDSCAPS_3DDEVICE caps, so don't look for it .... @@ -4797,6 +4820,7 @@ static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDI caps->dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP|DDSCAPS_LOCALVIDMEM); // you never know.... caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way if(caps->dwCaps & DDSCAPS_3DDEVICE) caps->dwCaps |= DDSCAPS_LOCALVIDMEM; + //if(caps->dwCaps & DDSCAPS_3DDEVICE) caps->dwCaps |= (DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX); } // v2.03.82: fixed logic for ZBUFFER capabilities: "The Creed" may have two, in SYSTEMMEMORY or in VIDEOMEMORY ... diff --git a/dll/dsound.cpp b/dll/dsound.cpp index 4d12981..250905c 100644 --- a/dll/dsound.cpp +++ b/dll/dsound.cpp @@ -73,6 +73,8 @@ void HookDirectSoundInit() void HookDirectSoundObj(LPDIRECTSOUND *lpds) { + // v2.03.99: check or DirectSound could be hooked through CoCreateInstance !! + if(!(dxw.dwFlags7 & HOOKDIRECTSOUND)) return; // IDIrectSound::SetCooperativeLevel SetHook((void *)(**(DWORD **)lpds + 12), extCreateSoundBuffer, (void **)&pCreateSoundBuffer, "CreateSoundBuffer"); SetHook((void *)(**(DWORD **)lpds + 24), extDSSetCooperativeLevel, (void **)&pDSSetCooperativeLevel, "SetCooperativeLevel(DSound)"); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index fcdbbe7..4343855 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -67,7 +67,7 @@ static char *FlagNames[32]={ "HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD", "EMULATEBUFFER", "HOOKDI8", "BLITFROMBACKBUFFER", "SUPPRESSCLIPPING", "AUTOREFRESH", "FIXWINFRAME", "HIDEHWCURSOR", "SLOWDOWN", - "ENABLECLIPPING", "LOCKWINSTYLE", "MAPGDITOPRIMARY", "FIXTEXTOUT", + "DISABLECLIPPING", "LOCKWINSTYLE", "MAPGDITOPRIMARY", "FIXTEXTOUT", "KEEPCURSORWITHIN", "USERGB565", "SUPPRESSDXERRORS", "PREVENTMAXIMIZE", "LOCKEDSURFACE", "FIXPARENTWIN", "SWITCHVIDEOMEMORY", "CLIENTREMAPPING", "HANDLEALTF4", "LOCKWINPOS", "HOOKCHILDWIN", "MESSAGEPROC" @@ -141,7 +141,7 @@ static char *Flag7Names[32]={ static char *Flag8Names[32]={ "FORCEWAIT", "FORCENOWAIT", "FORCEVSYNC", "FORCENOVSYNC", - "VSYNCSCANLINES", "", "", "", + "VSYNCSCANLINES", "TRIMTEXTUREFORMATS", "NOHALDEVICE", "CLIPLOCK", "", "", "", "", "", "", "", "", "", "", "", "", @@ -277,6 +277,23 @@ void OutTrace(const char *format, ...) dxw.dwTFlags = tFlags; // restore settings } +void HexTrace(unsigned char *buf, int len) +{ + char line[3*32 + 40]; + char hex[6]; + int count=0; + while(len){ + sprintf(line,"%04X: ", count); + for(int i=32; i && len; i--, len--, buf++){ + sprintf(hex, "%02X.", *buf); + strcat(line, hex); + } + strcat(line, "\n"); + OutTrace(line); + count += 32; + } +} + // from MSDN: // GetVersionEx may be altered or unavailable for releases after Windows 8.1. Instead, use the Version Helper functions // diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index ba33cf4..24f3577 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -363,7 +363,7 @@ POINT dxwCore::FixCursorPos(POINT prev) if (h) curr.y = (curr.y * dxw.GetScreenHeight()) / h; } - if((dxw.dwFlags1 & ENABLECLIPPING) && lpClipRegion){ + if((dxw.dwFlags1 & DISABLECLIPPING) && lpClipRegion){ // v2.1.93: // in clipping mode, avoid the cursor position to lay outside the valid rect // note 1: the rect follow the convention and valid coord lay between left to righ-1, diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 0a14a98..c04fd2d 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.98.fx1" +#define VERSION "2.03.99" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 885bb2a4780e3e418bcc2ba82e23e99170b19e3b..836f07ca872972e1c6369b3b6d55a1a06c15f202 100644 GIT binary patch delta 13633 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 AwEzGB delta 3058 zcma);e^AuN6~OoH?j66*LYRhWs-2qD5JUU{ zC#gw6q{uhr{gY%G8wpK+OwzM_NybJnOeRfhn^>D>+O#!FjIpV83^SoqguXqNXsp7}y zYxu23P)Z~0l*WXumS2%ZwLJtQkpuQNaGiUzxn`GODKDeZ>K zvj}!YNz-paM#M4g&gWKZhbHk;B*VuRW;sp^e9o>2*SM~W;+N+3^9Esais zBOi&(h|kxbZQD;ECDti2US3-UNptn)aLt!(J!He@*!bxhJB}9eg2)!nh5&}UVAyDPxG{gXSczAV?qq-Wa_a;TBky_(gtb*zQm zOQBaA!7izEU^lbZ#de;^*!1*q&Jv9#-1<9^A8A>`+5zn-B&{r0Kq1$i-l?bmPEdqR!~4aGUP$ zih6(+6WYn5Kb1=r(Dmqh8a(E znds(Qcz=KkOmXu9mEFl^`K^3dV(2qofsF?t%{<}Z>i~l}JYWXW_+~KArt_b1*n$VT zp;#?$B|e=BO^xqADSwMU2U(3ZCqSCgDJQ|G-zDfl$4`n+vsnhdyY4upI8|m3uy3OX!$~|5I-!T+wba_ zNX3S9y+HhAjdU#Pok@&^a~E%X>DwtZ8>^|voxO`w@T(=1wW_~S-RM&Bsk{Bgda9AE zWhGvENj`|}UC@d*uadQR-%sVBI6E(@#FtV*-xG|)!PHd*YxqS-x~sfSCQX7!pmm4}aL_-H&j{wP-H zn6z8E9n=;bnyFr0njN;V9?kkJ>{-p8(~P>Zqok{!bic*!N2D(x7MWdxG91!|uUQQL zK)R3G-q%do{aM@n#bWm%>5HiCd_20|7ooPx+U8SjqxxObY+N%Hqt8iKj!bB#lER)a z^XQACuS#F_OpDhnK{G;Z9_eaf$rhG6!!|Ro1!ii)EX~x!*;-$0vCGqT`I_aB-7>9* z@ZDeV%(ivfWWB~}s4CJ`B35grUWFB;t5Tzx+QhBeZkuMe5W7dSM$NK_HEDgj{;D}1 zAU%(!U=LZ~F49$b#KLMxSMShf%~bn-(p8|^EbJM@aAX1BfUOrqs#))oFQohj%3q~} diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index e305f38..63ddece 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -45,6 +45,7 @@ typedef HRESULT (WINAPI *CreateDevice2_Type)(void *, REFCLSID, LPDIRECTDRAWSURFA typedef HRESULT (WINAPI *CreateDevice3_Type)(void *, REFCLSID, LPDIRECTDRAWSURFACE4, LPDIRECT3DDEVICE3 *, LPUNKNOWN); typedef HRESULT (WINAPI *CreateDevice7_Type)(void *, REFCLSID, LPDIRECTDRAWSURFACE7, LPDIRECT3DDEVICE7 *); typedef HRESULT (WINAPI *EnumZBufferFormats_Type)(void *, REFCLSID, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); +typedef HRESULT (WINAPI *EnumTextureFormats_Type)(void *, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); QueryInterfaceD3_Type pQueryInterfaceD31 = NULL; QueryInterfaceD3_Type pQueryInterfaceD32 = NULL; @@ -73,6 +74,8 @@ CreateDevice7_Type pCreateDevice7 = NULL; EnumZBufferFormats_Type pEnumZBufferFormats3 = NULL; EnumZBufferFormats_Type pEnumZBufferFormats7 = NULL; +EnumTextureFormats_Type pEnumTextureFormats1, pEnumTextureFormats2, pEnumTextureFormats3, pEnumTextureFormats7; + HRESULT WINAPI extQueryInterfaceD31(void *, REFIID, LPVOID *); HRESULT WINAPI extQueryInterfaceD32(void *, REFIID, LPVOID *); HRESULT WINAPI extQueryInterfaceD33(void *, REFIID, LPVOID *); @@ -88,13 +91,18 @@ HRESULT WINAPI extCreateLight3(void *, LPDIRECT3DLIGHT *, IUnknown *); HRESULT WINAPI extEnumZBufferFormats3(void *, REFCLSID, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); HRESULT WINAPI extEnumZBufferFormats7(void *, REFCLSID, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); +HRESULT WINAPI extEnumTextureFormats1(void *, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); +HRESULT WINAPI extEnumTextureFormats2(void *, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); +HRESULT WINAPI extEnumTextureFormats3(void *, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); +HRESULT WINAPI extEnumTextureFormats7(void *, LPD3DENUMPIXELFORMATSCALLBACK, LPVOID); + // Direct3DDevice-n interfaces typedef ULONG (WINAPI *ReleaseD3D_Type)(LPDIRECT3DDEVICE); typedef HRESULT (WINAPI *QueryInterfaceD3D_Type)(void *, REFIID, LPVOID *); typedef HRESULT (WINAPI *D3DInitialize_Type)(void *, LPDIRECT3D , LPGUID, LPD3DDEVICEDESC); typedef HRESULT (WINAPI *D3DGetCaps_Type)(void *, LPD3DDEVICEDESC ,LPD3DDEVICEDESC); -typedef HRESULT (WINAPI *D3DGetCaps3_Type)(void *, LPD3DDEVICEDESC, LPD3DDEVICEDESC); +typedef HRESULT (WINAPI *D3DGetCaps7_Type)(void *, LPD3DDEVICEDESC7); typedef HRESULT (WINAPI *AddViewport1_Type)(void *, LPDIRECT3DVIEWPORT); typedef HRESULT (WINAPI *AddViewport2_Type)(void *, LPDIRECT3DVIEWPORT2); typedef HRESULT (WINAPI *AddViewport3_Type)(void *, LPDIRECT3DVIEWPORT3); @@ -115,8 +123,8 @@ typedef HRESULT (WINAPI *SwapTextureHandles2_Type)(void *, LPDIRECT3DTEXTURE2, L QueryInterfaceD3_Type pQueryInterfaceD3D = NULL; ReleaseD3D_Type pReleaseD3D1, pReleaseD3D2, pReleaseD3D3, pReleaseD3D7; D3DInitialize_Type pD3DInitialize = NULL; -D3DGetCaps_Type pD3DGetCaps = NULL; -D3DGetCaps3_Type pGetCaps3 = NULL; +D3DGetCaps_Type pD3DGetCaps1, pD3DGetCaps2, pD3DGetCaps3; +D3DGetCaps7_Type pD3DGetCaps7; AddViewport1_Type pAddViewport1 = NULL; AddViewport2_Type pAddViewport2 = NULL; AddViewport3_Type pAddViewport3 = NULL; @@ -225,7 +233,6 @@ HRESULT WINAPI extQueryInterfaceD3(void *, REFIID, LPVOID *); HRESULT WINAPI extQueryInterfaceD3D(void *, REFIID, LPVOID *); HRESULT WINAPI extD3DInitialize(void *, LPDIRECT3D , LPGUID, LPD3DDEVICEDESC); -HRESULT WINAPI extD3DGetCaps(void *, LPD3DDEVICEDESC ,LPD3DDEVICEDESC); ULONG WINAPI extReleaseD3D1(LPDIRECT3DDEVICE); ULONG WINAPI extReleaseD3D2(LPDIRECT3DDEVICE); @@ -242,7 +249,10 @@ HRESULT WINAPI extEndScene7(void *); HRESULT WINAPI extSetRenderState2(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extSetRenderState3(void *, D3DRENDERSTATETYPE, DWORD); HRESULT WINAPI extSetRenderState7(void *, D3DRENDERSTATETYPE, DWORD); -HRESULT WINAPI extGetCaps3(void *, LPD3DDEVICEDESC, LPD3DDEVICEDESC); +HRESULT WINAPI extD3DGetCaps1(void *, LPD3DDEVICEDESC, LPD3DDEVICEDESC); +HRESULT WINAPI extD3DGetCaps2(void *, LPD3DDEVICEDESC, LPD3DDEVICEDESC); +HRESULT WINAPI extD3DGetCaps3(void *, LPD3DDEVICEDESC, LPD3DDEVICEDESC); +HRESULT WINAPI extD3DGetCaps7(void *, LPD3DDEVICEDESC7); HRESULT WINAPI extSetLightState3(void *d3dd, D3DLIGHTSTATETYPE d3dls, DWORD t); HRESULT WINAPI extSetViewport3(void *, LPD3DVIEWPORT); HRESULT WINAPI extGetViewport3(void *, LPD3DVIEWPORT); @@ -494,24 +504,26 @@ void HookDirect3DDevice(void **lpd3ddev, int d3dversion) case 1: SetHook((void *)(**(DWORD **)lpd3ddev + 0), extQueryInterfaceD3D, (void **)&pQueryInterfaceD3D, "QueryInterface(D3D)"); SetHook((void *)(**(DWORD **)lpd3ddev + 8), extReleaseD3D1, (void **)&pReleaseD3D1, "ReleaseD3D(1)"); - //SetHook((void *)(**(DWORD **)lpd3ddev + 16), extGetCaps1, (void **)&pGetCaps1, "GetCaps(1)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 16), extD3DGetCaps1, (void **)&pD3DGetCaps1, "GetCaps(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 20), extSwapTextureHandles, (void **)&pSwapTextureHandles, "SwapTextureHandles(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 32), extExecute, (void **)&pExecute, "Execute(1)"); //SetHook((void *)(**(DWORD **)lpd3ddev + 32), extExecute, NULL, "Execute(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 36), extAddViewport1, (void **)&pAddViewport1, "AddViewport(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 40), extDeleteViewport1, (void **)&pDeleteViewport1, "DeleteViewport(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 44), extNextViewport1, (void **)&pNextViewport1, "NextViewport(1)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 56), extEnumTextureFormats1, (void **)&pEnumTextureFormats1, "EnumTextureFormats(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 76), extBeginScene1, (void **)&pBeginScene1, "BeginScene(1)"); SetHook((void *)(**(DWORD **)lpd3ddev + 80), extEndScene1, (void **)&pEndScene1, "EndScene(1)"); break; case 2: SetHook((void *)(**(DWORD **)lpd3ddev + 0), extQueryInterfaceD3D, (void **)&pQueryInterfaceD3D, "QueryInterface(D3D)"); SetHook((void *)(**(DWORD **)lpd3ddev + 8), extReleaseD3D2, (void **)&pReleaseD3D2, "ReleaseD3D(2)"); - //SetHook((void *)(**(DWORD **)lpd3ddev + 12), extGetCaps2, (void **)&pGetCaps2, "GetCaps(2)"); - SetHook((void *)(**(DWORD **)lpd3ddev + 16), extSwapTextureHandles, (void **)&pSwapTextureHandles, "SwapTextureHandles(1)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 12), extD3DGetCaps2, (void **)&pD3DGetCaps2, "GetCaps(2)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 16), extSwapTextureHandles, (void **)&pSwapTextureHandles, "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)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 36), extEnumTextureFormats2, (void **)&pEnumTextureFormats2, "EnumTextureFormats(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 40), extBeginScene2, (void **)&pBeginScene2, "BeginScene(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 44), extEndScene2, (void **)&pEndScene2, "EndScene(2)"); SetHook((void *)(**(DWORD **)lpd3ddev + 52), extSetCurrentViewport2, (void **)&pSetCurrentViewport2, "SetCurrentViewport(2)"); @@ -526,8 +538,9 @@ void HookDirect3DDevice(void **lpd3ddev, int d3dversion) case 3: SetHook((void *)(**(DWORD **)lpd3ddev + 0), extQueryInterfaceD3D, (void **)&pQueryInterfaceD3D, "QueryInterface(D3D)"); SetHook((void *)(**(DWORD **)lpd3ddev + 8), extReleaseD3D3, (void **)&pReleaseD3D3, "ReleaseD3D(3)"); - SetHook((void *)(**(DWORD **)lpd3ddev + 12), extGetCaps3, (void **)&pGetCaps3, "GetCaps(3)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 12), extD3DGetCaps3, (void **)&pD3DGetCaps3, "GetCaps(3)"); SetHook((void *)(**(DWORD **)lpd3ddev + 20), extAddViewport3, (void **)&pAddViewport3, "AddViewport(3)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 32), extEnumTextureFormats3, (void **)&pEnumTextureFormats3, "EnumTextureFormats(3)"); SetHook((void *)(**(DWORD **)lpd3ddev + 36), extBeginScene3, (void **)&pBeginScene3, "BeginScene(3)"); SetHook((void *)(**(DWORD **)lpd3ddev + 40), extEndScene3, (void **)&pEndScene3, "EndScene(3)"); SetHook((void *)(**(DWORD **)lpd3ddev + 48), extSetCurrentViewport3, (void **)&pSetCurrentViewport3, "SetCurrentViewport(3)"); @@ -544,6 +557,8 @@ void HookDirect3DDevice(void **lpd3ddev, int d3dversion) case 7: //SetHook((void *)(**(DWORD **)lpd3ddev + 0), extQueryInterfaceD3D, (void **)&pQueryInterfaceD3D, "QueryInterface(D3D)"); SetHook((void *)(**(DWORD **)lpd3ddev + 8), extReleaseD3D7, (void **)&pReleaseD3D7, "ReleaseD3D(7)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 12), extD3DGetCaps7, (void **)&pD3DGetCaps7, "GetCaps(7)"); + SetHook((void *)(**(DWORD **)lpd3ddev + 16), extEnumTextureFormats7, (void **)&pEnumTextureFormats7, "EnumTextureFormats(7)"); SetHook((void *)(**(DWORD **)lpd3ddev + 20), extBeginScene7, (void **)&pBeginScene7, "BeginScene(7)"); SetHook((void *)(**(DWORD **)lpd3ddev + 24), extEndScene7, (void **)&pEndScene7, "EndScene(7)"); //SetHook((void *)(**(DWORD **)lpd3ddev + 52), extSetViewport7, (void **)&pSetViewport7, "SetViewport(7)"); @@ -785,7 +800,7 @@ typedef struct { LPVOID arg; } CallbackArg7; -static void DumpD3DDevideDesc(LPD3DDEVICEDESC d3, char *label) +static void DumpD3DDeviceDesc(LPD3DDEVICEDESC d3, char *label) { if(IsTraceD3D){ if(d3){ @@ -802,7 +817,34 @@ static void DumpD3DDevideDesc(LPD3DDEVICEDESC d3, char *label) if(d3->dwFlags & D3DDD_MAXBUFFERSIZE) OutTrace("MaxBufferSize=%d ", d3->dwMaxBufferSize); if(d3->dwFlags & D3DDD_MAXVERTEXCOUNT) OutTrace("MaxVertexCount=%d ", d3->dwMaxVertexCount); OutTrace("Texture min=(%dx%d) max=(%dx%d)\n", d3->dwMinTextureWidth, d3->dwMinTextureHeight, d3->dwMaxTextureWidth, d3->dwMaxTextureHeight); + HexTrace((unsigned char *)d3, d3->dwSize); + } + else + OutTrace("EnumDevices: CALLBACK dev=%s ddesc=NULL\n", label); + } +} + +static void DumpD3DPrimCaps(char *label, D3DPRIMCAPS *pc) +{ + OutTrace("%s={siz=%d Misc=%x Raster=%x ZCmp=%x SrcBlend=%x DestBlend=%x AlphaCmp=%x Shade=%x Tex=%x TexFil=%x TexBlend=%x TexAddr=%x Stipple=(%dx%d)} ", + label, + pc->dwSize, pc->dwMiscCaps, pc->dwRasterCaps, pc->dwZCmpCaps, pc->dwSrcBlendCaps, pc->dwDestBlendCaps, pc->dwAlphaCmpCaps, + pc->dwShadeCaps, pc->dwTextureCaps, pc->dwTextureFilterCaps, pc->dwTextureBlendCaps, pc->dwTextureAddressCaps, + pc->dwStippleWidth, pc->dwStippleHeight); +} + +static void DumpD3DDeviceDesc7(LPD3DDEVICEDESC7 d3, char *label) +{ + if(IsTraceD3D){ + if(d3){ + OutTrace("EnumDevices: CALLBACK dev=%s DevCaps=%x ", label, d3->dwDevCaps); + DumpD3DPrimCaps("LineCaps", &d3->dpcLineCaps); + DumpD3DPrimCaps("TriCaps", &d3->dpcLineCaps); + OutTrace("RenderBitDepth=%d ZBufferBitDepth", d3->dwDeviceRenderBitDepth, d3->dwDeviceZBufferBitDepth); + OutTrace("Texture min=(%dx%d) max=(%dx%d)\n", d3->dwMinTextureWidth, d3->dwMinTextureHeight, d3->dwMaxTextureWidth, d3->dwMaxTextureHeight); + // to be completed .... //OutTrace("\n"); + HexTrace((unsigned char *)d3, sizeof(D3DDEVICEDESC7)); } else OutTrace("EnumDevices: CALLBACK dev=%s ddesc=NULL\n", label); @@ -813,8 +855,16 @@ HRESULT WINAPI extDeviceProxy(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR { HRESULT res; OutTraceD3D("EnumDevices: CALLBACK GUID=%x(%s) DeviceDescription=\"%s\", DeviceName=\"%s\", arg=%x\n", lpGuid->Data1, ExplainGUID(lpGuid), lpDeviceDescription, lpDeviceName, ((CallbackArg *)arg)->arg); - DumpD3DDevideDesc(lpd3ddd1, "HWDEV"); - DumpD3DDevideDesc(lpd3ddd2, "SWDEV"); + DumpD3DDeviceDesc(lpd3ddd1, "HWDEV"); + DumpD3DDeviceDesc(lpd3ddd2, "SWDEV"); + + // IID_IDirect3DHALDevice = 0x84e63de0.... + if((dxw.dwFlags8 & NOHALDEVICE) && (lpGuid->Data1 == 0x84e63de0)) + { + OutTraceDW("EnumDevices: D3DHALDEVICE SKIP\n"); + return TRUE; + } + if(dxw.dwFlags4 & NOPOWER2FIX){ D3DDEVICEDESC lpd3ddd1fix, lpd3ddd2fix; if(lpd3ddd1) memcpy(&lpd3ddd1fix, lpd3ddd1, sizeof(D3DDEVICEDESC)); @@ -836,7 +886,10 @@ HRESULT WINAPI extDeviceProxy7(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LP { HRESULT res; OutTraceD3D("EnumDevices(D3D7): CALLBACK DeviceDescription=\"%s\", DeviceName=\"%s\", arg=%x\n", lpDeviceDescription, lpDeviceName, ((CallbackArg *)arg)->arg); - DumpD3DDevideDesc((LPD3DDEVICEDESC)lpd3ddd, "DEV"); + DumpD3DDeviceDesc((LPD3DDEVICEDESC)lpd3ddd, "DEV"); + + // to do: NOHALDEVICE handling, we have no GUID here! + if(dxw.dwFlags4 & NOPOWER2FIX){ D3DDEVICEDESC7 lpd3dddfix; if(lpd3ddd) memcpy(&lpd3dddfix, lpd3ddd, sizeof(D3DDEVICEDESC7)); @@ -1000,8 +1053,8 @@ static HRESULT WINAPI extFindDevice(int d3dversion, FindDevice_Type pFindDevice, if(res) OutTraceE("FindDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else { OutTraceD3D("FindDevice: GUID=%x.%x.%x.%x\n", p2->guid.Data1, p2->guid.Data2, p2->guid.Data3, p2->guid.Data4); - DumpD3DDevideDesc(&(p2->ddHwDesc), "HWDEV"); - DumpD3DDevideDesc(&(p2->ddSwDesc), "SWDEV"); + DumpD3DDeviceDesc(&(p2->ddHwDesc), "HWDEV"); + DumpD3DDeviceDesc(&(p2->ddSwDesc), "SWDEV"); } return res; } @@ -1071,6 +1124,12 @@ HRESULT WINAPI extInitializeVP(void *lpvp, LPDIRECT3D lpd3d) return res; } +#ifndef D3DERR_NOTAVAILABLE +#define _FACD3D 0x876 +#define D3DERR_NOTAVAILABLE MAKE_HRESULT(1, _FACD3D, 2154) +#endif + + HRESULT WINAPI extCreateDevice2(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE lpdds, LPDIRECT3DDEVICE2 *lplpd3dd) { HRESULT res; @@ -1078,6 +1137,11 @@ HRESULT WINAPI extCreateDevice2(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE OutTraceD3D("CreateDevice(D3D2): d3d=%x GUID=%x(%s) lpdds=%x%s\n", lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + if((dxw.dwFlags8 & NOHALDEVICE) && (Guid.Data1 == 0x84e63de0)) { + OutTraceDW("CreateDevice(D3D2): D3DHALDEVICE SKIP\n"); + return D3DERR_NOTAVAILABLE; + } + res=(*pCreateDevice2)(lpd3d, Guid, lpdds, lplpd3dd); if(res!=DD_OK) { OutTraceE("CreateDevice(D3D2) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -1097,6 +1161,11 @@ HRESULT WINAPI extCreateDevice3(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE4 OutTraceD3D("CreateDevice(D3D3): d3d=%x GUID=%x(%s) lpdds=%x%s\n", lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + if((dxw.dwFlags8 & NOHALDEVICE) && (Guid.Data1 == 0x84e63de0)) { + OutTraceDW("CreateDevice(D3D3): D3DHALDEVICE SKIP\n"); + return D3DERR_NOTAVAILABLE; + } + res=(*pCreateDevice3)(lpd3d, Guid, lpdds, lplpd3dd, unk); if(res!=DD_OK) { OutTraceE("CreateDevice(D3D3) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -1137,18 +1206,7 @@ HRESULT WINAPI extD3DInitialize(void *d3dd, LPDIRECT3D lpd3d, LPGUID lpGuid, LPD OutTraceD3D("Initialize: d3dd=%x lpd3d=%x GUID=%x lpd3ddd=%x\n", d3dd, lpd3d, lpGuid->Data1, lpd3dd); res=(*pD3DInitialize)(d3dd, lpd3d, lpGuid, lpd3dd); if(res) OutTraceE("Initialize ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - DumpD3DDevideDesc(lpd3dd, "INIT"); - return res; -} - -HRESULT WINAPI extD3DGetCaps(void *d3dd, LPD3DDEVICEDESC lpd3dd ,LPD3DDEVICEDESC lpd3dd2) -{ - HRESULT res; - OutTraceD3D("GetCaps(D3D): d3dd=%x lpd3dd=%x lpd3dd2=%x \n", d3dd, lpd3dd, lpd3dd2); - res=(*pD3DGetCaps)(d3dd, lpd3dd, lpd3dd2); - if(res) OutTraceE("GetCaps(D3D) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - DumpD3DDevideDesc(lpd3dd, "HWDEV"); - DumpD3DDevideDesc(lpd3dd2, "SWDEV"); + DumpD3DDeviceDesc(lpd3dd, "INIT"); return res; } @@ -1368,21 +1426,27 @@ HRESULT WINAPI extEndScene7(void *d3dd) return res; } -HRESULT WINAPI extGetCaps3(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) +HRESULT WINAPI extD3DGetCaps(int d3dversion, D3DGetCaps_Type pD3DGetCaps, void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) { HRESULT res; - OutTraceD3D("GetCaps(3): d3dd=%x hd=%x sd=%x\n", d3dd, hd, sd); - res=(*pGetCaps3)(d3dd, hd, sd); + OutTraceD3D("GetCaps(D3D%d): d3dd=%x hd=%x sd=%x\n", d3dversion, d3dd, hd, sd); + res=(*pD3DGetCaps)(d3dd, hd, sd); if(res) { - OutTraceE("GetCaps(3): res=%x(%s)\n", res, ExplainDDError(res)); + OutTraceE("GetCaps(D3D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } + + DumpD3DDeviceDesc(hd, "HWDEV"); + DumpD3DDeviceDesc(sd, "SWDEV"); + if(dxw.dwFlags4 & NOPOWER2FIX){ if(hd) { + OutTraceDW("GetCaps(D3D): Fixing NOPOWER2FIX hw caps\n"); hd->dpcLineCaps.dwTextureCaps|=D3DPTEXTURECAPS_NONPOW2CONDITIONAL|D3DPTEXTURECAPS_POW2; hd->dpcTriCaps.dwTextureCaps|=D3DPTEXTURECAPS_NONPOW2CONDITIONAL|D3DPTEXTURECAPS_POW2; } if(sd) { + OutTraceDW("GetCaps(D3D): Fixing NOPOWER2FIX sw caps\n"); sd->dpcLineCaps.dwTextureCaps|=D3DPTEXTURECAPS_NONPOW2CONDITIONAL|D3DPTEXTURECAPS_POW2; sd->dpcTriCaps.dwTextureCaps|=D3DPTEXTURECAPS_NONPOW2CONDITIONAL|D3DPTEXTURECAPS_POW2; } @@ -1390,6 +1454,35 @@ HRESULT WINAPI extGetCaps3(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) return res; } +HRESULT WINAPI extD3DGetCaps1(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) +{ return extD3DGetCaps(1, pD3DGetCaps1, d3dd, hd, sd); } +HRESULT WINAPI extD3DGetCaps2(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) +{ return extD3DGetCaps(2, pD3DGetCaps2, d3dd, hd, sd); } +HRESULT WINAPI extD3DGetCaps3(void *d3dd, LPD3DDEVICEDESC hd, LPD3DDEVICEDESC sd) +{ return extD3DGetCaps(3, pD3DGetCaps3, d3dd, hd, sd); } + +HRESULT WINAPI extD3DGetCaps7(void *d3dd, LPD3DDEVICEDESC7 lpd3ddd) +{ + HRESULT res; + OutTraceD3D("GetCaps(D3D7): d3dd=%x lpd3ddd=%x\n", d3dd, lpd3ddd); + res=(*pD3DGetCaps7)(d3dd, lpd3ddd); + if(res) { + OutTraceE("GetCaps(D3D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); + return res; + } + + DumpD3DDeviceDesc7(lpd3ddd, "DEV7"); + + if(dxw.dwFlags4 & NOPOWER2FIX){ + if(lpd3ddd) { + OutTraceDW("GetCaps(D3D): Fixing NOPOWER2FIX hw caps\n"); + lpd3ddd->dpcLineCaps.dwTextureCaps|=D3DPTEXTURECAPS_NONPOW2CONDITIONAL|D3DPTEXTURECAPS_POW2; + lpd3ddd->dpcTriCaps.dwTextureCaps|=D3DPTEXTURECAPS_NONPOW2CONDITIONAL|D3DPTEXTURECAPS_POW2; + } + } + return res; +} + HRESULT WINAPI extSetLightState3(void *d3dd, D3DLIGHTSTATETYPE d3dls, DWORD t) { HRESULT res; @@ -1787,33 +1880,90 @@ HRESULT WINAPI extTexUnload(void *t) typedef struct { LPD3DENUMPIXELFORMATSCALLBACK *cb; LPVOID arg; -} CallbackZBufArg; +} CallbackPixFmtArg; HRESULT WINAPI extZBufferProxy(LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext) { HRESULT res; - OutTraceD3D("EnumZBufferFormats: CALLBACK context=%x %s \n", ((CallbackZBufArg *)lpContext)->arg, ExplainPixelFormat(lpDDPixFmt)); - res = (*(((CallbackZBufArg *)lpContext)->cb))(lpDDPixFmt, ((CallbackZBufArg *)lpContext)->arg); + OutTraceD3D("EnumZBufferFormats: CALLBACK context=%x %s \n", ((CallbackPixFmtArg *)lpContext)->arg, ExplainPixelFormat(lpDDPixFmt)); + res = (*(((CallbackPixFmtArg *)lpContext)->cb))(lpDDPixFmt, ((CallbackPixFmtArg *)lpContext)->arg); OutTraceD3D("EnumZBufferFormats: CALLBACK ret=%x\n", res); return res; } -static HRESULT WINAPI extEnumZBufferFormats(EnumZBufferFormats_Type pEnumZBufferFormats, void *lpd3d, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext) +#define MAXPFTABLESIZE 50 +#define MAXTRIMMEDENTRIES 3 + +typedef struct { + int nEntries; +// LPDDPIXELFORMAT lpPixelFormatEntries; + DDPIXELFORMAT lpPixelFormatEntries[MAXPFTABLESIZE]; +} PixelFormatTable_Type; + +HRESULT WINAPI FillPixelFormatTable(LPDDPIXELFORMAT lpDDPixFmt, LPVOID Arg) +{ + PixelFormatTable_Type *lpPixelFormatTable = (PixelFormatTable_Type *)Arg; + OutTraceD3D("EnumZBufferFormats: FILL CALLBACK entry=%d %s\n", lpPixelFormatTable->nEntries, ExplainPixelFormat(lpDDPixFmt)); + if(lpPixelFormatTable->nEntries >= MAXPFTABLESIZE) return FALSE; + memcpy((LPVOID)&(lpPixelFormatTable->lpPixelFormatEntries[lpPixelFormatTable->nEntries]), (LPVOID)lpDDPixFmt, sizeof(DDPIXELFORMAT)); + lpPixelFormatTable->nEntries ++; + //lpPixelFormatTable->lpPixelFormatEntries = (LPDDPIXELFORMAT)realloc((LPVOID)(lpPixelFormatTable->lpPixelFormatEntries), lpPixelFormatTable->nEntries * sizeof(DDPIXELFORMAT)); + //OutTrace("lp=%x err=%s\n", lpPixelFormatTable->lpPixelFormatEntries, GetLastError()); + return TRUE; +} + +static HRESULT WINAPI extEnumZBufferFormats(int d3dversion, EnumZBufferFormats_Type pEnumZBufferFormats, void *lpd3d, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext) { HRESULT ret; - CallbackZBufArg Arg; - OutTraceD3D("Direct3D::EnumZBufferFormats d3d=%x clsid=%x context=%x\n", lpd3d, riidDevice.Data1, lpContext); - Arg.cb= &lpEnumCallback; - Arg.arg=lpContext; - ret = (*pEnumZBufferFormats)(lpd3d, riidDevice, (LPD3DENUMPIXELFORMATSCALLBACK)extZBufferProxy, (LPVOID)&Arg); + OutTraceD3D("Direct3D::EnumZBufferFormats(%d) d3d=%x clsid=%x context=%x\n", d3dversion, lpd3d, riidDevice.Data1, lpContext); + + if(dxw.dwFlags8 & TRIMTEXTUREFORMATS){ + int iIndex; + int iEnumerated; + PixelFormatTable_Type PixelFormatTable; + PixelFormatTable.nEntries = 0; + //PixelFormatTable.lpPixelFormatEntries = (LPDDPIXELFORMAT)malloc(sizeof(DDPIXELFORMAT)); + ret = (*pEnumZBufferFormats)(lpd3d, riidDevice, (LPD3DENUMPIXELFORMATSCALLBACK)FillPixelFormatTable, (LPVOID)&PixelFormatTable); + OutTraceD3D("EnumZBufferFormats: collected entries=%d\n", PixelFormatTable.nEntries); + // bubble sorting; + while(TRUE){ + BOOL bSorted = FALSE; + for(iIndex=0; iIndex PixelFormatTable.lpPixelFormatEntries[iIndex+1].dwRGBBitCount){ + DDPIXELFORMAT tmp; + tmp = PixelFormatTable.lpPixelFormatEntries[iIndex]; + PixelFormatTable.lpPixelFormatEntries[iIndex] = PixelFormatTable.lpPixelFormatEntries[iIndex+1]; + PixelFormatTable.lpPixelFormatEntries[iIndex+1] = tmp; + bSorted = TRUE; + } + } + if(!bSorted) break; + } + for(iIndex=0, iEnumerated=0; (iIndex < PixelFormatTable.nEntries) && (iEnumerated < MAXTRIMMEDENTRIES); iIndex++){ + if(PixelFormatTable.lpPixelFormatEntries[iIndex].dwRGBBitCount >= 32) break; + if((dxw.dwFlags7 & CLEARTEXTUREFOURCC) && (PixelFormatTable.lpPixelFormatEntries[iIndex].dwFlags & DDPF_FOURCC)) continue; + ret = (*lpEnumCallback)(&(PixelFormatTable.lpPixelFormatEntries[iIndex]), lpContext); + OutTraceD3D("EnumZBufferFormats: CALLBACK entry=%d ret=%x %s\n", iIndex, ret, ExplainPixelFormat(&PixelFormatTable.lpPixelFormatEntries[iIndex])); + if(!ret) break; + iEnumerated++; + } + //free((LPVOID)(PixelFormatTable.lpPixelFormatEntries)); + ret = DD_OK; + } + else { + CallbackPixFmtArg Arg; + Arg.cb= &lpEnumCallback; + Arg.arg=lpContext; + ret = (*pEnumZBufferFormats)(lpd3d, riidDevice, (LPD3DENUMPIXELFORMATSCALLBACK)extZBufferProxy, (LPVOID)&Arg); + } OutTraceE("Direct3D::EnumZBufferFormats res=%x(%s)\n", ret, ExplainDDError(ret)); return ret; } HRESULT WINAPI extEnumZBufferFormats3(void *lpd3d, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext) -{ return extEnumZBufferFormats(pEnumZBufferFormats3, lpd3d, riidDevice, lpEnumCallback, lpContext); } +{ return extEnumZBufferFormats(3, pEnumZBufferFormats3, lpd3d, riidDevice, lpEnumCallback, lpContext); } HRESULT WINAPI extEnumZBufferFormats7(void *lpd3d, REFCLSID riidDevice, LPD3DENUMPIXELFORMATSCALLBACK lpEnumCallback, LPVOID lpContext) -{ return extEnumZBufferFormats(pEnumZBufferFormats7, lpd3d, riidDevice, lpEnumCallback, lpContext); } +{ return extEnumZBufferFormats(7, pEnumZBufferFormats7, lpd3d, riidDevice, lpEnumCallback, lpContext); } // Beware: using service surfaces with DDSCAPS_SYSTEMMEMORY capability may lead to crashes in D3D operations // like Vievport::Clear() in "Forsaken" set in emulation AERO-friendly mode. To avoid the problem, you can @@ -1844,4 +1994,49 @@ HRESULT WINAPI extExecute(void *lpd3d, LPDIRECT3DEXECUTEBUFFER eb, LPDIRECT3DVIE ret=(*pExecute)(lpd3d, eb, vp, dw); if (ret) OutTraceE("Direct3DDevice::Execute res=%x(%s)\n", ret, ExplainDDError(ret)); return DD_OK; -} \ No newline at end of file +} + +static HRESULT CALLBACK lpTextureTrimmer(LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext) +{ + HRESULT res; + OutTraceD3D("EnumTextureFormats: CALLBACK context=%x %s \n", lpContext, ExplainPixelFormat(lpDDPixFmt)); + if(lpDDPixFmt->dwFlags & DDPF_FOURCC) + res = DD_OK; + else + res = (*(((CallbackPixFmtArg *)lpContext)->cb))(lpDDPixFmt, ((CallbackPixFmtArg *)lpContext)->arg); + return res; +} + +static HRESULT CALLBACK lpTextureDumper(LPDDPIXELFORMAT lpDDPixFmt, LPVOID lpContext) +{ + OutTraceD3D("EnumTextureFormats: CALLBACK context=%x %s \n", lpContext, ExplainPixelFormat(lpDDPixFmt)); + return TRUE; +} + +HRESULT WINAPI extEnumTextureFormats(int d3dversion, EnumTextureFormats_Type pEnumTextureFormats, void *lpd3dd, LPD3DENUMPIXELFORMATSCALLBACK lptfcallback, LPVOID arg) +{ + HRESULT res; + OutTrace("EnumTextureFormats(%d): lpd3dd=%x cb=%x arg=%x\n", d3dversion, lpd3dd, lptfcallback, arg); + if(IsDebug) (*pEnumTextureFormats)(lpd3dd, lpTextureDumper, arg); + + if(dxw.dwFlags7 & CLEARTEXTUREFOURCC){ + CallbackPixFmtArg Arg; + Arg.cb= &lptfcallback; + Arg.arg=arg; + res = (*pEnumTextureFormats)(lpd3dd, lpTextureTrimmer, (LPVOID)&Arg); + } + else{ + res = (*pEnumTextureFormats)(lpd3dd, lptfcallback, arg); + } + if(res) OutTrace("EnumTextureFormats: res=%x(%s)\n", res, ExplainDDError(res)); + return res; +} + +HRESULT WINAPI extEnumTextureFormats1(void *lpd3dd, LPD3DENUMPIXELFORMATSCALLBACK lptfcallback, LPVOID arg) +{ return extEnumTextureFormats(1, pEnumTextureFormats1, lpd3dd, lptfcallback, arg); } +HRESULT WINAPI extEnumTextureFormats2(void *lpd3dd, LPD3DENUMPIXELFORMATSCALLBACK lptfcallback, LPVOID arg) +{ return extEnumTextureFormats(2, pEnumTextureFormats2, lpd3dd, lptfcallback, arg); } +HRESULT WINAPI extEnumTextureFormats3(void *lpd3dd, LPD3DENUMPIXELFORMATSCALLBACK lptfcallback, LPVOID arg) +{ return extEnumTextureFormats(3, pEnumTextureFormats3, lpd3dd, lptfcallback, arg); } +HRESULT WINAPI extEnumTextureFormats7(void *lpd3dd, LPD3DENUMPIXELFORMATSCALLBACK lptfcallback, LPVOID arg) +{ return extEnumTextureFormats(7, pEnumTextureFormats7, lpd3dd, lptfcallback, arg); } diff --git a/dll/ole32.cpp b/dll/ole32.cpp index 99f84f1..b6f92a0 100644 --- a/dll/ole32.cpp +++ b/dll/ole32.cpp @@ -153,7 +153,7 @@ HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, break; case 0x47d4d946: // CLSID_DirectSound OutTraceDW("CoCreateInstance: CLSID_DirectSound object\n"); - HookDirectSoundObj((LPDIRECTSOUND *)ppv); + HookDirectSoundObj((LPDIRECTSOUND *)ppv); break; case 0x4fd2a832: // CLSID_DirectDrawFactory if ((rclsid.Data2==0x86c8) && (rclsid.Data3 == 0x11d0)){ diff --git a/dll/user32.cpp b/dll/user32.cpp index 31b505a..7e2184a 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -2121,7 +2121,8 @@ BOOL WINAPI extClipCursor(RECT *lpRectArg) OutTrace("ClipCursor: rect=(NULL)\n"); } - if (!(dxw.dwFlags1 & ENABLECLIPPING)) return 1; + if (!(dxw.dwFlags1 & DISABLECLIPPING)) return TRUE; + if ((dxw.dwFlags8 & CLIPLOCKED) && (lpRectArg == NULL)) return TRUE; if(lpRectArg){ Rect=*lpRectArg; @@ -2150,12 +2151,12 @@ BOOL WINAPI extClipCursor(RECT *lpRectArg) BOOL WINAPI extGetClipCursor(LPRECT lpRect) { - // v2.1.93: if ENABLECLIPPING, return the saved clip rect coordinates + // v2.1.93: if DISABLECLIPPING, return the saved clip rect coordinates BOOL ret; // proxy.... - if (!(dxw.dwFlags1 & ENABLECLIPPING)) { + if (!(dxw.dwFlags1 & DISABLECLIPPING)) { ret=(*pGetClipCursor)(lpRect); // v2.03.11: fix for "SubCulture" mouse movement if(lpRect && dxw.Windowize) *lpRect = dxw.GetScreenRect(); diff --git a/dll/winproc.cpp b/dll/winproc.cpp index 7a76d33..5d8b08f 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -384,8 +384,8 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp dxw.dwFlags1 &= ~LOCKWINPOS; } while((*pShowCursor)(1) < 0); - if(dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor(); - if(dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL); + if((dxw.dwFlags1 & CLIPCURSOR) && !(dxw.dwFlags8 & CLIPLOCKED)) dxw.EraseClipCursor(); + if(dxw.dwFlags1 & DISABLECLIPPING) dxw.EraseClipCursor(); break; case WM_EXITSIZEMOVE: if(IsToBeLocked){ @@ -394,7 +394,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } if((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while((*pShowCursor)(0) >= 0); if(dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0); - if(dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion); + if(dxw.dwFlags1 & DISABLECLIPPING) extClipCursor(lpClipRegion); if(dxw.dwFlags2 & REFRESHONRESIZE) dxw.ScreenRefresh(); if(dxw.dwFlags4 & HIDEDESKTOP) dxw.HideDesktop(dxw.GethWnd()); if(dxw.dwFlags5 & CENTERTOWIN) { @@ -489,12 +489,12 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_SETFOCUS: OutTraceDW("WindowProc: hwnd=%x GOT FOCUS\n", hwnd); if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); - if (dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion); + if (dxw.dwFlags1 & DISABLECLIPPING) extClipCursor(lpClipRegion); break; case WM_KILLFOCUS: OutTraceDW("WindowProc: hwnd=%x LOST FOCUS\n", hwnd); - if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor(); - if (dxw.dwFlags1 & ENABLECLIPPING) (*pClipCursor)(NULL); + if((dxw.dwFlags1 & CLIPCURSOR) && !(dxw.dwFlags8 & CLIPLOCKED)) dxw.EraseClipCursor(); + if (dxw.dwFlags1 & DISABLECLIPPING) dxw.EraseClipCursor(); break; case WM_SYSCOMMAND: // v2.03.56.fix1 by FunkyFr3sh: ensure that "C&C Red Alert 2" receives the WM_SYSCOMMAND / SC_CLOSE message diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index 3bbf77a..8f3e2a1 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -34,6 +34,7 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset); DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt); DDX_Check(pDX, IDC_ENUM16BITMODES, cTarget->m_Enum16bitModes); + DDX_Check(pDX, IDC_TRIMTEXTUREFORMATS, cTarget->m_TrimTextureFormats); // Direct3D window tweaks DDX_Check(pDX, IDC_FIXD3DFRAME, cTarget->m_FixD3DFrame); diff --git a/host/TabDirectX2.cpp b/host/TabDirectX2.cpp index 2e38076..b25ce6e 100644 --- a/host/TabDirectX2.cpp +++ b/host/TabDirectX2.cpp @@ -35,6 +35,7 @@ void CTabDirectX2::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); DDX_Check(pDX, IDC_FORCESHEL, cTarget->m_ForcesHEL); + DDX_Check(pDX, IDC_NOHALDEVICE, cTarget->m_NoHALDevice); DDX_Check(pDX, IDC_MINIMALCAPS, cTarget->m_MinimalCaps); DDX_Check(pDX, IDC_SETZBUFFERBITDEPTHS, cTarget->m_SetZBufferBitDepths); DDX_Check(pDX, IDC_DEINTERLACE, cTarget->m_Deinterlace); diff --git a/host/TabInput.cpp b/host/TabInput.cpp index 13fbac0..9bc5602 100644 --- a/host/TabInput.cpp +++ b/host/TabInput.cpp @@ -31,8 +31,8 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Radio(pDX, IDC_CURSORAUTOMATIC, cTarget->m_MouseVisibility); // Cursor Handling DDX_Check(pDX, IDC_MODIFYMOUSE, cTarget->m_ModifyMouse); - DDX_Check(pDX, IDC_ENABLECLIPPING, cTarget->m_EnableClipping); - DDX_Check(pDX, IDC_CLIPCURSOR, cTarget->m_CursorClipping); + //DDX_Check(pDX, IDC_DISABLECLIPPING, cTarget->m_EnableClipping); + //DDX_Check(pDX, IDC_CLIPCURSOR, cTarget->m_CursorClipping); DDX_Check(pDX, IDC_KEEPCURSORWITHIN, cTarget->m_KeepCursorWithin); DDX_Check(pDX, IDC_KEEPCURSORFIXED, cTarget->m_KeepCursorFixed); DDX_Check(pDX, IDC_MESSAGEPROC, cTarget->m_MessageProc); @@ -41,7 +41,8 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown); DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse); DDX_Check(pDX, IDC_VIRTUALJOYSTICK, cTarget->m_VirtualJoystick); - //DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation); + // Cursor Clipper + DDX_Radio(pDX, IDC_CLIPPERAUTO, cTarget->m_MouseClipper); // DirectInput DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI); DDX_Check(pDX, IDC_HOOKDI8, cTarget->m_HookDI8); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index c949468..ff06fff 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -31,6 +31,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_DxFilterMode = 0; // default: ddraw filtering m_DCEmulationMode = 0; // default: no emulation m_MouseVisibility = 0; + m_MouseClipper = 0; m_OffendingMessages = 0; m_TextureHandling = 0; m_HookDI = FALSE; @@ -58,6 +59,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SuppressIME = FALSE; m_SuppressD3DExt = FALSE; m_Enum16bitModes = FALSE; + m_TrimTextureFormats = FALSE; m_SetCompatibility = TRUE; // default true !! m_AEROBoost = TRUE; // default true !! m_DiabloTweak = FALSE; @@ -148,8 +150,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_IndependentRefresh = FALSE; m_TextureFormat = FALSE; m_FixWinFrame = FALSE; - m_EnableClipping = FALSE; - m_CursorClipping = FALSE; + //m_EnableClipping = FALSE; + //m_CursorClipping = FALSE; m_VideoToSystemMem = FALSE; m_FixTextOut = FALSE; m_SharedDC = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 66784fa..036c5b1 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -33,6 +33,7 @@ public: int m_DxFilterMode; int m_DCEmulationMode; int m_MouseVisibility; + int m_MouseClipper; int m_OffendingMessages; int m_TextureHandling; int m_SonProcessMode; @@ -110,8 +111,8 @@ public: BOOL m_IndependentRefresh; BOOL m_TextureFormat; BOOL m_FixWinFrame; - BOOL m_EnableClipping; - BOOL m_CursorClipping; + //BOOL m_EnableClipping; + //BOOL m_CursorClipping; BOOL m_VideoToSystemMem; BOOL m_FixTextOut; BOOL m_SharedDC; @@ -234,6 +235,7 @@ public: BOOL m_DisableDisableAltTab; BOOL m_NoImagehlp; BOOL m_ForcesHEL; + BOOL m_NoHALDevice; BOOL m_MinimalCaps; BOOL m_SetZBufferBitDepths; BOOL m_ForcesSwapEffect; @@ -259,7 +261,7 @@ public: BOOL m_BlackWhite; BOOL m_SuppressD3DExt; BOOL m_Enum16bitModes; - //BOOL m_Force16BPP; + BOOL m_TrimTextureFormats; BOOL m_LimitScreenRes; BOOL m_InitialRes; BOOL m_MaximumRes; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 3604fb64a23b9ed33d8ed772a76ab7d9a45b0462..aebc35a24ccefd42e1149103f49e4d32b6b7d2ab 100644 GIT binary patch delta 28472 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 diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index fb39960..a30a06d 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -39,6 +39,7 @@ BOOL gWarnOnExit = FALSE; BOOL gTransientMode = FALSE; BOOL gAutoHideMode = FALSE; BOOL gQuietMode = FALSE; +BOOL gMustDie = FALSE; int iProgIndex; extern char m_ConfigFileName[20+1] = "dxwnd.ini"; diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 4482799a876fbb8f42589c3b7cbf4a86f64e34bf..ad32bd7a4e5271d3e6ea43121a0d3c5cc5ddfc0b 100644 GIT binary patch delta 791 zcmYjPO-NKx6h6n9#u=q>oDwS&GYqLg-kW)E-i$3`aFir<`Wekusi|aT{-hNYX4XBM2i*@Wh+721)cYNfn4rA_a46U-Fv_DeOR);S+*xj z67;>dv@rtx&;{L40t3(iH+UW7Ob4Gkp@(2z;bGtw>o_wZMjDQO{C6Zt$3Zl9oa#Cc?7}~91l?5@1k5cXa>CsGTphN zio7S7Zy+sUs1ZTJGBI3)#o2yPm{Xy?xF%NOm}g)xOwM>2wcIM)t})MlE(4WY$J$iE zaaJiL<`cL#+f0yr{phYuxJhct;i2`01L@-TZSP`-(dv-F$HNUOrMfi{-GjEw@)&m7 zsJGuHlo(#H$l%Y+#L$a6ew(hYLLV>g)_Y9JF}o;wh-(hXAYt)!8XBI>7tP}sH!BqI zh`;0b*%2_lr!nf}eN7Zh;3JEd1z(yvVle%gz-dttLmS^Ii~Xahicga`#|>7*?J4{v zo=>1%j7(vr@lcVR#yOID?DQjAnVFoyp&aqE9S^yx*jc?i+t`1Xc@97qrPf?xr3?$4 z9@8F***?jzhyHQzF?LuT`!mEYy~cIt4YzLfX9KIfi3+jeO;AgzOK0?7I%V#RpLO(` PLa@xfx0x?&Rn delta 453 zcmY*VOGq1G5T0q`vMv#9BPa?QJ$VQvo2>B}5G;trNA%=LY8647)w_xA!!~gvtCki6B4YL8MG%n)f>69!JojJqA_MbczHer}{UiA#E2n(l$hTL;&G+c0 z%zC*MT~EkZN9j$~Dm8~*dF!Aa{GdYcIclKs>o}@(m|AlMK%=Z(MmfETzNbx>3Sqk5 zj?jnQqKZ~{2W{Yk7Kp!nr<__-q9?MNb9Io?gYD3O$5>+wCU)i~k2n Cd7laZ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 5e993d345fe3e51eb12f4b729aa662bc14ed6962..e34e54da67de6d487d7567954125163997633128 100644 GIT binary patch delta 11496 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 XB4hAbf3dyC$JmZvBYPCDa_9d6lMmCk delta 2858 zcma)8eQZ=!7Qg4sd#}@J9cEu=U|Pzgw$qCCgW7GSTWWbN0;M0r2oVgk z3oK(rF~%Zts<(-|(5+fcB&6`v;SZwINURu@iW`;~G-%w-Cc8@1s({$pb7$^!XW4(a zli!?kfA{z9$GPX;_rk~Z@Cj|d3Hs6cESowRi^XuI?HNxGV{8{;C!wG4N5U(3*|yEO zf7K1g=Qf@J8!^nn9`zKytKN!XyNbWp#+ADiY|&eXSv=*)y-+xGp#98y+*1TMC`;HUB5-s^wA z(F_iZdUJ8Dw-A3W&BpWIPP|m=#ewWXG_xyYR}Ne8x*9Y~Z?~e^Z`kz5>EYRV*fZ;t z4mIQ}{|$%lw5EfLIA@Z>kUy*~q#Zbbe|Wjj@)h>#IFg=cMT?&Ve7Cd`{J5jE5$nnt zxH$)Q;COloKT-hYc)qN2t{#sC`)7QcJ*-zdpir=5v0D{Jv4|J@?QdiV$CWjbAefTD zpY4VvR&-8>T^%8v<*z<(!@n3F{!KR&TV}1QWQsVZMnu1vh;<5H@%iy!-77jDG9Lh5CZpG-^tpYMSUfpEc(S4f7M>XTm5g_A*(K#=nrgO88aO2{8gw7$2Pm zH(5nPpV@HhuotTNMLYZs^CqT?JyUsbF1YdOAGaU7>VRXfnW|fKb%44RwqIIoJA4i% zpIiIsu_LNWRfx6hZ`+}%k-SBO#ZtF~Y!jiG&_ZY>1PDtBLBgGcWrXE~Hi8&KV84Rx z?<|WSMr-7qpbiY@A6lj5(*o8blq|(yPL5SE`7!Vn1@JU9i8XwV;X*-UQiJ_``4k&v(E|JY1HqGj@&!`Bv z8Q%xxz@PDh!Hs^H5G#4p2j2qh;WsF-nI^SMff@E>c=(?b@WSNLwaqZBf(n5MIG|bK zBbjgp)=+@vV_+;V(&U1Cg`Y8?W7r7_ugHQPe!u|%9Gq}RdfY&VU?k?`PCxYXlOCuQ zHFPZY^RtC;3-8DRzi7*in03$uyu*Y|7_RTgm`=OUNjX}>R!3qU7|rAZn_%I*>x&pY z`#+@ucCbaxhGqC95L%47F!QmoE z=NF!&Fq(Z(iR16h=7%raHJO8f|^k3<= zuIdbb5>KgtMQY&&5i+swSwMe5akmR9)>!nJ(rcu9RXE5rJk zvvAOzn~X=)NJt0UR8&C(cI+c&(cE1^|syLpS5vXjfL) zcuxZaU_)|DKG6VeP&8EyEr6gVUUBP_6g(ICaRFrLm{*&JM;r#0t4=h3xQ$-5@iU&E zMb}GABybm7&6czE6s|RVbS139j?0-d5{+dyP5S%FACk%@cA-I`@QQ0^qIq@m+zT{3zPUyyH3Zndt ztY{WGx(9a)j{QrLLMZl56g%0ZFkNyk$qC&&$E+lhEsH}O74i{L{z_!+}A0(zf11lNu5}KE}eE!O2{TxTq-$J za$_gIRqS8`8Du7ujpk}p1$E@flags2 |= SHOWHWCURSOR; break; } + switch(dlg->m_MouseClipper){ + case 0: break; + case 1: t->flags |= DISABLECLIPPING; break; + case 2: t->flags |= CLIPCURSOR; break; + case 3: t->flags |= CLIPCURSOR; t->flags8 |= CLIPLOCKED; break; + } + switch(dlg->m_OffendingMessages){ case 0: break; case 1: t->flags3 |= FILTERMESSAGES; break; @@ -379,6 +387,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME; if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_Enum16bitModes) t->flags7 |= ENUM16BITMODES; + if(dlg->m_TrimTextureFormats) t->flags8 |= TRIMTEXTUREFORMATS; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; if(dlg->m_AEROBoost) t->flags5 |= AEROBOOST; if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK; @@ -392,6 +401,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_DisableDisableAltTab) t->flags7 |= DISABLEDISABLEALTTAB; if(dlg->m_NoImagehlp) t->flags5 |= NOIMAGEHLP; if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL; + if(dlg->m_NoHALDevice) t->flags8 |= NOHALDEVICE; if(dlg->m_MinimalCaps) t->flags3 |= MINIMALCAPS; if(dlg->m_SetZBufferBitDepths) t->flags6 |= SETZBUFFERBITDEPTHS; if(dlg->m_ForcesSwapEffect) t->flags6 |= FORCESWAPEFFECT; @@ -425,8 +435,8 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH; if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT; if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME; - if(dlg->m_EnableClipping) t->flags |= ENABLECLIPPING; - if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR; + //if(dlg->m_EnableClipping) t->flags |= DISABLECLIPPING; + //if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR; if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY; if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT; if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE; @@ -601,6 +611,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->flags & HIDEHWCURSOR) dlg->m_MouseVisibility = 1; if(t->flags2 & SHOWHWCURSOR) dlg->m_MouseVisibility = 2; + dlg->m_MouseClipper = 0; + if(t->flags & DISABLECLIPPING) dlg->m_MouseClipper = 1; + if(t->flags & CLIPCURSOR) dlg->m_MouseClipper = 2; + if(t->flags8 & CLIPLOCKED) dlg->m_MouseClipper = 3; + dlg->m_OffendingMessages = 0; if(t->flags3 & FILTERMESSAGES) dlg->m_OffendingMessages = 1; if(t->flags3 & DEFAULTMESSAGES) dlg->m_OffendingMessages = 2; @@ -673,6 +688,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0; dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0; dlg->m_Enum16bitModes = t->flags7 & ENUM16BITMODES ? 1 : 0; + dlg->m_TrimTextureFormats = t->flags8 & TRIMTEXTUREFORMATS ? 1 : 0; dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0; dlg->m_AEROBoost = t->flags5 & AEROBOOST ? 1 : 0; dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0; @@ -686,6 +702,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_DisableDisableAltTab = t->flags7 & DISABLEDISABLEALTTAB ? 1 : 0; dlg->m_NoImagehlp = t->flags5 & NOIMAGEHLP ? 1 : 0; dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0; + dlg->m_NoHALDevice = t->flags8 & NOHALDEVICE ? 1 : 0; dlg->m_MinimalCaps = t->flags3 & MINIMALCAPS ? 1 : 0; dlg->m_SetZBufferBitDepths = t->flags6 & SETZBUFFERBITDEPTHS ? 1 : 0; dlg->m_ForcesSwapEffect = t->flags6 & FORCESWAPEFFECT ? 1 : 0; @@ -738,8 +755,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0; dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 1 : 0; dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0; - dlg->m_EnableClipping = t->flags & ENABLECLIPPING ? 1 : 0; - dlg->m_CursorClipping = t->flags & CLIPCURSOR ? 1 : 0; + //dlg->m_EnableClipping = t->flags & DISABLECLIPPING ? 1 : 0; + //dlg->m_CursorClipping = t->flags & CLIPCURSOR ? 1 : 0; dlg->m_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0; dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0; dlg->m_SharedDC = t->flags6 & SHAREDDC ? 1 : 0; @@ -1375,14 +1392,6 @@ void CDxwndhostView::OnInitialUpdate() pTitles = &PrivateMaps[0]; pTargets= &TargetMaps[0]; - // Hot Keys - //DWORD dwKey; - //extern Key_Type HKeys[]; - //extern KeyCombo_Type HKeyCombo[]; - //for(int i=0; HKeys[i].iLabelResourceId; i++){ - // dwKey = GetPrivateProfileInt("keymapping", HKeys[i].sIniLabel, 0, gInitPath); - // if(dwKey) if(!RegisterHotKey(this->GetSafeHwnd(), i, MOD_ALT+MOD_SHIFT+MOD_CONTROL, dwKey)) VKeyError(HKeys[i].sIniLabel); - //} UpdateHotKeys(); // Transient mode @@ -2337,23 +2346,10 @@ void CDxwndhostView::OnClearAllLogs() _unlink(FilePath); } -DWORD WINAPI SilentUpdate(CSystemTray *Tray) +DWORD WINAPI WaitForDeath(LPVOID arg) { - int DxStatus; - int IdleCount; - IdleCount=0; - while (TRUE) { - // once a second ... - Sleep(1000); - DxStatus=GetHookStatus(NULL); - if (DxStatus != DXW_RUNNING){ - IdleCount++; - if(IdleCount >= 2) exit(0); - } - else { - IdleCount=0; - } - } + while(!gMustDie) Sleep(1000); + exit(0); } DWORD WINAPI TrayIconUpdate(CSystemTray *Tray) @@ -2370,6 +2366,11 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray) while (TRUE) { // once a second ... Sleep(1000); + if(gTransientMode && gMustDie) { + Tray->HideIcon(); + delete(Tray->GetAncestor(GA_ROOTOWNER)); + exit(0); + } DxStatus=GetHookStatus(NULL); switch (DxStatus){ case DXW_IDLE: IconId=IDI_DXIDLE; Status="DISABLED"; break; @@ -2383,11 +2384,6 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray) Tray->SetIcon(IconId); IdleCount++; if(IdleCount == 2) { - if(gTransientMode) { - Tray->HideIcon(); - delete(Tray->GetAncestor(GA_ROOTOWNER)); - exit(0); - } if(gAutoHideMode) { Tray->MaximiseFromTray(pParent, FALSE); } } @@ -2444,7 +2440,7 @@ void CDxwndhostView::OnGoToTrayIcon() NIIF_INFO, 10)){ MessageBoxLang(DXW_STRING_TRAYFAIL, DXW_STRING_ERROR, MB_OK); // error path: if can't create a system tray icon, transient logic must be silently placed here - if (gTransientMode) StatusThread= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SilentUpdate, (LPVOID)NULL, 0, &dwThrdId); + if(gTransientMode) StatusThread= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WaitForDeath, (LPVOID)NULL, 0, &dwThrdId); return; } IconId=(menu->GetMenuState(ID_HOOK_START, MF_BYCOMMAND)==MF_CHECKED)?IDI_DXWAIT:IDI_DXIDLE; @@ -2636,6 +2632,56 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) CListView::OnRButtonDown(nFlags, point); } +typedef struct { + char *path; + char *launch; +} PROCESSMAP; + +static DWORD WINAPI TransientWaitForChildDeath(void *p) +{ + PROCESSMAP *ProcessMap = (PROCESSMAP *)p; + BOOL bIsSomeoneAlive; + int ret; + char sPath[MAX_PATH]; + char sLaunch[MAX_PATH]; + char sTemp[MAX_PATH]; + char *lpProcName, *lpNext; + + // strip full pathname and keep executable name only + strcpy(sPath, ""); + if(ProcessMap->path[0]){ + strncpy(sTemp, ProcessMap->path, MAX_PATH); + lpProcName=sTemp; + while (lpNext=strchr(lpProcName,'\\')) lpProcName=lpNext+1; + strncpy(sPath, lpProcName, MAX_PATH); + } + strcpy(sLaunch, ""); + if(ProcessMap->launch[0]){ + strncpy(sTemp, ProcessMap->launch, MAX_PATH); + lpProcName=sTemp; + while (lpNext=strchr(lpProcName,'\\')) lpProcName=lpNext+1; + strncpy(sLaunch, lpProcName, MAX_PATH); + } + + Sleep(3000); // Wait for process creation - necessary? + + while(TRUE){ + Sleep(2000); + bIsSomeoneAlive = FALSE; + if(sPath[0]) { + if (!(ret=KillProcByName(sPath, FALSE))) bIsSomeoneAlive = TRUE; + } + if(sLaunch[0]) { + if (!(ret=KillProcByName(sLaunch, FALSE))) bIsSomeoneAlive = TRUE; + } + if(!bIsSomeoneAlive) { + break; + } + } + gMustDie = TRUE; + return 0; +} + static char *ExceptionCaption(DWORD ec) { char *c; @@ -3186,6 +3232,8 @@ static void MakeHiddenFile(char *sTargetPath) CloseHandle(hTempFile); } +PROCESSMAP pm; + void CDxwndhostView::OnRun() { CListCtrl& listctrl = GetListCtrl(); @@ -3286,6 +3334,12 @@ void CDxwndhostView::OnRun() CloseHandle(pinfo.hThread); // no longer needed, avoid handle leakage } + if(gTransientMode){ + pm.launch = &(PrivateMaps[i].launchpath[0]); + pm.path = &(TargetMaps[i].path[0]); + CreateThread( NULL, 0, TransientWaitForChildDeath, &pm, 0, NULL); + } + // wait & recover CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RecoverTargetMaps, (LPVOID)TargetMaps, 0, NULL); if(gAutoHideMode) this->OnGoToTrayIcon(); diff --git a/host/host.aps b/host/host.aps index 6a498d03e85fef7ab1de3ee32e169354191a7c48..caebb6490da0f0fc3bae79954718d594cc014f62 100644 GIT binary patch delta 886 zcmX}oPe>GD7zXhDmJI|M=@1bi%<5W6G^>;c4G%>^B27q_E-Ndzf`=X5bXz(UdFWu^ z;BL?2y7tF^fgT#$ZMSkeMRf4cKt_m%>JS|w7%=M4p`d4n`38m`5AXYaAMbqmU%@QD zu;|FOM55c9fk5JHtnbFv@kBH+ni)+_q+*%V@y;{xo}T#B z8nf%J1q|ex+;q3{HTOBhxKq50rb5I^(}flUIrp#$1%0 ze~V$Smb@?T|Kg{?2eS6YPhAh&yc6qwI{HY~OquR29rwnr`{~D$92;7e-4A}cxFWl+ zR^)moSBJb?c2|#iX<&_KE7#U;H;NAY+&m#Ra<@7TbcsOVH}t2f=!Zd@VbWn(v*f=2H^r`s?n_osufDEFazaOf#0)%u4v>gV$36qv! z(GYCf4TqkC@=_IfXfz3(zK226FzIVpGy$6?;m~#{TdHV-MmM0-Lonzkm~P#2wP^|t dZH7{-zl>Ik1pm(AO06|GGmr84!-(B6*>0@(k4;2PVA}xq?2qM@}a0La?U0oK14jwu* zAhq%ceq`%cfdl5(uDVO%sY3%65gj5-Iz@tYu|t7K|J|9{%a4cWdH(PF{%7LHY~q;3 zU7~N?UEQ#^DhQz)!It5B{UL9tJJ#Jd5Dvx~I_j@>T));48ye~F3ib>PMRV{Db_v49 z;KWn01#9t1B;v(6^)g2-c`*L1fMj^K9cL%2E%k8HZK{g|_R_vf?T z=zP@b+*+`c?FIW?HH#0d^wZ*bOSLXpXC+@R`3glJey!GuE8`s<6eCDP(Hq22RiXK4C+-@;@a!DEI^(8!KLC%%J0;YlqHYR&Kt2x^U0Eg42j1rFk`F~bGaQ9Rb_zPt0fWLuKb(Hr zlU8Ygyu-yQsKhV=#Lws@4nrfpg-+~&K@8(?ht6$AQL`e2m>|?aO>?%=iYKj#v|Jzv n<>*aw@jEnP9rPRxVibo&7vxO#TdJ9AMnAnhQzecelHvaW$0k|Q diff --git a/host/resource b/host/resource index 9f5dff1c82b749f3ac2f5b8bb73153613aef75fc..1fca39a2a7a8d19e8c77d520adccba1fe2aa7709 100644 GIT binary patch delta 287 zcmeC1$b4%G^9C>Z$pu0zldVj-CWpyuP0o{J+uR|~k}=t!oon)$8kNZg%q)|oIus`R zb@FXq(y@tk@~sJ6oA>l-@k~Ca&o=o%JI7>!F0RSb+BF!>CpRvVMiDh=0_z9LY~+!i ze9w}NHHg8J!FRG}iuB|q%3@%%o%9q0{TTciJQy4qd>C99Tp7X`JSW#{X-;-vVVS(8 zL~gR3G6#16P&^2zB9tLyvSFnvNGH(LKp}aMEGIZ$y~ualOyD{CLfSw+uSD4mNEIkOry!4926$|b#hHMXy=-IrbcD5 z0W-_weeEDIk;w*45dI^1h0XWc53q6vF*q`~FnBWfGZ;?ZD5eWiyt%G7glF@nIV*Gl D77Qix