From 8e93278b0c08f127ebb277c22562d9381e7ca15e Mon Sep 17 00:00:00 2001 From: gho tik Date: Tue, 20 May 2014 12:39:14 -0400 Subject: [PATCH] v2_02_75_src Former-commit-id: d841b5cdff8c56dc62484b0bf26910cd70cce717 --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 6 --- build/exports/Rollcage (3DFX).dxw | 27 ++++++++++++ build/exports/Rollcage (D3D).dxw | 27 ++++++++++++ build/exports/Rollcage 2 (D3D).dxw | 27 ++++++++++++ build/readme-relnotes.txt | 7 +++ dll/ddraw.cpp | 47 ++++++++++++-------- dll/dxwcore.cpp | 68 ++++++++++++----------------- dll/dxwnd.cpp | 6 ++- dll/dxwnd.vs2008.suo | Bin 43520 -> 74656 bytes dll/hd3d.cpp | 62 +++++++++++++++++++++----- dll/hd3d7.cpp | 2 +- dll/kernel32.cpp | 16 +++---- dll/winmm.cpp | 6 +-- dll/wndproc.cpp | 19 ++++---- host/Resource.h | 1 + host/TabDirectX.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 173008 -> 173124 bytes host/dxwndhost.rc | 1 + host/dxwndhost.vs2008.suo | Bin 169472 -> 175104 bytes host/dxwndhostView.cpp | 16 ++++--- 25 files changed, 246 insertions(+), 104 deletions(-) create mode 100644 build/exports/Rollcage (3DFX).dxw create mode 100644 build/exports/Rollcage (D3D).dxw create mode 100644 build/exports/Rollcage 2 (D3D).dxw diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 9cc4aca..5b35bf2 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -142,6 +142,7 @@ #define HOTPATCH 0x04000000 // Use hot patching technique to handle obfuscated IAT #define ENABLEHOTKEYS 0x08000000 // Enables hot keys #define HOTPATCHALWAYS 0x10000000 // Force hot patching to every call +#define NOD3DRESET 0x20000000 // Disables D3D8/9 D3DDevice::Reset method // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index c94aabe..ef61201 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b7f9b28cc1d19e29759f70cf2f5187a21319a31a0d8bd24d36c3314161d958c -size 483328 +oid sha256:0abd5d664eea54b2046da9cf7c3b556569a5bbd8c65eb87e1b088dff67641ef1 +size 483840 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index e470991..b44d478 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d705eb95e5834c95b4be2e8639c08df2c027df4edec2b0e3f2247e9f05da5d67 -size 539136 +oid sha256:11f3d90b87b33ec400bd96219a0786300f2dbd21935e72a2b859317f887696e0 +size 540160 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index b74c8f2..2f9754f 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -3,9 +3,3 @@ timetoggle=0x72 altf4=0x73 timeslow=0x74 timefast=0x75 - -[window] -posx=50 -posy=50 -sizx=320 -sizy=200 diff --git a/build/exports/Rollcage (3DFX).dxw b/build/exports/Rollcage (3DFX).dxw new file mode 100644 index 0000000..1376e5e --- /dev/null +++ b/build/exports/Rollcage (3DFX).dxw @@ -0,0 +1,27 @@ +[target] +title0=Rollcage (3DFX) +path0=D:\Games\Rollcage\Glide\ROLLCAGE.EXE +launchpath0=D:\Games\Rollcage\RollCage.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=150994976 +flagg0=1207959552 +flagh0=20 +flagi0=136314884 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Rollcage (D3D).dxw b/build/exports/Rollcage (D3D).dxw new file mode 100644 index 0000000..bb50259 --- /dev/null +++ b/build/exports/Rollcage (D3D).dxw @@ -0,0 +1,27 @@ +[target] +title0=Rollcage (D3D) +path0=D:\Games\Rollcage\Direct3D\Rollcage.exe +launchpath0=D:\Games\Rollcage\RollCage.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=150994976 +flagg0=134217728 +flagh0=20 +flagi0=136314884 +tflag0=6147 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Rollcage 2 (D3D).dxw b/build/exports/Rollcage 2 (D3D).dxw new file mode 100644 index 0000000..62cb48f --- /dev/null +++ b/build/exports/Rollcage 2 (D3D).dxw @@ -0,0 +1,27 @@ +[target] +title0=Rollcage 2 (D3D) +path0=D:\Games\Rollcage 2\BIN\Rollcage D3D.exe +launchpath0=D:\Games\Rollcage 2\Rollcage.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217760 +flagg0=134217728 +flagh0=20 +flagi0=138412036 +tflag0=6147 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 91e0e53..a107f21 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -493,3 +493,10 @@ fix: eliminated dialogs with timer warning messages (to be investigated...) fix: moved "no banner" flag to main tab again fix: potential string violation, possible cause for flash crash? +v2.02.75 +Hooked D3DDevice::ShowCursor method to apply force show/hide cursor (preliminary...) +fix: dynamic allocation for WndProc stack to eliminate predefined limit of 256 entries. Star Wars Rebellion uses more than 256. +added: "Suppress D3D8/9 Reset" flag +fix: improved show FPS and Time Stretch overlay so that the two overlays won't overlap each other +fix: bug in ddraw "Locked surface" mode preventing output on screen +fix: fixed bug in critical common portion of the code that was crashing even unhooked programs (namely, Flash Player, ...) diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 1015ead..1f3e0f9 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1524,7 +1524,8 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I //OutTrace("DirectDrawCreate: drivercaps=%x(%s) emulcaps=%x(%s)\n", DriverCaps.ddsCaps, "???", EmulCaps.ddsCaps, "???"); } - return 0; + lpPrimaryDD=*lplpdd; + return DD_OK; } HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, @@ -1586,9 +1587,19 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, OutTraceDDRAW("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); HookDDSession(lplpdd, dxw.dwDDVersion); - lpPrimaryDD=*lplpdd; - return 0; + if(IsDebug && (dxw.dwTFlags & OUTPROXYTRACE)){ + DDCAPS DriverCaps, EmulCaps; + memset(&DriverCaps, 0, sizeof(DriverCaps)); + DriverCaps.dwSize=sizeof(DriverCaps); + memset(&EmulCaps, 0, sizeof(EmulCaps)); + EmulCaps.dwSize=sizeof(EmulCaps); + (LPDIRECTDRAW)(*lplpdd)->GetCaps(&DriverCaps, &EmulCaps); + //OutTrace("DirectDrawCreate: drivercaps=%x(%s) emulcaps=%x(%s)\n", DriverCaps.ddsCaps, "???", EmulCaps.ddsCaps, "???"); + } + + lpPrimaryDD=*lplpdd; + return DD_OK; } HRESULT WINAPI extInitialize(LPDIRECTDRAW lpdd, GUID FAR *lpguid) @@ -3766,9 +3777,10 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC } res=(*pUnlock)(lpdds, lprect); + if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); if (IsPrim && res==DD_OK) sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } @@ -3807,23 +3819,24 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR } if(dxw.dwFlags1 & LOCKEDSURFACE){ - (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); - if(lpdds==lpDDSPrim){ - RECT client; - POINT upleft={0,0}; - (*pGetClientRect)(dxw.GethWnd(), &client); - (*pClientToScreen)(dxw.GethWnd(), &upleft); - if (!lprect) lprect=&client; - OffsetRect(lprect, upleft.x, upleft.y); - res=(*pUnlock)((LPDIRECTDRAWSURFACE)lpDDSBuffer, lprect); - (*pBlt)(lpdds, lprect, (LPDIRECTDRAWSURFACE)lpDDSBuffer, NULL, DDBLT_WAIT, 0); - if(lpDDSBuffer) (*pReleaseS)((LPDIRECTDRAWSURFACE)lpDDSBuffer); - lpDDSBuffer = NULL; - } + (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); + if(lpdds==lpDDSPrim && lpDDSBuffer){ + RECT client; + POINT upleft={0,0}; + (*pGetClientRect)(dxw.GethWnd(), &client); + (*pClientToScreen)(dxw.GethWnd(), &upleft); + if (!lprect) lprect=&client; + OffsetRect(lprect, upleft.x, upleft.y); + res=(*pUnlock)((LPDIRECTDRAWSURFACE)lpDDSBuffer, lprect); + (*pBlt)(lpdds, lprect, (LPDIRECTDRAWSURFACE)lpDDSBuffer, NULL, DDBLT_WAIT, 0); + (*pReleaseS)((LPDIRECTDRAWSURFACE)lpDDSBuffer); + lpDDSBuffer = NULL; + } (*pReleaseS)(lpDDSPrim); // to leave a correct refcount } res=(*pUnlock)(lpdds, lprect); + if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); if (IsPrim && res==DD_OK) sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index fa756bd..c7b7d6c 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -29,6 +29,7 @@ static LARGE_INTEGER TimeShifter64Coarse(LARGE_INTEGER, int); dxwCore::dxwCore() { // initialization stuff .... + extern void WhndStackInit(); FullScreen=FALSE; SethWnd(NULL); SetScreenSize(); @@ -43,6 +44,7 @@ dxwCore::dxwCore() ResetEmulatedDC(); MustShowOverlay=FALSE; TimerEvent.dwTimerType = TIMER_TYPE_NONE; + WhndStackInit(); } dxwCore::~dxwCore() @@ -1130,6 +1132,10 @@ void dxwCore::ShowOverlay(HDC hdc) // lpdds->ReleaseDC(hdc); //} +// nasty global to ensure that the corner is picked semi-random, but never overlapped +// between FPS and TimeStretch (and, as a side effect, never twice the same!) +static int LastCorner; + void dxwCore::ShowFPS(HDC xdc) { char sBuf[81]; @@ -1142,6 +1148,8 @@ void dxwCore::ShowFPS(HDC xdc) RECT rect; dwTimer = (*pGetTickCount)(); corner = dwTimer % 4; + if(corner==LastCorner) corner = (corner+1) % 4; + LastCorner = corner; color=0xFF0000; // blue (*pGetClientRect)(hWnd, &rect); switch (corner) { @@ -1194,6 +1202,8 @@ void dxwCore::ShowTimeStretching(HDC xdc) dwTimer = (*pGetTickCount)(); LastTimeShift=TimeShift; corner = dwTimer % 4; + if(corner==LastCorner) corner = (corner+1) % 4; + LastCorner = corner; color=0x0000FF; // red (*pGetClientRect)(hWnd, &rect); switch (corner) { @@ -1651,58 +1661,37 @@ BOOL dxwCore::CheckScreenResolution(unsigned int w, unsigned int h) return TRUE; } -#ifdef COMPATIBLEMODE -void dxwCore::MapKeysInit(){} - -UINT dxwCore::MapKeysConfig(UINT message, LPARAM lparam, WPARAM wparam) -{ - int vkey; - char *caption; - if(message!=WM_SYSKEYDOWN) return DXVK_NONE; - switch(wparam){ - case VK_F12: vkey=DXVK_CLIPTOGGLE; caption="CLIPCURSORTOGGLE"; break; - case VK_F11: vkey=DXVK_REFRESH; caption="REFRESH"; break; - case VK_F10: vkey=DXVK_LOGTOGGLE; caption="LOGTOGGLE"; break; - case VK_F9: vkey=DXVK_PLOCKTOGGLE; caption="POSITIONLOCKTOGGLE"; break; - case VK_F7: vkey=DXVK_FPSTOGGLE; caption="FPSTOGGLE"; break; - case VK_F6: vkey=DXVK_TIMEFAST; caption="TIMESTRETCHFAST"; break; - case VK_F5: vkey=DXVK_TIMESLOW; caption="TIMESTRETCHSLOW"; break; - case VK_F4: vkey=DXVK_ALTF4; caption="ALTF4"; break; - default: vkey=DXVK_NONE; break; - } - if(vkey) OutTraceDW("MapKeysConfig: ret=%x(%s)\n", vkey); - return vkey; -} -#else UINT VKeyConfig[DXVK_SIZE]; -void dxwCore::MapKeysInit() +static char *VKeyLabels[DXVK_SIZE]={ + "none", + "cliptoggle", + "refresh", + "logtoggle", + "plocktoggle", + "fpstoggle", + "timefast", + "timeslow", + "timetoggle", + "altf4" +}; +void dxwCore::MapKeysInit() { char InitPath[MAX_PATH]; char *p; DWORD dwAttrib; - + int KeyIdx; dwAttrib = GetFileAttributes("dxwnd.dll"); if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return; GetModuleFileName(GetModuleHandle("dxwnd"), InitPath, MAX_PATH); p=&InitPath[strlen(InitPath)-strlen("dxwnd.dll")]; strcpy(p, "dxwnd.ini"); VKeyConfig[DXVK_NONE]=DXVK_NONE; - VKeyConfig[DXVK_CLIPTOGGLE]= GetPrivateProfileInt("keymapping", "cliptoggle", 0, InitPath); - VKeyConfig[DXVK_REFRESH]= GetPrivateProfileInt("keymapping", "refresh", 0, InitPath); - VKeyConfig[DXVK_LOGTOGGLE]= GetPrivateProfileInt("keymapping", "logtoggle", 0, InitPath); - VKeyConfig[DXVK_PLOCKTOGGLE]= GetPrivateProfileInt("keymapping", "plocktoggle", 0, InitPath); - VKeyConfig[DXVK_FPSTOGGLE]= GetPrivateProfileInt("keymapping", "fpstoggle", 0, InitPath); - VKeyConfig[DXVK_TIMEFAST]= GetPrivateProfileInt("keymapping", "timefast", 0, InitPath); - VKeyConfig[DXVK_TIMESLOW]= GetPrivateProfileInt("keymapping", "timeslow", 0, InitPath); - VKeyConfig[DXVK_TIMETOGGLE]= GetPrivateProfileInt("keymapping", "timetoggle", 0, InitPath); - VKeyConfig[DXVK_ALTF4]= GetPrivateProfileInt("keymapping", "altf4", 0x73, InitPath); - - int idx; - for(idx=1; idx. #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.74" +#define VERSION "2.02.75" #define DDTHREADLOCK 1 @@ -64,7 +64,11 @@ BOOL APIENTRY DllMain( HANDLE hmodule, DisableThreadLibraryCalls((HMODULE)hmodule); hMapping = CreateFileMapping((HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, sizeof(DxWndStatus)+sizeof(TARGETMAP)*MAXTARGETS, "UniWind_TargetList"); + if(!hMapping) return false; + // v2.0.2.75: beware: some tasks (namely, Flash player) get dxwnd.dll loaded, but can't create the file mapping + // this situation has to be intercepted, or it can cause the dll to cause faults that may crash the program. pStatus = (DXWNDSTATUS *)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DXWNDSTATUS)+sizeof(TARGETMAP)*MAXTARGETS); + if(!pStatus) return false; pMapping = (TARGETMAP *)((char *)pStatus + sizeof(DXWNDSTATUS)); hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "UniWind_Mutex"); if(!hMutex) hMutex = CreateMutex(0, FALSE, "UniWind_Mutex"); diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 547d9d921e30cf3e46776bf6dc63394717a828c5..0518d098e3029ccf92ac8c35f8c03237924f8029 100644 GIT binary patch literal 74656 zcmeI51;7@?`t~0}N<@%QMB$}DLOKMMP6ea{L8U?I5Je2^z(TP>!NBhB?(WWGd&KVg zuHW-q1GmKczHmI>|9`&k4BYQr&u{OYncbb8o!y-REigqqS8gu@A8=pzc-Qn@#mj^CcHpGKmQy4L)O6WDra$RvzjutStd6Xftc|R; ztgfuSte&iatf6c>+4izVvc|F|vZk_TvevTZvKF$IvR1OTvL3QdvUalevaYg@vYll+ z%65`aHajC>AOe2DB&*m>hb9yWYa*npp9Bqjfs!i0f{6d{f(IOj~e-R~ksuRsW|2BonpZ%A8w6M!x zR=#uCaTTZ&MHRD6(6j;T+y9v_zx|*2E6XSC|Fk9RY6IB+Ysm6sHD$GAwPmyiv;pk@ zv;(mXSabiUO`yK5x&O1hXisPdC=dHT`!D-5Z9v-pcb4uX>n!Uc>ncn8KkWx?K-&Ll z8~V!DxBrt*-2eH_{!dK%Ld^b8%)UhOOV;sXV_Wz`5qi6%-{y$B>U5_HEdAmp;l`LwQSv#+wR(b z#!1iBp0l^M4u9LKRo+`W`>f1ZO&O;>ZAvyiK&=}s&t$dcv~%T-`i*M5x_{wPP$yLM z>@kPBf!@w>QENrnV}ur8`+wm}K@X zM`ww)xf%OKLG4dV&$GUW_OFyCmX_t#|N1;vb2jwT#d5z3%D>&}+19C){|2}J^i!Us z&ul6xxoj$`vg+0vBBcutV%xE)4n@u!3 zUTl)tVP@g_?;^7+%qYe!W_K#i)qNV38%t)?i_2tgQj8b&kTfYj zV#d+@G-;0M8+-iPUv2($wa4Q_>wn{)pEf2{uOwtPRMTJB7P4)!BzG1At0>#vj9LNX z3@5d`tR)ynLV7cVonLep{m%$pz=)n*s%3w8RlVpS`GFU?yXA=ar4verc7iCUT z4C5$qvf24&v^dMmt~H~a*O}dEMz8BGvq#PFd(7- ztZ${+PiD;fvsp1M1k1r*P#mF9%B;S0X|v7Dn75o+Wi$4cDrU4?NYcwQYid?YYthe+a#eL1F%k5bhh271l z&%?~dnXzAvH=AkJKx~%TL1y&&4>mi-jPf08cB&cqo@Pd?LitGVJhQ9KD9bfwx0_Lx zJIo$7W8O#1o;73pK4&Y}QTe z7PEWIXd~}6d(MpIeBSJ1Gup{d%vPGw$bV_}y%{~CAIvyxvMpE#TS@m*ytP>`=_1mE z+QF}b{dP3tEVhpQdYEw>>1o#2jOE?MY^Yf+vE9w~G!x3~Wwx&w+i+cz}7tCsly=b<{Cb{(@l-W*tbH$C#sGlXI37yTT8(qxyHe+3m zGCSUk@+~x5Y{s$jbhGo!Nbh{JyUob=9<%4osLwB$y>6B#_J-LzW(&mLHT&F*p7lS? zzBj8Y_JdjJ61jE2b}J)I*w&2gTivXi8TF;R*`8)y#r86rt~mAlA1$BBM-DVG% zQCl7~d(@2DoO%pTnblGJw2bhAEamZHmSi%&nC+xuJZ#2K`qyI=|HF)0K!2U^p&37a&>wnbKbqn95fc

0TSz{~f2E?`U0#UR?vK9Q!WS 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

t)@tpC|?r3C3Q${2VW0WZ{xCG`tH98( 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 delta 1875 zcmb`IUu;uV9LLYO_qJ=Hj<%FpH`cXXjfS?PEt_;<(K*K4W)~bH5nZ>?L838qH5LNf zTDz$g{~%p|Zu-E32@jeWb?Y@6jV4u=kP!^ipeDo^-!#SuCOjA)R==lzW&v4Z;_v3u zdw;)s&bjCJ@AR#6O6ro7@i;hROi&afV-g+|uu>=#infKp5BN+>$x6T3g-uW`)jApE z&5C$Q9@#Z>a6YSqcnvv}rrP{-x&t4NUF0&BOzly}m8dLTV(PComu1aeu+`GnKDT;p zecVe|`;0W-r>K+dr!_9Ow7R)qxJ&G-DE1-oES2lDFH&5C&G2S$Aq!Mbfk6LMOx<~&6i{WBy9sQBsK|iMJV4YU;11IESR2)B4c#oHE%k`JTVJ1^zUs!zPXU!+lbswqDxu|3ZNP=qn3UrZ6%MJEtpjU)^iB@t( z>bXLR%pv+R{!KK zy#Hx0w32%dvklbZx6#JLzDHM!_W^7i8WRDkuAeyc3=mRne;@i!z*M%kpht$-Q8tR- zCs~vVvrkj%BackBufferWidth, pPresParam->BackBufferHeight); @@ -1521,3 +1533,31 @@ ULONG WINAPI extSetTexture9(void *lpd3dd, DWORD Stage, void* pTexture) OutTraceD3D("Device::SetTexture(9): d3dd=%x stage=%x\n", lpd3dd, Stage); return DD_OK; } + +BOOL WINAPI extShowCursor8(void *lpd3dd, BOOL bShow) +{ + BOOL res, bNew; + bNew=bShow; + if(dxw.dwFlags2 & SHOWHWCURSOR) bNew=TRUE; + if(dxw.dwFlags1 & HIDEHWCURSOR) bNew=FALSE; + res=(*pShowCursor8)(lpd3dd, bNew); + if(bNew==bShow) + OutTraceD3D("Device::ShowCursor(8): d3dd=%x show=%x res=%x\n", lpd3dd, bNew, res); + else + OutTraceD3D("Device::ShowCursor(8): d3dd=%x show=%x->%x res=%x\n", lpd3dd, bShow, bNew, res); + return res; +} + +BOOL WINAPI extShowCursor9(void *lpd3dd, BOOL bShow) +{ + BOOL res, bNew; + bNew=bShow; + if(dxw.dwFlags2 & SHOWHWCURSOR) bNew=TRUE; + if(dxw.dwFlags1 & HIDEHWCURSOR) bNew=FALSE; + res=(*pShowCursor9)(lpd3dd, bNew); + if(bNew==bShow) + OutTraceD3D("Device::ShowCursor(9): d3dd=%x show=%x res=%x\n", lpd3dd, bNew, res); + else + OutTraceD3D("Device::ShowCursor(9): d3dd=%x show=%x->%x res=%x\n", lpd3dd, bShow, bNew, res); + return res; +} diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 59a779b..28bd955 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -806,7 +806,7 @@ HRESULT WINAPI extD3DGetCaps(void *d3dd, LPD3DDEVICEDESC lpd3dd ,LPD3DDEVICEDESC HRESULT WINAPI extSetRenderState(SetRenderState3_Type pSetRenderState, int version, void *d3dd, D3DRENDERSTATETYPE State, DWORD Value) { HRESULT res; - OutTraceD3D("SetRenderState(%d): d3dd=%x State=%x(%s) Value=%x\n", version, d3dd, State, ExplainD3DRenderState(State), Value); + OutTraceB("SetRenderState(%d): d3dd=%x State=%x(%s) Value=%x\n", version, d3dd, State, ExplainD3DRenderState(State), Value); if((dxw.dwFlags4 & ZBUFFERALWAYS) && (State == D3DRENDERSTATE_ZFUNC)) { OutTraceD3D("SetRenderState: FIXED State=ZFUNC Value=%s->D3DCMP_ALWAYS\n", ExplainRenderstateValue(Value)); diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 9a2c292..cbd43b3 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -35,14 +35,14 @@ static HookEntry_Type LimitHooks[]={ }; static HookEntry_Type TimeHooks[]={ - {HOOK_IAT_CANDIDATE, "GetTickCount", (FARPROC)GetTickCount, (FARPROC *)&pGetTickCount, (FARPROC)extGetTickCount}, - {HOOK_IAT_CANDIDATE, "GetLocalTime", (FARPROC)GetLocalTime, (FARPROC *)&pGetLocalTime, (FARPROC)extGetLocalTime}, - {HOOK_IAT_CANDIDATE, "GetSystemTime", (FARPROC)GetSystemTime, (FARPROC *)&pGetSystemTime, (FARPROC)extGetSystemTime}, - {HOOK_IAT_CANDIDATE, "GetSystemTimeAsFileTime", (FARPROC)GetSystemTimeAsFileTime, (FARPROC *)&pGetSystemTimeAsFileTime, (FARPROC)extGetSystemTimeAsFileTime}, - {HOOK_IAT_CANDIDATE, "Sleep", (FARPROC)Sleep, (FARPROC *)&pSleep, (FARPROC)extSleep}, - {HOOK_IAT_CANDIDATE, "SleepEx", (FARPROC)SleepEx, (FARPROC *)&pSleepEx, (FARPROC)extSleepEx}, - {HOOK_IAT_CANDIDATE, "QueryPerformanceCounter", (FARPROC)QueryPerformanceCounter, (FARPROC *)&pQueryPerformanceCounter, (FARPROC)extQueryPerformanceCounter}, - {HOOK_IAT_CANDIDATE, "QueryPerformanceFrequency", (FARPROC)QueryPerformanceFrequency, (FARPROC *)&pQueryPerformanceFrequency, (FARPROC)extQueryPerformanceFrequency}, + {HOOK_HOT_CANDIDATE, "GetTickCount", (FARPROC)GetTickCount, (FARPROC *)&pGetTickCount, (FARPROC)extGetTickCount}, + {HOOK_HOT_CANDIDATE, "GetLocalTime", (FARPROC)GetLocalTime, (FARPROC *)&pGetLocalTime, (FARPROC)extGetLocalTime}, + {HOOK_HOT_CANDIDATE, "GetSystemTime", (FARPROC)GetSystemTime, (FARPROC *)&pGetSystemTime, (FARPROC)extGetSystemTime}, + {HOOK_HOT_CANDIDATE, "GetSystemTimeAsFileTime", (FARPROC)GetSystemTimeAsFileTime, (FARPROC *)&pGetSystemTimeAsFileTime, (FARPROC)extGetSystemTimeAsFileTime}, + {HOOK_HOT_CANDIDATE, "Sleep", (FARPROC)Sleep, (FARPROC *)&pSleep, (FARPROC)extSleep}, + {HOOK_HOT_CANDIDATE, "SleepEx", (FARPROC)SleepEx, (FARPROC *)&pSleepEx, (FARPROC)extSleepEx}, + {HOOK_HOT_CANDIDATE, "QueryPerformanceCounter", (FARPROC)QueryPerformanceCounter, (FARPROC *)&pQueryPerformanceCounter, (FARPROC)extQueryPerformanceCounter}, + {HOOK_HOT_CANDIDATE, "QueryPerformanceFrequency", (FARPROC)QueryPerformanceFrequency, (FARPROC *)&pQueryPerformanceFrequency, (FARPROC)extQueryPerformanceFrequency}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; diff --git a/dll/winmm.cpp b/dll/winmm.cpp index e594511..8783e4e 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -15,9 +15,9 @@ static HookEntry_Type Hooks[]={ }; static HookEntry_Type TimeHooks[]={ - {HOOK_IAT_CANDIDATE, "timeGetTime", NULL, (FARPROC *)&ptimeGetTime, (FARPROC)exttimeGetTime}, - {HOOK_IAT_CANDIDATE, "timeKillEvent", NULL, (FARPROC *)&ptimeKillEvent, (FARPROC)exttimeKillEvent}, - {HOOK_IAT_CANDIDATE, "timeSetEvent", NULL, (FARPROC *)&ptimeSetEvent, (FARPROC)exttimeSetEvent}, + {HOOK_HOT_CANDIDATE, "timeGetTime", NULL, (FARPROC *)&ptimeGetTime, (FARPROC)exttimeGetTime}, + {HOOK_HOT_CANDIDATE, "timeKillEvent", NULL, (FARPROC *)&ptimeKillEvent, (FARPROC)exttimeKillEvent}, + {HOOK_HOT_CANDIDATE, "timeSetEvent", NULL, (FARPROC *)&ptimeSetEvent, (FARPROC)exttimeSetEvent}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; diff --git a/dll/wndproc.cpp b/dll/wndproc.cpp index 102b820..98a1a86 100644 --- a/dll/wndproc.cpp +++ b/dll/wndproc.cpp @@ -19,16 +19,25 @@ typedef struct { #define MAXWNDHSTACK 256 -wndstack_entry WhndStack[MAXWNDHSTACK]; +wndstack_entry *WhndStack; static int WhndTOS = 0; +static int WhndSize = 0; void WhndStackInit() { + WhndSize = MAXWNDHSTACK; + WhndStack = (wndstack_entry *)malloc(WhndSize * sizeof(wndstack_entry)); } void WhndStackPush(HWND hwnd, WNDPROC wndproc) { int StackIdx; + + if(WhndTOS == WhndSize){ + WhndSize += MAXWNDHSTACK; + WhndStack = (wndstack_entry *)realloc(WhndStack, WhndSize * sizeof(wndstack_entry)); + //OutTraceDW("DEBUG: WNDPROC STACK new size=%d\n", WhndSize); + } // wndproc values of 0xFFFFxxxx type seems to be error codes rather than valid callback addresses .... // v2.02.36 using CallWindowProc you can pass WinProc handles, so you don't need to eliminate them! //if (((DWORD)wndproc & 0xFFFF0000) == 0xFFFF0000) return; @@ -40,12 +49,6 @@ void WhndStackPush(HWND hwnd, WNDPROC wndproc) return; } // push if not already there. - if(WhndTOS>=MAXWNDHSTACK) { - char sMsg[80]; - sprintf(sMsg, "Table overflow: %d entries used", MAXWNDHSTACK); - MessageBox(0, sMsg, "WhndStackPush", MB_OK | MB_ICONEXCLAMATION); - return; - } WhndStack[WhndTOS].hwnd=hwnd; WhndStack[WhndTOS].wndproc=wndproc; WhndTOS++; @@ -54,7 +57,7 @@ void WhndStackPush(HWND hwnd, WNDPROC wndproc) WNDPROC WhndGetWindowProc(HWND hwnd) { int StackIdx; - for(StackIdx=0; StackIdxm_NoAlphaChannel); DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter); DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef); + DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset); DDX_Check(pDX, IDC_NOFLIPEMULATION, cTarget->m_NoFlipEmulation); } diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 6288195..7a08af9 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -46,6 +46,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoAlphaChannel = FALSE; m_FixRefCounter = TRUE; m_ReturnNullRef = FALSE; + m_NoD3DReset = FALSE; m_SuppressChild = FALSE; m_HideDesktop = FALSE; m_LockSysColors = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index cf3b960..6c3078b 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -146,6 +146,7 @@ public: BOOL m_NoAlphaChannel; BOOL m_FixRefCounter; BOOL m_ReturnNullRef; + BOOL m_NoD3DReset; BOOL m_SuppressChild; BOOL m_HideDesktop; BOOL m_LockSysColors; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 0cb5c3dd5f7968d0d52a335b123e0afb7dfc7022..77b0ef7062b27e4f704cc56a277d8606df2364d0 100644 GIT binary patch delta 1658 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 t->flags4 |= NOALPHACHANNEL; if(dlg->m_FixRefCounter) t->flags4 |= FIXREFCOUNTER; if(dlg->m_ReturnNullRef) t->flags4 |= RETURNNULLREF; + if(dlg->m_NoD3DReset) t->flags4 |= NOD3DRESET; if(dlg->m_SuppressChild) t->flags4 |= SUPPRESSCHILD; if(dlg->m_HideDesktop) t->flags4 |= HIDEDESKTOP; if(dlg->m_LockSysColors) t->flags3 |= LOCKSYSCOLORS; @@ -342,6 +343,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_NoAlphaChannel = t->flags4 & NOALPHACHANNEL ? 1 : 0; dlg->m_FixRefCounter = t->flags4 & FIXREFCOUNTER ? 1 : 0; dlg->m_ReturnNullRef = t->flags4 & RETURNNULLREF ? 1 : 0; + dlg->m_NoD3DReset = t->flags4 & NOD3DRESET ? 1 : 0; dlg->m_SuppressChild = t->flags4 & SUPPRESSCHILD ? 1 : 0; dlg->m_HideDesktop = t->flags4 & HIDEDESKTOP ? 1 : 0; dlg->m_LockSysColors = t->flags3 & LOCKSYSCOLORS ? 1 : 0; @@ -823,6 +825,8 @@ void CDxwndhostView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) *pResult = 0; } +static char ImportExportPath[4096] = {0}; + void CDxwndhostView::OnExport() { int i; @@ -851,21 +855,23 @@ void CDxwndhostView::OnImport() path[0]=0; CListCtrl& listctrl = GetListCtrl(); - char buffer[4096] = {0}; + //static char buffer[4096] = {0}; + //static char dirbuffer[4096] = {0}; char folder[MAX_PATH+1]; char pathname[MAX_PATH+1]; OPENFILENAME ofn = {0}; ofn.lStructSize = sizeof(ofn); - ofn.lpstrFile = (LPSTR)buffer; + ofn.lpstrFile = (LPSTR)ImportExportPath; + //ofn.lpstrInitialDir = (LPSTR)dirbuffer; ofn.nMaxFile = 4096; ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER; ofn.lpstrDefExt = "dxw"; if(GetOpenFileName(&ofn)){ - if(buffer[ofn.nFileOffset - 1] != '\0'){ + if(ImportExportPath[ofn.nFileOffset - 1] != '\0'){ // Single-Select // "buffer" - name of file - LoadConfigItem(&TargetMaps[i], &TitleMaps[i], 0, buffer); + LoadConfigItem(&TargetMaps[i], &TitleMaps[i], 0, ImportExportPath); listitem.mask = LVIF_TEXT | LVIF_IMAGE; listitem.iItem = i; listitem.iSubItem = 0; @@ -875,7 +881,7 @@ void CDxwndhostView::OnImport() } else{ // Multi-Select - char* p = buffer; + char* p = ImportExportPath; strcpy(folder, p); strcat(folder, "\\"); p += lstrlen((LPSTR)p) + 1;