From 0e42098a3dd610492cfa7e1e1cd089beb61185bf Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 15 Feb 2017 11:50:18 -0500 Subject: [PATCH] v2_04_14_src Former-commit-id: 7fc0c92fb4c1f9dc744aefc42d4acaf08de38d85 --- Include/dxwnd.h | 2 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 183 ++++++++++++++++++++++++++ build/readme-relnotes.txt | 15 ++- dll/advapi.cpp | 15 ++- dll/ddblit.cpp | 10 ++ dll/ddcreates.cpp | 4 + dll/ddraw.cpp | 124 +++++++++++++----- dll/dxhelper.cpp | 1 + dll/dxwcore.cpp | 4 + dll/dxwnd.cpp | 6 +- dll/dxwnd.vs2008.suo | Bin 842752 -> 852992 bytes dll/kernel32.cpp | 268 +++++++++++++++++++++++++++++++++++++- dll/queryint.cpp | 1 - dll/user32.cpp | 50 +++---- host/TabCompat.cpp | 2 +- host/TabDirect3D.cpp | 1 + host/TabWindow.cpp | 1 + host/TargetDlg.cpp | 2 + host/TargetDlg.h | 6 +- host/dxwndhost.aps | Bin 262004 -> 260884 bytes host/dxwndhost.cpp | 74 ++++++++++- host/dxwndhost.rc | Bin 152744 -> 151124 bytes host/dxwndhost.vs2008.suo | Bin 198144 -> 241152 bytes host/dxwndhostView.cpp | 21 +++ host/dxwndhostView.h | 1 + host/resource | Bin 54384 -> 54754 bytes 28 files changed, 717 insertions(+), 82 deletions(-) create mode 100644 build/dxwnd.ini diff --git a/Include/dxwnd.h b/Include/dxwnd.h index a516b51..153d559 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -275,6 +275,8 @@ #define CLIPMENU 0x00800000 // Include window menu in mouse clipper area #define BACKGROUNDPRIORITY 0x01000000 // Lower process priority when in background state #define OFFSCREENZBUFFER 0x02000000 // Allow building plain surfaces and ZBuffer on offscreen videomemory surfaces +#define VIRTUALHEAP 0x04000000 // Remap heap calls to C library memory allocation routines +#define ZBUFFERHARDCLEAN 0x08000000 // Clean ZBUFFER the hard way (memset 0xFF on whole surface buffer ....) // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 0296cb0..db09245 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a79583def56483a293f270aec77c751598364449eb1d729d4fa4512f8c2b010 -size 787456 +oid sha256:73c4aac223a633aa820b3761678170f484fb15a016ecd2c41e77d5c820e3dd46 +size 791552 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index ed0aa9b..04a9cb5 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5789a039f251a7d64e49573c0f7cc63fea3369f091782fb92fe6efb7c899d94a -size 675840 +oid sha256:933a86972f0a96e62d8c5f4b656315cf09d656d2a131d1685acdd231b7ac2139 +size 677376 diff --git a/build/dxwnd.ini b/build/dxwnd.ini new file mode 100644 index 0000000..68a7ef8 --- /dev/null +++ b/build/dxwnd.ini @@ -0,0 +1,183 @@ +[window] +exportpath=D:\Games\Age of Empires Trial\ +exepath=D:\Games\Sid Meiers Alpha Centauri Demo\ +posx=-666 +posy=95 +sizx=320 +sizy=200 +[target] +title0=Planet of the Apes +path0=D:\Games\Planet of the Apes\pota.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=0 +coord0=0 +flag0=203423795 +flagg0=1207959552 +flagh0=524308 +flagi0=138412068 +flagj0=67129472 +flagk0=-1879044096 +flagl0=1048576 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=-1050 +posy0=100 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=1 +initresw0=0 +initresh0=0 +title1=Sid Meiers Alpha Centauri Demo +path1=D:\Games\Sid Meiers Alpha Centauri Demo\terran.exe +startfolder1= +launchpath1= +module1= +opengllib1= +notes1= +registry1= +ver1=0 +monitorid1=-1 +coord1=0 +flag1=673185826 +flagg1=1207959616 +flagh1=32788 +flagi1=138420228 +flagj1=4224 +flagk1=65536 +flagl1=0 +flagm1=0 +tflag1=-2147477245 +dflag1=0 +posx1=50 +posy1=50 +sizx1=800 +sizy1=600 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=0 +swapeffect1=0 +maxddinterface1=7 +slowratio1=2 +scanline1=0 +initresw1=800 +initresh1=600 +title2=Diablo +path2=D:\Games\Diablo\Diablo.exe +startfolder2= +launchpath2= +module2= +opengllib2= +notes2= +registry2= +ver2=1 +monitorid2=0 +coord2=0 +flag2=138428450 +flagg2=1241514000 +flagh2=8212 +flagi2=4194304 +flagj2=128 +flagk2=262144 +flagl2=0 +flagm2=1024 +tflag2=0 +dflag2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=0 +swapeffect2=0 +maxddinterface2=7 +slowratio2=1 +scanline2=1 +initresw2=0 +initresh2=0 +title3=TOCA Touring Car Championship demo +path3=D:\Games\tocademo\tourcars.exe +startfolder3= +launchpath3=D:\Games\tocademo\setup.exe +module3= +opengllib3= +notes3= +registry3=\n[HKEY_LOCAL_MACHINE\SOFTWARE\Codemasters]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Codemasters\Touring Car]\n"GameDirectory"="F:\\Games\\tourcar\\"\n"CD_Drive"="."\n"Install_Drive"="F:"\n"CardHintIndex"=dword:00000000\n"ShowRunInfo"=dword:00000000\n"S3RunInfo"=dword:00000000\n\n +ver3=0 +monitorid3=-1 +coord3=0 +flag3=673185834 +flagg3=1073741824 +flagh3=528 +flagi3=136314880 +flagj3=4224 +flagk3=65536 +flagl3=0 +flagm3=33554432 +tflag3=-2147477245 +dflag3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=0 +swapeffect3=0 +maxddinterface3=7 +slowratio3=2 +scanline3=0 +initresw3=800 +initresh3=600 +title4=empires.exe +path4=D:\Games\Age of Empires Trial\empires.exe +startfolder4= +launchpath4= +module4= +opengllib4= +notes4= +registry4= +ver4=0 +monitorid4=-1 +coord4=0 +flag4=673710114 +flagg4=1207959552 +flagh4=8212 +flagi4=138412036 +flagj4=4224 +flagk4=65536 +flagl4=0 +flagm4=2097152 +tflag4=0 +dflag4=0 +posx4=50 +posy4=50 +sizx4=800 +sizy4=600 +maxfps4=0 +initts4=0 +winver4=0 +maxres4=0 +swapeffect4=0 +maxddinterface4=7 +slowratio4=2 +scanline4=0 +initresw4=800 +initresh4=600 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index f1c50c7..e365471 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1533,4 +1533,17 @@ fix: moved USER32/InvalidateRect hooker to always activate it and further reduce fix: fixed virtual registry tags that introduced extra characters in key string expansion add: hooked SelectClipRgn - preliminary to attempt fixing "Sid Meier's Alpha Centauri" fix: fixed unsupported call to SetWindowsHook(WH_CBT, NULL). Fixes "Starsiege" deaf mouse control. -fix: completed and rebuilt proxy dlls to be aligned with current DxWnd structure \ No newline at end of file +fix: completed and rebuilt proxy dlls to be aligned with current DxWnd structure + +v2.04.14 +fix: virtual registry parser, token names now case insensitive (es. "path" = "Path") +fix: virtual registry crash when replacing tokens and lplpData is NULL +fix: virtual registry return code, must not return ERROR_MORE_DATA when lpData is NULL (fixes "Rollcage II") +fix: eliminated error message in virtual palette processing when color depth is 8 bits +fix: improved logging in EnumDisplayModes wrapper +fix: EnumDisplayModes wrapper for nonemulated nonwindowed mode +fix: deleted improper input clipper destruction after primary surface destruction. Fixes "Settlers III" clipper problems +add: virtual heap (makes some "Wing Commander" games work) +fix: freak help->about... +add: GUI "Tools->Recover system colors" utility + diff --git a/dll/advapi.cpp b/dll/advapi.cpp index f8ba17f..036e4ef 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -84,7 +84,7 @@ static int ReplaceVar(char *pData, LPBYTE *lplpData, LPDWORD lpcbData) char sTokenValue[MAX_PATH]; // search for a matching token for(iTokenIndex=0; sTokenLabels[iTokenIndex]; iTokenIndex++){ - if(!strncmp(pData, sTokenLabels[iTokenIndex], strlen(sTokenLabels[iTokenIndex]))) break; + if(!_strnicmp(pData, sTokenLabels[iTokenIndex], strlen(sTokenLabels[iTokenIndex]))) break; } // set token label length iLabelLength = strlen(sTokenLabels[iTokenIndex]); @@ -102,7 +102,7 @@ static int ReplaceVar(char *pData, LPBYTE *lplpData, LPDWORD lpcbData) // set output vars if not NULL iTokenLength = strlen(sTokenValue); OutTraceR("REPLACED token=%d val=\"%s\" len=%d\n", iTokenIndex, sTokenValue, iTokenLength); - if(lplpData) { + if(*lplpData) { strcpy((char *)*lplpData, sTokenValue); *lplpData += iTokenLength; } @@ -316,9 +316,12 @@ static DWORD GetKeyValue( } if(lpcbData) (*lpcbData)++; // extra space for string terminator ? if(lpData && lpcbData) if(*lpcbData < cbData) *lpb = 0; // string terminator - OutTraceR("%s: type=REG_SZ cbData=%x Data=\"%s\"\n", + OutTraceR("%s: type=REG_SZ cbData=%d Data=\"%s\"\n", ApiName, lpcbData ? *lpcbData : 0, lpData ? (char *)lpData : "(NULL)"); - res=(*lpcbData > cbData) ? ERROR_MORE_DATA : ERROR_SUCCESS; + // v2.04.14 fix: ERROR_MORE_DATA should be returned only in case lpData is not NULL + res=ERROR_SUCCESS; + if(lpData && lpcbData) + if (*lpcbData > cbData) res = ERROR_MORE_DATA; break; } if(!strncmp(pData,"dword:",strlen("dword:"))){ //dword value @@ -378,10 +381,10 @@ static void LogKeyValue(char *ApiName, LONG res, LPDWORD lpType, LPBYTE lpData, { char sInfo[1024]; if(res) { - OutTrace("%s: ERROR res=%x\n", ApiName, res); + OutTrace("%s: ERROR res=%d\n", ApiName, res); return; } - sprintf(sInfo, "%s: res=0 size=%d type=%x(%s)", + sprintf(sInfo, "%s: res=ERROR_SUCCESS size=%d type=%x(%s)", ApiName, lpcbData?*lpcbData:0, lpType?*lpType:0, lpType?ExplainRegType(*lpType):"none"); if(lpType && lpData && lpcbData) { DWORD cbData = *lpcbData; diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index ce40809..f1e27b7 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -112,6 +112,11 @@ static HRESULT sBltNoPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR #endif } break; + case DDERR_SURFACELOST: + lpdds->Restore(); + res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); + OutTraceDW("Blt SURFACELOST RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); + break; default: break; } @@ -267,6 +272,11 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR if (res) BlitError(res, lpsrcrect, lpdestrect, __LINE__); (*pReleaseSMethod(dxversion))((LPDIRECTDRAWSURFACE)lpddsTmp); } + if(res==DDERR_SURFACELOST){ + lpdds->Restore(); + res=(*pPrimaryBlt)(dxversion, pBlt, lpdds, lpdestrect, lpddssrc, lpsrcrect, lpddbltfx); + OutTraceDW("Blt SURFACELOST RETRY: ret=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; } diff --git a/dll/ddcreates.cpp b/dll/ddcreates.cpp index 89d7fe0..e75477a 100644 --- a/dll/ddcreates.cpp +++ b/dll/ddcreates.cpp @@ -1052,7 +1052,11 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface // v2.03.82: save ZBUFFER capabilities for later fix in D3D CreateDevice OutTraceDW("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", *lplpdds, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); lpDDZBuffer = *lplpdds; + // save surface size expressed in bytes + extern int ZBufferSize; + ZBufferSize = lpddsd->dwWidth * lpddsd->dwHeight * (lpddsd->ddpfPixelFormat.dwZBufferBitDepth >> 3); dxwcdb.PushCaps(*lplpdds, lpddsd->ddsCaps.dwCaps); + OutTraceDW("CreateSurface: ZBufferSize=%d\n", ZBufferSize); } } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index e2dc42a..79659d4 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -425,6 +425,7 @@ extern PALETTEENTRY DefaultSystemPalette[256]; LPDIRECTDRAWSURFACE lpDDSEmu_Prim=NULL; LPDIRECTDRAWSURFACE lpDDSEmu_Back=NULL; LPDIRECTDRAWSURFACE lpDDZBuffer=NULL; // BEWARE! Likely, this global is useless .... +int ZBufferSize; // v2.1.87: lpPrimaryDD is the DIRECTDRAW object to which the primary surface and all // the service objects (emulated backbuffer, emulater primary, ....) are attached. LPDIRECTDRAW lpPrimaryDD=NULL; @@ -686,6 +687,10 @@ void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) : (((DWORD)PalColor.peRed & 0xF8) << 8) + (((DWORD)PalColor.peGreen & 0xF8) << 3) + (((DWORD)PalColor.peBlue &0xF8) >> 3); break; + case 8: // it may happen in unemulated modes + PaletteEntries[i + dwstart] = + (((DWORD)PalColor.peRed) << 16) + (((DWORD)PalColor.peGreen) << 8) + ((DWORD)PalColor.peBlue); + break; default: OutTraceDW("ASSERT: unsupported Color BPP=%d\n", dxw.ActualPixelFormat.dwRGBBitCount); break; @@ -3402,8 +3407,12 @@ HRESULT WINAPI extGetPalette(int dxversion, GetPalette_Type pGetPalette, LPDIREC res=DD_OK; } - if (res) OutTraceE("GetPalette: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceDDRAW("GetPalette: OK\n"); + if (res) { + OutTraceE("GetPalette: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + } + else { + OutTraceDDRAW("GetPalette: OK lplpddp=%x\n", *lplpddp); + } return res; } @@ -3650,7 +3659,6 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR HRESULT res, res2; static RECT client; POINT upleft={0,0}; - LPDIRECTDRAWSURFACE lpDDSPrim; Blt_Type pBlt; GetGDISurface_Type pGetGDISurface; @@ -3675,7 +3683,7 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR // V2.02.43: Empire Earth does some test Lock operations apparently before the primary surface is created if(lpPrimaryDD){ - lpDDSPrim=0; + LPDIRECTDRAWSURFACE lpDDSPrim = 0; res2=(*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); if(res2) OutTraceE("Lock: GetGDISurface ERROR res=%x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); @@ -3794,7 +3802,20 @@ static HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRA OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)": (IsBack ? "(BACK)" : "")), sRect); } - pBlt = pGetBltMethod(dxversion); + if ((dxw.dwFlags8 & ZBUFFERHARDCLEAN) && (dxwcdb.GetCaps(lpdds) & DDSCAPS_ZBUFFER)){ + DWORD dwSize = (dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); + DDSURFACEDESC2 ddsd; + memset(&ddsd, 0, dwSize); + ddsd.dwSize = dwSize; + res=(*pUnlock)(lpdds, NULL); + if(res) OutTraceDW("Unlock ZBUFFER: Unlock err=%x at %d\n", res, __LINE__); + res=(*pLockMethod(dxversion))(lpdds, NULL, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, 0); + if(res) OutTraceDW("Unlock ZBUFFER: Lock err=%x at %d\n", res, __LINE__); + memset(ddsd.lpSurface, 0xFF, ZBufferSize); + res=(*pUnlock)(lpdds, lprect); + if(res) OutTraceDW("Unlock ZBUFFER: Unlock err=%x at %d\n", res, __LINE__); + return res; + } switch(dxversion){ case 4: @@ -3858,6 +3879,7 @@ static HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRA res=(*pUnlock)(lpdds, lprect); if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (IsPrim && res==DD_OK) { + pBlt = pGetBltMethod(dxversion); if(dxversion < 4) lprect=NULL; // v2.03.60 res=sBlt(dxversion, pBlt, "Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); } @@ -3885,17 +3907,46 @@ HRESULT WINAPI extUnlock7(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) static HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) { HRESULT res; - //RECT screen, rect; BOOL IsPrim; BOOL IsBack; - LPDIRECTDRAWSURFACE lpDDSPrim; - GetGDISurface_Type pGetGDISurface; Blt_Type pBlt; RECT rect; IsPrim=dxwss.IsAPrimarySurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds); + if(IsTraceDDRAW){ + char sRect[81]; + switch(dxversion){ + case 1: + case 2: + case 3: + sprintf_s(sRect, 80, "lpvoid=%x", lprect); + break; + case 4: + case 7: + if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "rect=(NULL)"); + break; + } + OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)": (IsBack ? "(BACK)" : "")), sRect); + } + + if ((dxw.dwFlags8 & ZBUFFERHARDCLEAN) && (dxwcdb.GetCaps(lpdds) & DDSCAPS_ZBUFFER)){ + DWORD dwSize = (dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); + DDSURFACEDESC2 ddsd; + memset(&ddsd, 0, dwSize); + ddsd.dwSize = dwSize; + res=(*pUnlock)(lpdds, NULL); + if(res) OutTraceDW("Unlock ZBUFFER: Unlock err=%x at %d\n", res, __LINE__); + res=(*pLockMethod(dxversion))(lpdds, NULL, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY, 0); + if(res) OutTraceDW("Unlock ZBUFFER: Lock err=%x at %d\n", res, __LINE__); + memset(ddsd.lpSurface, 0xFF, ZBufferSize); + res=(*pUnlock)(lpdds, lprect); + if(res) OutTraceDW("Unlock ZBUFFER: Unlock err=%x at %d\n", res, __LINE__); + return res; + } + switch(dxversion){ case 4: // v2.02.92: found in Fifa 2000: lpRect is completely ignored, receiving bogus values like (-1, -1, -1, -1} @@ -3914,28 +3965,13 @@ static HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECT break; } - if(IsTraceDDRAW){ - char sRect[81]; - switch(dxversion){ - case 1: - case 2: - case 3: - sprintf_s(sRect, 80, "lpvoid=%x", lprect); - break; - case 4: - case 7: - if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); - else strcpy(sRect, "rect=(NULL)"); - break; - } - OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)": (IsBack ? "(BACK)" : "")), sRect); - } - // v2.04.09: for IDirectDraw methods use iBakBufferVersion instead of dxversion ... pBlt = pGetBltMethod(dxversion); - pGetGDISurface = pGetGDISurfaceMethod(iBakBufferVersion); if(dxw.dwFlags1 & LOCKEDSURFACE){ + LPDIRECTDRAWSURFACE lpDDSPrim = 0; + GetGDISurface_Type pGetGDISurface = pGetGDISurfaceMethod(iBakBufferVersion); + (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); if(lpdds==lpDDSPrim && lpDDSBuffer){ RECT client; @@ -3954,11 +3990,11 @@ static HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECT 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) { if(dxversion < 4) lprect=NULL; // v2.03.60 res=sBlt(dxversion, pBlt, "Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE); } + if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; if((dxw.dwFlags5 & TEXTUREMASK) && (!IsPrim)) { // Texture Handling on Unlock @@ -4141,13 +4177,19 @@ HRESULT WINAPI EnumModesCallbackDumper(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l { OutTrace("EnumModesCallback:\n"); OutTrace("\tdwSize=%d\n", lpDDSurfaceDesc->dwSize); + OutTrace("\tddpfPixelFormat depth=%d rgba=(%X-%X-%X-%X)\n", + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount, + lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask, + lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask, + lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask, + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBAlphaBitMask); OutTrace("\tdwFlags=%x(%s)\n", lpDDSurfaceDesc->dwFlags, ExplainFlags(lpDDSurfaceDesc->dwFlags)); OutTrace("\tdwWidth x dwHeight=(%d,%d)\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight); OutTrace("\tlPitch=%d\n", lpDDSurfaceDesc->lPitch); - OutTrace("\tdwBackBufferCount=%d\n", lpDDSurfaceDesc->dwBackBufferCount); + //OutTrace("\tdwBackBufferCount=%d\n", lpDDSurfaceDesc->dwBackBufferCount); OutTrace("\tdwRefreshRate=%d\n", lpDDSurfaceDesc->dwRefreshRate); - OutTrace("\tlpSurface=%x\n", lpDDSurfaceDesc->lpSurface); - OutTrace("\tCaps=%x(%s)\n", lpDDSurfaceDesc->ddsCaps.dwCaps, ExplainDDSCaps(lpDDSurfaceDesc->ddsCaps.dwCaps)); + //OutTrace("\tlpSurface=%x\n", lpDDSurfaceDesc->lpSurface); + //OutTrace("\tCaps=%x(%s)\n", lpDDSurfaceDesc->ddsCaps.dwCaps, ExplainDDSCaps(lpDDSurfaceDesc->ddsCaps.dwCaps)); //if ((NewContext_Type *)lpContext->dxversion >= 4) { // OutTrace("\tddpfPixelFormat %s\n", DumpPixelFormat((LPDDSURFACEDESC2)lpDDSurfaceDesc)); //} @@ -4241,10 +4283,23 @@ HRESULT WINAPI myEnumModesFilterNative(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l if(CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; res=(*((NewContext_Type *)lpContext)->lpCallback)(lpDDSurfaceDesc, ((NewContext_Type *)lpContext)->lpContext); - OutTraceDW("EnumDisplayModes(D): native size=(%d,%d) res=%x\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight, res); + OutTraceDW("EnumDisplayModes(D): native size=(%d,%d) bpp=%d res=%x\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount, res); return res; } +static char *sDisplayModesFlags(DWORD dwFlags) +{ + static char sBuf[81]; + size_t l; + strcpy(sBuf, "DDEDM_"); + if(dwFlags & DDEDM_REFRESHRATES) strcat(sBuf, "REFRESHRATES+"); + if(dwFlags & DDEDM_STANDARDVGAMODES) strcat(sBuf, "STANDARDVGAMODES+"); + l=strlen(sBuf); + if (l>strlen("DDEDM_")) sBuf[l-1]=0; // delete last '+' if any + else sBuf[0]=0; + return(sBuf); +} + HRESULT WINAPI extEnumDisplayModes(int dxversion, EnumDisplayModes1_Type pEnumDisplayModes, LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) { HRESULT res; @@ -4254,7 +4309,8 @@ HRESULT WINAPI extEnumDisplayModes(int dxversion, EnumDisplayModes1_Type pEnumDi OutTraceDDRAW("EnumDisplayModes(D%d): lpdd=%x flags=%x lpddsd=%x callback=%x\n", dxversion, lpdd, dwflags, lpddsd, cb); if(lpddsd) OutTraceDDRAW("EnumDisplayModes(D): %s\n", LogSurfaceAttributes(lpddsd, "EnumDisplayModes", __LINE__)); - if(dxw.dwFlags4 & NATIVERES){ + if ((dxw.dwFlags4 & NATIVERES) || + (!(dxw.dwFlags1 & EMULATESURFACE) && !dxw.Windowize)){ // v2.04.14 - make nonemulated nonwindowed mode work ... NewContext.dwWidth = 0; NewContext.dwHeight = 0; NewContext.lpContext = lpContext; @@ -4424,7 +4480,9 @@ HRESULT WINAPI extReleaseS(ReleaseS_Type pReleaseS, LPDIRECTDRAWSURFACE lpdds) if(IsPrim || IsBack) dxwss.UnrefSurface(lpdds); // when releasing primary surface, erase clipping region - if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); + // v2.04.14: commented out, better not to! The game could close and reopen a new primary surface. + // fixes "Settlers III" clipping problems + // if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); // clear service surface pointers if (dxw.dwFlags1 & EMULATESURFACE) { diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index c1e3262..5223905 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -1825,6 +1825,7 @@ char *ExplainDDError(DWORD c) case DDERR_WASSTILLDRAWING: eb="DDERR_WASSTILLDRAWING"; break; case DDERR_WRONGMODE: eb="DDERR_WRONGMODE"; break; case DDERR_XALIGN: eb="DDERR_XALIGN"; break; + case DDERR_NOTONMIPMAPSUBLEVEL: eb="DDERR_NOTONMIPMAPSUBLEVEL"; break; // D3D errors case D3DERR_WRONGTEXTUREFORMAT: eb="D3DERR_WRONGTEXTUREFORMAT"; break; case D3DERR_UNSUPPORTEDCOLOROPERATION: eb="D3DERR_UNSUPPORTEDCOLOROPERATION"; break; diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 89a12d7..e9090bb 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -468,6 +468,10 @@ void dxwCore::SetClipCursor() } // check for errors to avoid setting random clip regions + //if((*pIsWindowVisible)(hWnd)){ + // OutTraceE("SetClipCursor: not visible\n"); + // return; + //} if(!(*pGetClientRect)(hWnd, &Rect)){ OutTraceE("SetClipCursor: GetClientRect ERROR err=%d at %d\n", GetLastError(), __LINE__); return; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 54eb584..a77cf78 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.13" +#define VERSION "2.04.14" #define DDTHREADLOCK 1 @@ -358,8 +358,8 @@ static char *FlagNames[9][32] ={{ "PRETENDVISIBLE", "RAWFORMAT", "WININSULATION", "FIXMOUSEHOOK", "DDSFORMAT", "HOOKWING32", "SEQUENCEDIAT", "D3D8BACK16", "MARKWING32", "DYNAMICZCLEAN", "MARKGDI32", "DUMPDIBSECTION", - "DUMPDEVCONTEXT", "QUALITYFONTS", "ALLOWSYSMEMON3DDEV", "", - "", "", "", "", + "DUMPDEVCONTEXT", "QUALITYFONTS", "ALLOWSYSMEMON3DDEV", "CLIPMENU", + "BACKGROUNDPRIORITY", "OFFSCREENZBUFFER", "VIRTUALHEAP", "ZBUFFERHARDCLEAN", "", "", "", "", },{ // TFlags diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 351c4ee0be7406e511d1b32223496db345880345..807655903b235f78066062c1cdfbaeeef3101eac 100644 GIT binary patch delta 28904 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 EAAu_t=Kufz delta 48633 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 D{Mc2! diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index a0b7e96..731ab39 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -20,6 +20,14 @@ LPVOID WINAPI extVirtualAlloc(LPVOID, SIZE_T, DWORD, DWORD); UINT WINAPI extWinExec(LPCSTR, UINT); BOOL WINAPI extSetPriorityClass(HANDLE, DWORD); BOOL WINAPI extGlobalUnlock(HGLOBAL); +LPVOID WINAPI extHeapAlloc(HANDLE, DWORD, SIZE_T); +LPVOID WINAPI extHeapReAlloc(HANDLE, DWORD, LPVOID, SIZE_T); +HANDLE WINAPI extHeapCreate(DWORD, SIZE_T, SIZE_T); +BOOL WINAPI extHeapFree(HANDLE, DWORD, LPVOID); +BOOL WINAPI extHeapValidate(HANDLE, DWORD, LPVOID); +SIZE_T WINAPI extHeapCompact(HANDLE, DWORD); +HANDLE WINAPI extGetProcessHeap(void); +BOOL WINAPI extHeapDestroy(HANDLE); typedef LPVOID (WINAPI *VirtualAlloc_Type)(LPVOID, SIZE_T, DWORD, DWORD); typedef BOOL (WINAPI *CreateProcessA_Type)(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, @@ -27,12 +35,26 @@ typedef BOOL (WINAPI *CreateProcessA_Type)(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTE typedef BOOL (WINAPI *SetPriorityClass_Type)(HANDLE, DWORD); typedef UINT (WINAPI *WinExec_Type)(LPCSTR, UINT); typedef BOOL (WINAPI *GlobalUnlock_Type)(HGLOBAL); +typedef LPVOID (WINAPI *HeapAlloc_Type)(HANDLE, DWORD, SIZE_T); +typedef LPVOID (WINAPI *HeapReAlloc_Type)(HANDLE, DWORD, LPVOID, SIZE_T); +typedef HANDLE (WINAPI *HeapCreate_Type)(DWORD, SIZE_T, SIZE_T); +typedef BOOL (WINAPI *HeapFree_Type)(HANDLE, DWORD, LPVOID); +typedef SIZE_T (WINAPI *HeapCompact_Type)(HANDLE, DWORD); +typedef HANDLE (WINAPI *GetProcessHeap_Type)(void); +typedef BOOL (WINAPI *HeapDestroy_Type)(HANDLE); CreateProcessA_Type pCreateProcessA = NULL; VirtualAlloc_Type pVirtualAlloc = NULL; WinExec_Type pWinExec = NULL; SetPriorityClass_Type pSetPriorityClass = NULL; GlobalUnlock_Type pGlobalUnlock = NULL; +HeapAlloc_Type pHeapAlloc; +HeapReAlloc_Type pHeapReAlloc; +HeapCreate_Type pHeapCreate; +HeapFree_Type pHeapFree, pHeapValidate; +HeapCompact_Type pHeapCompact; +GetProcessHeap_Type pGetProcessHeap; +HeapDestroy_Type pHeapDestroy; typedef BOOL (WINAPI *FreeLibrary_Type)(HMODULE); FreeLibrary_Type pFreeLibrary = NULL; @@ -79,6 +101,18 @@ static HookEntryEx_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; +static HookEntryEx_Type HeapHooks[]={ + {HOOK_IAT_CANDIDATE, 0, "HeapCreate", (FARPROC)HeapCreate, (FARPROC *)&pHeapCreate, (FARPROC)extHeapCreate}, + {HOOK_IAT_CANDIDATE, 0, "HeapAlloc", (FARPROC)HeapAlloc, (FARPROC *)&pHeapAlloc, (FARPROC)extHeapAlloc}, + {HOOK_IAT_CANDIDATE, 0, "HeapReAlloc", (FARPROC)HeapReAlloc, (FARPROC *)&pHeapReAlloc, (FARPROC)extHeapReAlloc}, + {HOOK_IAT_CANDIDATE, 0, "HeapFree", (FARPROC)HeapFree, (FARPROC *)&pHeapFree, (FARPROC)extHeapFree}, + {HOOK_IAT_CANDIDATE, 0, "HeapValidate", (FARPROC)HeapFree, (FARPROC *)&pHeapFree, (FARPROC)extHeapFree}, + {HOOK_IAT_CANDIDATE, 0, "HeapCompact", (FARPROC)HeapCompact, (FARPROC *)&pHeapCompact, (FARPROC)extHeapCompact}, + {HOOK_IAT_CANDIDATE, 0, "HeapDestroy", (FARPROC)HeapDestroy, (FARPROC *)&pHeapDestroy, (FARPROC)extHeapDestroy}, + {HOOK_IAT_CANDIDATE, 0, "GetProcessHeap", (FARPROC)GetProcessHeap, (FARPROC *)&pGetProcessHeap, (FARPROC)extGetProcessHeap}, + {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator +}; + static HookEntryEx_Type FixAllocHooks[]={ {HOOK_IAT_CANDIDATE, 0, "VirtualAlloc", (FARPROC)VirtualAlloc, (FARPROC *)&pVirtualAlloc, (FARPROC)extVirtualAlloc}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator @@ -127,6 +161,7 @@ void HookKernel32(HMODULE module) if(dxw.dwFlags2 & TIMESTRETCH) HookLibraryEx(module, TimeHooks, libname); if(dxw.dwFlags2 & FAKEVERSION) HookLibraryEx(module, VersionHooks, libname); if(dxw.dwFlags6 & LEGACYALLOC) HookLibraryEx(module, FixAllocHooks, libname); + if(dxw.dwFlags8 & VIRTUALHEAP) HookLibraryEx(module, HeapHooks, libname); } void HookKernel32Init() @@ -137,6 +172,7 @@ void HookKernel32Init() HookLibInitEx(TimeHooks); HookLibInitEx(VersionHooks); HookLibInitEx(FixAllocHooks); + HookLibInitEx(HeapHooks); } FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) @@ -167,6 +203,10 @@ FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) if(dxw.dwFlags6 & LEGACYALLOC) if (addr=RemapLibraryEx(proc, hModule, FixAllocHooks)) return addr; + + if(dxw.dwFlags8 & VIRTUALHEAP) + if (addr=RemapLibraryEx(proc, hModule, HeapHooks)) return addr; + return NULL; } @@ -1495,4 +1535,230 @@ BOOL WINAPI extGlobalUnlock(HGLOBAL hMem) hLastMem = hMem; } return ret; -} \ No newline at end of file +} + +// --------------------------------------------------------------------- +// Virtual Heap +// --------------------------------------------------------------------- + +static LPVOID VHeapMin = (LPVOID)0xFFFFFFFF; +static LPVOID VHeapMax = (LPVOID)0x00000000; +static int iProg = 1; + +#if 0 + +LPVOID WINAPI extHeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) +{ + LPVOID ret; + OutTraceB("HeapAlloc: heap=%x flags=%x bytes=%d\n", hHeap, dwFlags, dwBytes); + if(((DWORD)hHeap >= 0xDEADBEEF) && ((DWORD)hHeap < 0xDEADBEEF + iProg)){ + ret = malloc(dwBytes); + if(ret){ + if(ret > VHeapMax) VHeapMax = ret; + if(ret < VHeapMin) VHeapMin = ret; + } + OutTraceB("HeapAlloc: (virtual) ret=%x\n", ret); + } + else { + ret = (*pHeapAlloc)(hHeap, dwFlags, dwBytes); + OutTraceB("HeapAlloc: ret=%x\n", ret); + } + return ret; +} + +LPVOID WINAPI extHeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes) +{ + LPVOID ret; + OutTraceB("HeapReAlloc: heap=%x flags=%x mem=%x bytes=%d\n", hHeap, dwFlags, lpMem, dwBytes); + if(((DWORD)hHeap >= 0xDEADBEEF) && ((DWORD)hHeap < 0xDEADBEEF + iProg)){ + ret = realloc(lpMem, dwBytes); + if(ret){ + if(ret > VHeapMax) VHeapMax = ret; + if(ret < VHeapMin) VHeapMin = ret; + } + OutTraceB("HeapReAlloc: (virtual) ret=%x\n", ret); + } + else { + ret = (*pHeapReAlloc)(hHeap, dwFlags, lpMem, dwBytes); + OutTraceB("HeapReAlloc: ret=%X\n", ret); + } + return ret; +} + +BOOL WINAPI extHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) +{ + BOOL ret; + OutTraceB("HeapFree: heap=%x flags=%x mem=%x\n", hHeap, dwFlags, lpMem); + if((lpMem >= VHeapMin) && (lpMem <= VHeapMax)){ + free(lpMem); + ret = TRUE; + OutTraceB("HeapFree: (virtual) ret=%x\n", ret); + } + else { + ret = (*pHeapFree)(hHeap, dwFlags, lpMem); + OutTraceB("HeapFree: ret=%x\n", ret); + } + return ret; +} + +BOOL WINAPI extHeapValidate(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) +{ + BOOL ret; + OutTraceB("HeapValidate: heap=%x flags=%x mem=%x\n", hHeap, dwFlags, lpMem); + if((lpMem >= VHeapMin) && (lpMem <= VHeapMax)){ + ret = TRUE; + OutTraceB("HeapValidate: (virtual) ret=%x\n", ret); + } + else { + ret = (*pHeapValidate)(hHeap, dwFlags, lpMem); + OutTraceB("HeapValidate: ret=%x\n", ret); + } + return ret; +} + +SIZE_T WINAPI extHeapCompact(HANDLE hHeap, DWORD dwFlags) +{ + SIZE_T ret; + OutTraceB("HeapCompact: heap=%x flags=%x\n", hHeap, dwFlags); + if(((DWORD)hHeap >= 0xDEADBEEF) && ((DWORD)hHeap < 0xDEADBEEF + iProg)){ + ret = 100000; // just a number .... + OutTraceB("HeapCompact: (virtual) ret=%d\n", ret); + } + else { + ret = (*pHeapCompact)(hHeap, dwFlags); + OutTraceB("HeapCompact: ret=%d\n", ret); + } + return ret; +} + +HANDLE WINAPI extHeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize) +{ + HANDLE ret; + OutTraceB("HeapCreate: flags=%x size(init-max)=(%d-%d)\n", flOptions, dwInitialSize, dwMaximumSize); + //flOptions &= ~HEAP_NO_SERIALIZE; + //ret = (*pHeapCreate)(flOptions, dwInitialSize, dwMaximumSize); + ret = (HANDLE)(0xDEADBEEF + iProg++); + OutTraceB("HeapCreate: (virtual) ret=%X\n", ret); + return ret; +} + +HANDLE WINAPI extGetProcessHeap(void) +{ + OutTraceB("GetProcessHeap: (virtual) ret=0xDEADBEEF\n"); + return (HANDLE)0xDEADBEEF; +} + +BOOL WINAPI extHeapDestroy(HANDLE hHeap) +{ + BOOL ret; + OutTraceB("HeapDestroy: heap=%x\n", hHeap); + if(((DWORD)hHeap >= 0xDEADBEEF) && ((DWORD)hHeap < 0xDEADBEEF + iProg)) + ret = TRUE; + else + ret = (*pHeapDestroy)(hHeap); + OutTraceB("HeapDestroy: ret=%x\n", ret); + return ret; +} + +#else + +LPVOID WINAPI extHeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) +{ + LPVOID ret; + OutTraceB("HeapAlloc: heap=%x flags=%x bytes=%d\n", hHeap, dwFlags, dwBytes); + ret = malloc(dwBytes); + if(ret){ + if(ret > VHeapMax) VHeapMax = ret; + if(ret < VHeapMin) VHeapMin = ret; + } + OutTraceB("HeapAlloc: (virtual) ret=%x\n", ret); + return ret; +} + +LPVOID WINAPI extHeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, SIZE_T dwBytes) +{ + LPVOID ret; + OutTraceB("HeapReAlloc: heap=%x flags=%x mem=%x bytes=%d\n", hHeap, dwFlags, lpMem, dwBytes); + ret = realloc(lpMem, dwBytes); + if(ret){ + if(ret > VHeapMax) VHeapMax = ret; + if(ret < VHeapMin) VHeapMin = ret; + } + OutTraceB("HeapReAlloc: (virtual) ret=%x\n", ret); + return ret; +} + +BOOL WINAPI extHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) +{ + BOOL ret; + OutTraceB("HeapFree: heap=%x flags=%x mem=%x\n", hHeap, dwFlags, lpMem); + if((lpMem >= VHeapMin) && (lpMem <= VHeapMax)){ + free(lpMem); + ret = TRUE; + OutTraceB("HeapFree: (virtual) ret=%x\n", ret); + } + else { + ret = (*pHeapFree)(hHeap, dwFlags, lpMem); + OutTraceB("HeapFree: ret=%x\n", ret); + } + return ret; +} + +BOOL WINAPI extHeapValidate(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) +{ + BOOL ret; + OutTraceB("HeapValidate: heap=%x flags=%x mem=%x\n", hHeap, dwFlags, lpMem); + if((lpMem >= VHeapMin) && (lpMem <= VHeapMax)){ + ret = TRUE; + OutTraceB("HeapValidate: (virtual) ret=%x\n", ret); + } + else { + ret = (*pHeapValidate)(hHeap, dwFlags, lpMem); + OutTraceB("HeapValidate: ret=%x\n", ret); + } + return ret; +} + +SIZE_T WINAPI extHeapCompact(HANDLE hHeap, DWORD dwFlags) +{ + SIZE_T ret; + OutTraceB("HeapCompact: heap=%x flags=%x\n", hHeap, dwFlags); + if(((DWORD)hHeap >= 0xDEADBEEF) && ((DWORD)hHeap < 0xDEADBEEF + iProg)){ + ret = 100000; // just a number .... + OutTraceB("HeapCompact: (virtual) ret=%d\n", ret); + } + else { + ret = (*pHeapCompact)(hHeap, dwFlags); + OutTraceB("HeapCompact: ret=%d\n", ret); + } + return ret; +} + +HANDLE WINAPI extHeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize) +{ + HANDLE ret; + OutTraceB("HeapCreate: flags=%x size(init-max)=(%d-%d)\n", flOptions, dwInitialSize, dwMaximumSize); + ret = (HANDLE)(0xDEADBEEF + iProg++); + OutTraceB("HeapCreate: (virtual) ret=%X\n", ret); + return ret; +} + +HANDLE WINAPI extGetProcessHeap(void) +{ + OutTraceB("GetProcessHeap: (virtual) ret=0xDEADBEEF\n"); + return (HANDLE)0xDEADBEEF; +} + +BOOL WINAPI extHeapDestroy(HANDLE hHeap) +{ + BOOL ret; + OutTraceB("HeapDestroy: heap=%x\n", hHeap); + if(((DWORD)hHeap >= 0xDEADBEEF) && ((DWORD)hHeap < 0xDEADBEEF + iProg)) + ret = TRUE; + else + ret = (*pHeapDestroy)(hHeap); + OutTraceB("HeapDestroy: ret=%x\n", ret); + return ret; +} + +#endif \ No newline at end of file diff --git a/dll/queryint.cpp b/dll/queryint.cpp index 6a8f41e..4872783 100644 --- a/dll/queryint.cpp +++ b/dll/queryint.cpp @@ -227,4 +227,3 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte return res; } - diff --git a/dll/user32.cpp b/dll/user32.cpp index 12aa64d..06b19c0 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -77,7 +77,7 @@ static HookEntryEx_Type Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLongA, (FARPROC)extGetWindowLongA}, {HOOK_HOT_CANDIDATE, 0, "SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW}, {HOOK_HOT_CANDIDATE, 0, "GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW}, - {HOOK_IAT_CANDIDATE, 0, "IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible}, + {HOOK_IAT_CANDIDATE, 0, "IsWindowVisible", (FARPROC)IsWindowVisible, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible}, // ref. in dxw.SetClipper, CreateWindowCommon {HOOK_IAT_CANDIDATE, 0, "GetTopWindow", (FARPROC)GetTopWindow, (FARPROC *)&pGetTopWindow, (FARPROC)extGetTopWindow}, // hot by MinHook since v2.03.07 {HOOK_HOT_CANDIDATE, 0, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA}, @@ -676,6 +676,13 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) return TRUE; } + if(dxw.Windowize && dxw.IsFullScreen() && dxw.IsDesktop(hwnd)){ + if(dxw.dwFlags1 & CLIPCURSOR){ + OutTraceDW("ShowWindow: clipper on main win %s\n", (nCmdShow==SW_HIDE)?"OFF":"ON"); + (nCmdShow==SW_HIDE) ? dxw.EraseClipCursor() : dxw.SetClipCursor(); + } + } + nOrigCmd = nCmdShow; if (dxw.dwFlags1 & PREVENTMAXIMIZE){ if(nCmdShow==SW_MAXIMIZE){ @@ -1756,6 +1763,8 @@ static HWND WINAPI CreateWindowCommon( (*pShowWindow)(hwnd, SW_SHOWNORMAL); } + //if (isNewDesktop) dxw.SethWnd(hwnd); + if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwStyle & WS_CHILD) && dxw.IsDesktop(hwnd)) dxw.FixWindowFrame(hwnd); @@ -1929,31 +1938,29 @@ LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WP return res; } -LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI DefWindowProcCommon(char *Label, DefWindowProc_Type pDefWindowProc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! // v2.03.50: fix - do clip cursor only after the window has got focus + // v2.04.14: fix - erase clip cursor when window loses focus !!! HRESULT res; res = (HRESULT)-1; - if(IsTraceW) ExplainMsg("DefWindowProcA", hwnd, Msg, wParam, lParam); - if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcA", hwnd, Msg, wParam, &lParam); - if (res==(HRESULT)-1) res = (*pDefWindowProcA)(hwnd, Msg, wParam, lParam); - if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor(); + if(IsTraceW) ExplainMsg(Label, hwnd, Msg, wParam, lParam); + if(hwnd == dxw.GethWnd()) res=FixWindowProc(Label, hwnd, Msg, wParam, &lParam); + if (res==(HRESULT)-1) res = (*pDefWindowProc)(hwnd, Msg, wParam, lParam); + if(dxw.dwFlags1 & CLIPCURSOR){ + switch(Msg){ + case WM_SETFOCUS: dxw.SetClipCursor(); break; + case WM_KILLFOCUS: dxw.EraseClipCursor(); break; // v2.04.14: forgotten case .... + } + } return res; } LRESULT WINAPI extDefWindowProcW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - // v2.02.30: fix (Imperialism II): apply to main window only !!! - // v2.03.50: fix - do clip cursor only after the window has got focus - HRESULT res; - res = (HRESULT)-1; - if(IsTraceW) ExplainMsg("DefWindowProcW", hwnd, Msg, wParam, lParam); - if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcW", hwnd, Msg, wParam, &lParam); - if (res==(HRESULT)-1) res = (*pDefWindowProcW)(hwnd, Msg, wParam, lParam); - if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor(); - return res; -} +{ return DefWindowProcCommon("DefWindowProcW", pDefWindowProcW, hwnd, Msg, wParam, lParam); } +LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ return DefWindowProcCommon("DefWindowProcA", pDefWindowProcA, hwnd, Msg, wParam, lParam); } static int HandleRect(char *ApiName, void *pFun, HDC hdc, const RECT *lprc, HBRUSH hbr) { @@ -2031,14 +2038,9 @@ static int HandleRect(char *ApiName, void *pFun, HDC hdc, const RECT *lprc, HBRU } int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr) -{ - return HandleRect("FillRect", (void *)pFillRect, hdc, lprc, hbr); -} - +{ return HandleRect("FillRect", (void *)pFillRect, hdc, lprc, hbr); } int WINAPI extFrameRect(HDC hdc, const RECT *lprc, HBRUSH hbr) -{ - return HandleRect("FrameRect", (void *)pFrameRect, hdc, lprc, hbr); -} +{ return HandleRect("FrameRect", (void *)pFrameRect, hdc, lprc, hbr); } BOOL WINAPI extInvertRect(HDC hdc, const RECT *lprc) { diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index 679194c..d956331 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -32,8 +32,8 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_SINGLEPROCAFFINITY, cTarget->m_SingleProcAffinity); DDX_Check(pDX, IDC_USELASTCORE, cTarget->m_UseLastCore); DDX_Check(pDX, IDC_HANDLEEXCEPTIONS, cTarget->m_HandleExceptions); + DDX_Check(pDX, IDC_VIRTUALHEAP, cTarget->m_VirtualHeap); DDX_Check(pDX, IDC_LIMITRESOURCES, cTarget->m_LimitResources); - DDX_Check(pDX, IDC_SUPPRESSIME, cTarget->m_SuppressIME); DDX_Check(pDX, IDC_CDROMDRIVETYPE, cTarget->m_CDROMDriveType); DDX_Check(pDX, IDC_FONTBYPASS, cTarget->m_FontBypass); DDX_Check(pDX, IDC_BUFFEREDIOFIX, cTarget->m_BufferedIOFix); diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index fe4da6c..ed06445 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -31,6 +31,7 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_ZBUFFERCLEAN, cTarget->m_ZBufferClean); DDX_Check(pDX, IDC_ZBUFFER0CLEAN, cTarget->m_ZBuffer0Clean); DDX_Check(pDX, IDC_DYNAMICZCLEAN, cTarget->m_DynamicZClean); + DDX_Check(pDX, IDC_ZBUFFERHARDCLEAN, cTarget->m_ZBufferHardClean); DDX_Check(pDX, IDC_NOPOWER2FIX, cTarget->m_NoPower2Fix); DDX_Check(pDX, IDC_NOD3DRESET, cTarget->m_NoD3DReset); DDX_Check(pDX, IDC_SUPPRESSD3DEXT, cTarget->m_SuppressD3DExt); diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index 71ff946..b29852f 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -43,6 +43,7 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_UNLOCKZORDER, cTarget->m_UnlockZOrder); DDX_Check(pDX, IDC_NODESTROYWINDOW, cTarget->m_NoDestroyWindow); DDX_Check(pDX, IDC_ACTIVATEAPP, cTarget->m_ActivateApp); + DDX_Check(pDX, IDC_SUPPRESSIME, cTarget->m_SuppressIME); DDX_Radio(pDX, IDC_FREEMOVE, cTarget->m_WinMovementType); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index e706ef3..0ceaffa 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -59,6 +59,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ImportTable = FALSE; m_TraceHooks = FALSE; m_HandleExceptions = FALSE; + m_VirtualHeap = FALSE; m_SuppressIME = FALSE; m_SuppressD3DExt = FALSE; m_Enum16bitModes = FALSE; @@ -113,6 +114,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ZBufferClean = FALSE; m_ZBuffer0Clean = FALSE; m_DynamicZClean = FALSE; + m_ZBufferHardClean = FALSE; m_ZBufferAlways = FALSE; m_HotPatchAlways = FALSE; m_FreezeInjectedSon = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index d3cc420..78ff6db 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -163,12 +163,9 @@ public: BOOL m_NoDDExclusiveMode; BOOL m_CreateDesktop; BOOL m_AllowSysmemOn3DDev; - //BOOL m_ForceVSync; - //BOOL m_ForceNoVSync; - //BOOL m_ForceWait; - //BOOL m_ForceNoWait; BOOL m_HandleAltF4; BOOL m_HandleExceptions; + BOOL m_VirtualHeap; BOOL m_SkipFPS; BOOL m_LimitFPS; BOOL m_ShowFPS; @@ -221,6 +218,7 @@ public: BOOL m_ZBufferClean; BOOL m_ZBuffer0Clean; BOOL m_DynamicZClean; + BOOL m_ZBufferHardClean; BOOL m_ZBufferAlways; BOOL m_HotPatchAlways; BOOL m_FreezeInjectedSon; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index b7bbfca5975516b1a89b3a60bd4fea2e4fb0602c..371390a29da861698374439e403b1d7cd5a5faf9 100644 GIT binary patch delta 6190 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 delta 6980 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 wjf>Ohu>kw_(ARwQRb= 6)){ DxSelfElevate((CDxwndhostView *)NULL); } - return TRUE; + + // save system colors for later recovery + for(int index=COLOR_SCROLLBAR; index<=COLOR_MENUBAR; index++) SysColors[index]=0; // initialize + for(int index=COLOR_SCROLLBAR; index<=COLOR_MENUBAR; index++) SysColors[index]=::GetSysColor(index); + return TRUE; } @@ -250,17 +255,20 @@ class CAboutDlg : public CDialog { public: CAboutDlg(); + virtual BOOL OnInitDialog(); // Data Dialog //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; CString m_Version; + CString m_Thanks; //}}AFX_DATA // ClassWizard generated virtual function overrides. //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Support + virtual void OnTimer(UINT_PTR); //}}AFX_VIRTUAL // Implementation @@ -283,13 +291,52 @@ void CAboutDlg::DoDataExchange(CDataExchange* pDX) CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) DDX_Text(pDX, IDC_VERSION, m_Version); + DDX_Text(pDX, IDC_THANKS, m_Thanks); //}}AFX_DATA_MAP } +#define ID_HELP_SCROLL 999 + +BOOL CAboutDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + SetTimer(ID_HELP_SCROLL, 600, NULL); + return TRUE; // return TRUE unless you set the focus to a control +} + +CString Thanks[] = { +"Aqrit for proxies, many tweaks & hot patching schema", +"AxXxB and Old-Games.ru teammates for ZBUFFER fix", +"Fabian \"ryg\" Giesen & others for DXT1/5 compression", +"FunkyFr3sh for fixes in proxy dll", +"Gsky916 for chinese translation", +"Jari Kommpa for ddraw wrapper source and d3d hints", +"Jiri Dvorak for his d3d8 wrapper with 16bpp emulation", +"Luigi Auriemma for injection syncronization", +"Michael Koch for d3d9 proxy dll", +"Narzoul for sharing DC handling code", +"Olly (www.ollydbg.de) for OllyDBG & disasm lib", +"RomSteady for his kind encouragement", +"Ryan Geiss for his bilinear filter code", +"TigerhawkT3 for html manual pages", +"Tsuda Kageyu for MinHook dll", +""}; + +#define THANKSKOUNT 15 + +void CAboutDlg::OnTimer(UINT_PTR nIDEvent) +{ + static int i=0; + int j; + CString RolledThanks; + for(j=i; jSetDlgItemTextA(IDC_THANKS, RolledThanks); + i=(i+1)%THANKSKOUNT; +} + BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) - //{{AFX_MSG_MAP(CAboutDlg) - // There is no message handler. - //}}AFX_MSG_MAP + ON_WM_TIMER() END_MESSAGE_MAP() // The application command to run the dialog @@ -300,7 +347,26 @@ void CDxwndhostApp::OnAppAbout() GetDllVersion(tmp); sprintf(ver, "DLL version %s", tmp); aboutDlg.m_Version = ver; + aboutDlg.m_Thanks = ""; +// aboutDlg.m_Thanks = "\ +//Aqrit for proxies, many tweaks & hot patching schema\n\ +//AxXxB and Old-Games.ru teammates for ZBUFFER fix\n\ +//Fabian \"ryg\" Giesen & others for DXT1/5 compression\n\ +//FunkyFr3sh for fixes in proxy dll\n\ +//Gsky916 for chinese translation\n\ +//Jari Kommpa for ddraw wrapper source and d3d hints\n\ +//Jiri Dvorak for his d3d8 wrapper with 16bpp emulation\n\ +//Luigi Auriemma for injection syncronization\n\ +//Michael Koch for d3d9 proxy dll\n\ +//Narzoul for sharing DC handling code\n\ +//Olly (www.ollydbg.de) for OllyDBG & disasm lib\n\ +//RomSteady for his kind encouragement\n\ +//Ryan Geiss for his bilinear filter code\n\ +//TigerhawkT3 for html manual pages\n\ +//Tsuda Kageyu for MinHook dll\n\ +//"; aboutDlg.DoModal(); + aboutDlg.KillTimer(ID_HELP_SCROLL); } void CDxwndhostApp::OnViewHelp() diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 67e3abda61402d11f5a96eeb7657ac20e369e8ad..2bac5514af5f734fa0e8f87a7db5be95786809d7 100644 GIT binary patch delta 1010 zcmX|AZAe>Z6h6nBFEf=`Oks;3+1hEeG0jcPhfc4RS#j-Vrxv_QP(iNXbSkYD)8?P(x>7Z2fRh7-MCu!pe~S*aquh6zO?ybzI)}z4v*~ z`Jd05)C%(| za(G*?VW_7Iy$LR)uw>hQ=!OpHfxVK(4>1`{5S2M3PefK7LfkunRg^wr$-RE)^cz|f zqPZV(jU{~i#UclJmn!TknNZVP*FAQ{)(4%`UigyMm!_?XBgPMW*q*skmiwbHj#D?# zM#gdrd+TrueS71RQWX=Ie12$_Y#00(qtCvXCGQ6o^4+YY^w}3^ba_tGAx`C453N7m zo;!LoX{FRz3+jBg2y19%sFtd~zpo&xE-eHJZ+*=EAJHkt!ZdN~BMj5nfSxmMS4T0f zUb)~avg9)w&XrSYp&_&C&zE8e8?`u_ zU#!Cb@=6gpXzJ1~_SNGI3ubVj8OwNU1Af7GY$Dp$Y@7o<=-~evaE@1fXwdmLNGj6;1p&v6C^@*+^pZ!YONJN*Mb}Mo5*)<(u7ivTSw8=*e#Yw zh-H*{4v1ZnatkA{Q|9=FFHgvBLaY=J<6Qg6W9=3@cF^-<2RYq|j$&OxpZ203s>x3p P`0GVwlKgwWVQlCLLE0>t delta 2094 zcmZ`(ZERCz6n;-zYPZh00Yb@!mV&TNWNp`OZOBHK;b!>A*oI1oCUouC2COX|vSADx zGf^@yF}!4l5TeUs<{V}Ln=n2m!HN7dM2s;8`SK4cCc_{8Fvj?tTk2-j+_d+;?>*0R z&UxPF+^22DmPqu7N^*3HN>94}YI?-g+gUvM!jcO0B z1InpNRF843QSnE6QPry2)fyF5ZK@OzJMkuodsKC*ZWYF_3#&a?wQ5hKNI1!-k2F{F z@Jf><7*QPvYD0iiZ3I--b4e;d6vR#fq;b`26cLrw88W+HdDUv=Q32)Q&&H{uuvYCw zaHrarA>#5^spxShN)h%p6cqj&U73Y0Z9v#=qzQtuGQ)toKs!|o@NWE^Y9IIAq$T{y z0OjgXBv1OXS7nhkG=nG%kW)1PB!YC$p%g+{x8g1W33=EMZ>O=d4{MP!qR)P~K-Wa_ zjU<7rBvo5M@)~3cBXlGF+W|X(omm+-8{{uQz&Lu7vzaSkFpF^WCV)FZ(}~bpJd2p3 z8g!dOD)sKdegr~yf>^rjM&cNDtd$1XWcBvL{ zhzX)lWG-{sD7%fKqj=K>{)o|9lJ}aZ6wa{OeOa9C^ZJtNwBwGG{RRJrmaMlyF9BPsZ9ZW=&u=^?QFYaUxRAdko`Qtt;c ziCp5s40mP>qEIu6F?Qk$BQXhF=>g~gTB>pyGuf&V`t0a(-m!>eB5d~T8Gd;K(CLiw zNfG198O&ykB9CO~`Hx)PK#1id$UUoyQJen0tLRaixjC7Sj-NeATF#qplP%?J*}u)~ zQ9*7hCXYUPAusjK=^48oKYvQ^7_jJF=R>K%3nz#I+~=Zodg8lz1WsED_$BbT1JTCZo~R^oHVm zeWl2eiv4l8&_HrQDOn~TYxQujyK(@-E1#;;h2y0> z^AqJx9$Z4d&m#|033Q6x&*kZ-X_QSRR0GxKb6GweBzIcHDykDVs%x z8%EvqCxXy$EnjiLKfikDU1==D(_Uy1;L{a!*XWd;r6wz1_t7AqZ=`x2_R|SIx`kjf l2-06EMY?FAzIg4a$(jJ&95n}2P#;>hm}h<<$D|lL{uiwv9`67E diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 6bc3170a1efbc6ffd59f3b978beb97a68b243a9c..72dba90d59b7b53f9e107d84c968d4bc012a4a5f 100644 GIT binary patch delta 38678 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 DpeG!A delta 2139 zcmZ`)4@{Kj8ULQ={q8uf=XqWadf@f;4NtJ!6+VzMX36!6_Mb(<40FV}^;9&JOnV|! zW>R-e+RQCNkXP?X9PMs2yAro9$XPyXts&|%U^cm#s+%Lr4eX!LPKiTf-Gn_KFp@Rd zm%PdQ=Xu`m_x_&W^E|OJXY7!pD-26dJeeib?TVtv8qo(M^0sJS^0T6EzVzxP5WG9| zN4Z~pPM&v`N?lduUG;f+UM-a|n=0EaX?13Hb~aUGJqfN?Ug+3&BjX7FG`VWu?+tB#r6Q-$M&<7Sd9gIoz=RDcfug=Ir$H2sr4=>N|qw`FRcYT z{r&s+H8yfs+-#)Eue(;uu*<`v`f)`8w!EIj*YQ}z=O6y2+WAK3Fr6H!Sl)R-Yx}Uw z!scTQa{t34R#?MxTm+nI^&fE2=rZB#E_qF2RaI)JM9~Pz(p|@)1_-*Z|vwX@2o<+OVbjKGD&hvf!S3Z?ChF}$?%h5~GD7dM=NH}G3 zWHa^e0ei|mT?O4M{V9LnY0JFN*gJuI>J5QgHr(!`bbwv-U!o?<{vD+YZ$K6GujI43 zFFmsFesy<0yN-^pthO=){ysC6pyVhw#p`G{Sz3Y$6Fv7;c6_cbOcm{rImgAd@`6s` z5(uSYQ!yc9|MXLT4!Dhc52T^@j+Jl%3k_EQuED^JN1X#oUW7*YHNArH3)o0`0-lEn zV~2o0*bX;tp@RHVgHE_8<~`HP;O^nZpfT+R2f$?mYG4+Ux!|O8 zLGT;?D2&5kA%wG`QvT`D0KHWL5654GkTFyOVJDUCfq)Tcf%Rx)T0sNaISD%HolqUG zG~KIVJlkmLgieSbftLBbS{TpAm-kX^7lcSZjg3_07G6-OG=Xaen}J`wthj)*-QcI8 zT@c0}wNdy!|1!KAhJad*K!h46p^OrzI3t*S>N^Szl=eWbk=p~4V1~sbyMEv{3J2gc zc0a~IUWW09Xxj*cWMtSzh3~>{s?Ra+$VWA$53^EZJ59h{FfOR~yI5gpAs7W&U8osa z95NOsfZgQ{PLcBB2zaBvy5 zv|$BBj)2{$@!}A~|H@FcFCYVQ+wEeid7s^W`)$;W=6vj3IGqA*iR>!T>38>8QqC74 zhb~+35z;5nYXp2a1{A%Dj_v~OT@BAHs3{}RH>WEjb_a%#x{iZNM|Z&r+L4WUbm<7_ zhMtArLi#v@c}6T7V@?_{lgP!BOb~2Fc{yGLI{QAlDZGJoAE?A8LDNy@vChM{g;xlV z)JD8iTaSLKE);yDAJaMHYGQ6W!?5s_Q}uWfk`;(Fz84C~wVatZ=`+r4!VpkshBx)C z9Oo@fxMm?xrWh#Nf{A1mmk69>ea^Ww@5Lmi;uB0-1HNOU2QFg~MLWPj8|#_aU=!-b z&aHUNO70fSjklteg8T3zi5H)y%=h>u4Lx{@@H6lkzGl3hMcotVH;UiDr-9Zj=fEXa zvi7*NG;+aQ0SQ=7TPI;P>7TONnor>%&}&yAm~6*@ap^P`0}Wk)3ObmDLFlE@88)4A zGmy%wI80FwvuGQ~3X$w(-3@d?F4cdGyUm;lQhyJ3iS!Ljm`W?7za0fHt+#RL*G=IW zpnFla(I3O0jC`rm7OM!v3r*B#u+ckT9e%>fZ-e#5s8v)z+%95tE&v)OHb6wizTqNQ z6#C6Tm(BN!@FYv^_+N07jokTINmZR3psww#p^RM=aH>q(C{`denh7xMvI0?ygP-8D zDg+jbxY0U^hXkD{7P-WA&njI-UgKmybaKuPW0LBM#DI+0wEsJ}X>#T9k?$71Z8i#H z`W9Za(6$2MpV!z_6b^{56tHtfY=%?i?OUAyu$f-{1fQETrXCQ1B|DV8%1cU{(xPlv zcF?SZ)t39*2WL`{{1?Pk@hmJ|#80iNsONP5Z*R7Kz#W1cxY_F?w&ip|7iazhQ`Xn} diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 43828e7..df49485 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -151,6 +151,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView) ON_COMMAND(ID_DESKTOPCOLORDEPTH_32BPP, OnDesktopcolordepth32bpp) ON_COMMAND(ID_TOOLS_RECOVERSCREENMODE, OnRecoverScreenMode) ON_COMMAND(ID_TOOLS_CLEARCOMPATIBILITYFLAGS, OnClearCompatibilityFlags) + ON_COMMAND(ID_TOOLS_RECOVERSYSTEMCOLORS, OnRecoverSystemColors) ON_COMMAND(ID_MOVE_TOP, OnMoveTop) ON_COMMAND(ID_MOVE_UP, OnMoveUp) ON_COMMAND(ID_MOVE_DOWN, OnMoveDown) @@ -376,6 +377,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_RegistryOp) t->tflags |= OUTREGISTRY; if(dlg->m_TraceHooks) t->tflags |= TRACEHOOKS; if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS; + if(dlg->m_VirtualHeap) t->flags8 |= VIRTUALHEAP; if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES; if(dlg->m_CDROMDriveType) t->flags3 |= CDROMDRIVETYPE; if(dlg->m_HideCDROMEmpty) t->flags4 |= HIDECDROMEMPTY; @@ -386,6 +388,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ZBufferClean) t->flags4 |= ZBUFFERCLEAN; if(dlg->m_ZBuffer0Clean) t->flags4 |= ZBUFFER0CLEAN; if(dlg->m_DynamicZClean) t->flags8 |= DYNAMICZCLEAN; + if(dlg->m_ZBufferHardClean) t->flags8 |= ZBUFFERHARDCLEAN; if(dlg->m_ZBufferAlways) t->flags4 |= ZBUFFERALWAYS; if(dlg->m_HotPatchAlways) t->flags4 |= HOTPATCHALWAYS; if(dlg->m_FreezeInjectedSon) t->flags5 |= FREEZEINJECTEDSON; @@ -705,6 +708,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_RegistryOp = t->tflags & OUTREGISTRY ? 1 : 0; dlg->m_TraceHooks = t->tflags & TRACEHOOKS ? 1 : 0; dlg->m_HandleExceptions = t->flags & HANDLEEXCEPTIONS ? 1 : 0; + dlg->m_VirtualHeap = t->flags8 & VIRTUALHEAP ? 1 : 0; dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0; dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0; dlg->m_Enum16bitModes = t->flags7 & ENUM16BITMODES ? 1 : 0; @@ -756,6 +760,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ZBufferClean = t->flags4 & ZBUFFERCLEAN ? 1 : 0; dlg->m_ZBuffer0Clean = t->flags4 & ZBUFFER0CLEAN ? 1 : 0; dlg->m_DynamicZClean = t->flags8 & DYNAMICZCLEAN ? 1 : 0; + dlg->m_ZBufferHardClean = t->flags8 & ZBUFFERHARDCLEAN ? 1 : 0; dlg->m_ZBufferAlways = t->flags4 & ZBUFFERALWAYS ? 1 : 0; dlg->m_HotPatchAlways = t->flags4 & HOTPATCHALWAYS ? 1 : 0; dlg->m_FreezeInjectedSon = t->flags5 & FREEZEINJECTEDSON ? 1 : 0; @@ -2714,6 +2719,9 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) case ID_TOOLS_CLEARCOMPATIBILITYFLAGS: OnClearCompatibilityFlags(); break; + case ID_TOOLS_RECOVERSYSTEMCOLORS: + OnRecoverSystemColors(); + break; case ID_MOVE_TOP: OnMoveTop(); break; @@ -3517,6 +3525,19 @@ void CDxwndhostView::OnRecoverScreenMode() RevertScreenChanges(&this->InitDevMode); } +void CDxwndhostView::OnRecoverSystemColors() +{ + extern DWORD SysColors[]; + //for(int index=COLOR_SCROLLBAR; index<=COLOR_MENUBAR; index++) { + for(int index=COLOR_SCROLLBAR; index<=COLOR_BTNHIGHLIGHT; index++) { // don't mess with taskbar ... + if(SysColors[index]) { + INT colors[1]; + colors[0]=index; + ::SetSysColors(1, colors, &SysColors[index]); + } + } +} + void CDxwndhostView::OnClearCompatibilityFlags() { int i; diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index 338817c..49396b4 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -113,6 +113,7 @@ protected: afx_msg void OnDesktopcolordepth32bpp(); afx_msg void OnRecoverScreenMode(); afx_msg void OnClearCompatibilityFlags(); + afx_msg void OnRecoverSystemColors(); afx_msg void OnMoveTop(); afx_msg void OnMoveUp(); afx_msg void OnMoveDown(); diff --git a/host/resource b/host/resource index dd51769dc52070311d736a693f95058d622dfa26..6a04992522a037d0db931e421f3749c1deb49030 100644 GIT binary patch delta 151 zcmeycg89*E<_#tj*+UpS7#tb=CI?QGp2R4&Szw}r$Ycd!mdOdle5@V}t_+To8!c2P z8!Tm;>>?;P*~f*C9i%>p!DVu!i!xaJ(^8quK})AeOfFc(Hu=vk8PQ0FV1^K&R$m5Z z27d-0AP!;(p4@y{eR9HnvCaSXP7$5Ffk$Gp&t-|phc4?)7E%`jvPC9KT?qpKMb9$k delta 52 zcmV-40L%a4s{`<;1F$ravyhP-6tiTem>82V!4|V{zmye|LcbW3zSJ0#G}SJX7LgW{ KzSI