diff --git a/build/dxwnd.dll b/build/dxwnd.dll index f2ce6d0..afa42c5 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f3a3c1ff5c9ff0497a5155abf197a32ac7481a31130d4c441ece3e50b022e6eb -size 525312 +oid sha256:768707a31acc1f63671cfd55c5a50d061b29db777bdf61b5439a42dea27c7c6a +size 525824 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 06dd726..3ad4a83 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f379180ba2b97d28926280bc4a1b02ed95f3f90cd191aa3fa94d4757bdd106b3 +oid sha256:d802959c3ec0c17b5e1e7d58672c91b0223a9b3285725418cb44a73bbfe5b3d4 size 558592 diff --git a/build/exports/007 NightFire.dxw b/build/exports/007 NightFire.dxw index b22a450..d580eb3 100644 --- a/build/exports/007 NightFire.dxw +++ b/build/exports/007 NightFire.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=134234150 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,7 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +flagj0=128 +winver0=0 +maxres0=0 diff --git a/build/exports/101 The Airborne Invasion of Normandy.dxw b/build/exports/101 The Airborne Invasion of Normandy.dxw index 71bb96f..0ed54a6 100644 --- a/build/exports/101 The Airborne Invasion of Normandy.dxw +++ b/build/exports/101 The Airborne Invasion of Normandy.dxw @@ -6,9 +6,9 @@ opengllib0= ver0=0 coord0=0 flag0=134234146 -flagg0=134217728 +flagg0=1207959552 flagh0=20 -flagi0=0 +flagi0=4194304 tflag0=192 initx0=0 inity0=0 @@ -22,3 +22,7 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +flagj0=128 +winver0=0 +maxres0=0 diff --git a/build/exports/Actua Soccer 3.dxw b/build/exports/Actua Soccer 3.dxw index ba11b10..f429d80 100644 --- a/build/exports/Actua Soccer 3.dxw +++ b/build/exports/Actua Soccer 3.dxw @@ -25,3 +25,4 @@ initts0=0 launchpath0= winver0=0 maxres0=0 +flagj0=128 diff --git a/build/exports/Age of Empires.dxw b/build/exports/Age of Empires.dxw index 7eb4bf9..b8e909f 100644 --- a/build/exports/Age of Empires.dxw +++ b/build/exports/Age of Empires.dxw @@ -9,7 +9,7 @@ coord0=0 flag0=134218272 flagg0=1207959552 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -25,3 +25,4 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +flagj0=128 diff --git a/build/exports/Doom Shareware for Windows 95.dxw b/build/exports/Doom Shareware for Windows 95.dxw index 4a7a3ab..409ee16 100644 --- a/build/exports/Doom Shareware for Windows 95.dxw +++ b/build/exports/Doom Shareware for Windows 95.dxw @@ -8,7 +8,7 @@ coord0=0 flag0=134217762 flagg0=1207959552 flagh0=20 -flagi0=0 +flagi0=4194304 tflag0=0 initx0=0 inity0=0 @@ -22,3 +22,7 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +launchpath0= +flagj0=128 +winver0=0 +maxres0=2 diff --git a/build/exports/Kingpin Life Of Crime (intro).dxw b/build/exports/Kingpin Life Of Crime (intro).dxw new file mode 100644 index 0000000..20704a1 --- /dev/null +++ b/build/exports/Kingpin Life Of Crime (intro).dxw @@ -0,0 +1,28 @@ +[target] +title0=Kingpin Life Of Crime (intro) +path0=D:\Games\Kingpin Life Of Crime\kpintro.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=134218756 +flagj0=128 +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/Kingpin Life Of Crime.dxw b/build/exports/Kingpin Life Of Crime.dxw new file mode 100644 index 0000000..f9579ac --- /dev/null +++ b/build/exports/Kingpin Life Of Crime.dxw @@ -0,0 +1,28 @@ +[target] +title0=Kingpin Life Of Crime +path0=D:\Games\Kingpin Life Of Crime\kingpin.exe +launchpath0= +module0= +opengllib0=3dfxgl.dll +ver0=9 +coord0=0 +flag0=134234400 +flagg0=1744830464 +flagh0=21 +flagi0=-2009071610 +flagj0=128 +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/Knights_And_Merchants (1024).dxw b/build/exports/Knights_And_Merchants (1024).dxw new file mode 100644 index 0000000..b1679ec --- /dev/null +++ b/build/exports/Knights_And_Merchants (1024).dxw @@ -0,0 +1,28 @@ +[target] +title0=Knights_And_Merchants (1024) +path0=D:\Games\Knights_And_Merchants_-_The_Shattered_Kingdom\KaM_1024.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=128 +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/Knights_And_Merchants (800).dxw b/build/exports/Knights_And_Merchants (800).dxw new file mode 100644 index 0000000..91b2a53 --- /dev/null +++ b/build/exports/Knights_And_Merchants (800).dxw @@ -0,0 +1,28 @@ +[target] +title0=Knights_And_Merchants (800) +path0=D:\Games\Knights_And_Merchants_-_The_Shattered_Kingdom\KaM_800.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=128 +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/Shadow Watch.dxw b/build/exports/Shadow Watch.dxw new file mode 100644 index 0000000..1804f5b --- /dev/null +++ b/build/exports/Shadow Watch.dxw @@ -0,0 +1,28 @@ +[target] +title0=Shadow Watch +path0=D:\Games\Shadow Watch\sw.exe +launchpath0=D:\Games\Shadow Watch\ShadowWatch.exe +module0=dx.dll +opengllib0= +ver0=1 +coord0=0 +flag0=-2013265869 +flagg0=1241513984 +flagh0=4259856 +flagi0=203423748 +flagj0=128 +tflag0=0 +initx0=200 +inity0=290 +minx0=0 +miny0=0 +maxx0=800 +maxy0=600 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Star Wars Episode I Racer (emulated).dxw b/build/exports/Star Wars Episode I Racer (emulated).dxw new file mode 100644 index 0000000..ca8f2fd --- /dev/null +++ b/build/exports/Star Wars Episode I Racer (emulated).dxw @@ -0,0 +1,28 @@ +[target] +title0=Star Wars Episode I Racer (emulated) +path0=D:\Games\Star Wars Episode 1 racer\SWEP1RCR.EXE +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=679493671 +flagg0=1210056720 +flagh0=8212 +flagi0=2097172 +flagj0=136 +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=0 diff --git a/build/exports/Thorgal.dxw b/build/exports/Thorgal.dxw new file mode 100644 index 0000000..e189893 --- /dev/null +++ b/build/exports/Thorgal.dxw @@ -0,0 +1,28 @@ +[target] +title0=Thorgal +path0=D:\Games\Thorgal\THORGAL.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1242038528 +flagh0=65552 +flagi0=136314885 +flagj0=136 +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/Wind Fantasy SP.dxw b/build/exports/Wind Fantasy SP.dxw index 1cae916..41bd5f3 100644 --- a/build/exports/Wind Fantasy SP.dxw +++ b/build/exports/Wind Fantasy SP.dxw @@ -6,7 +6,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134480416 +flag0=134218272 flagg0=1207959552 flagh0=20 flagi0=4194308 @@ -25,4 +25,4 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 -flagj0=0 +flagj0=128 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index 722aee0..35d043b 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1036 -posy=444 -sizx=320 -sizy=200 +posx=1347 +posy=477 +sizx=417 +sizy=450 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 33697a9..aa531af 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -616,3 +616,10 @@ fix: debug option "highlight blit to primary" was causing game crashes when the fix: trapped sporadic CloseHandle(hMenu) crashes in a try/catch clause. fix: attempt to fix FIXD3DFRAME option fix: added SetStretchBltMode(hdc,HALFTONE) to SetDIBitsToDevice hooker to improve stretching: fixes "Celtic Kings Rage of War" + +v2.02.95 +fix: handling of limit resolution field +fix: FPS handling to screen updated made by SetDIBitsToDevice +fix: PeekMessage implementation with "Peek all message in queue": fixes "Shadow Watch" +fix: missing hook to CreateProcess - needed for "Suppress child process creation". +fix: exception for bilinear filtering applied to certain games (e.g. "Shadow Watch") diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 66c7656..af95845 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -33,11 +33,39 @@ FARPROC Remap_AdvApi32_ProcAddress(LPCSTR proc, HMODULE hModule) #define HKEY_MASK 0x7FFFFF00 #define IsFake(hKey) (((DWORD)hKey & HKEY_MASK) == HKEY_MASK) +static FILE *OpenFakeRegistry(); + static char *hKey2String(HKEY hKey) { char *skey; + static char sKey[MAX_PATH+1]; static char skeybuf[10]; - if(IsFake(hKey)) return "HKEY_FAKE"; + if(IsFake(hKey)) { + FILE *regf; + char RegBuf[MAX_PATH+1]; + regf=OpenFakeRegistry(); + if(regf!=NULL){ + HKEY hLocalKey=HKEY_FAKE; + fgets(RegBuf, 256, regf); + while (!feof(regf)){ + if(RegBuf[0]=='['){ + if(hLocalKey == hKey){ + OutTrace("building fake Key=\"%s\" hKey=%x\n", sKey, hKey); + fclose(regf); + strcpy(sKey, &RegBuf[1]); + sKey[strlen(sKey)-2]=0; // get rid of "]" + return sKey; + } + else { + hLocalKey--; + } + } + fgets(RegBuf, 256, regf); + } + fclose(regf); + } + return "HKEY_NOT_FOUND"; + } switch((ULONG)hKey){ case HKEY_CLASSES_ROOT: skey="HKEY_CLASSES_ROOT"; break; case HKEY_CURRENT_CONFIG: skey="HKEY_CURRENT_CONFIG"; break; @@ -74,7 +102,7 @@ static LONG myRegOpenKeyEx( char RegBuf[MAX_PATH+1]; sprintf(sKey,"%s\\%s", hKey2String(hKey), lpSubKey); - OutTraceDW("RegOpenKeyEx: searching for key=\"%s\"\n", sKey); + OutTraceR("RegOpenKeyEx: searching for key=\"%s\"\n", sKey); regf=OpenFakeRegistry(); if(regf!=NULL){ @@ -181,7 +209,7 @@ LONG WINAPI extRegQueryValueEx( else { if(hCurKey==hKey){ - //OutTraceDW("loop: \"%s\"\n", RegBuf); + //OutTrace("loop: \"%s\"\n", RegBuf); if((RegBuf[0]=='"') && !strncmp(lpValueName, &RegBuf[1], strlen(lpValueName)) && (RegBuf[strlen(lpValueName)+1]=='"') && @@ -202,7 +230,7 @@ LONG WINAPI extRegQueryValueEx( *lpb = 0; // string terminator if(lpType) *lpType=REG_SZ; // - OutTraceDW("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData); + OutTraceR("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData); res=ERROR_SUCCESS; } if(!strncmp(pData,"dword:",strlen("dword:"))){ //dword value @@ -212,7 +240,7 @@ LONG WINAPI extRegQueryValueEx( memcpy(lpData, &val, sizeof(DWORD)); if(lpType) *lpType=REG_DWORD; *lpcbData=sizeof(DWORD); - OutTraceDW("RegQueryValueEx: Data=0x%x type=REG_DWORD\n", val); + OutTraceR("RegQueryValueEx: Data=0x%x type=REG_DWORD\n", val); res=ERROR_SUCCESS; } if(!strncmp(pData,"hex:",strlen("hex:"))){ //dword value @@ -228,7 +256,7 @@ LONG WINAPI extRegQueryValueEx( lpData++; (*lpcbData)++; } - OutTraceDW(" type=REG_BINARY cbData=%d\n", *lpcbData); + OutTraceR(" type=REG_BINARY cbData=%d\n", *lpcbData); res=ERROR_SUCCESS; } fclose(regf); diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 155d13d..6d4144d 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -744,6 +744,8 @@ int HookDirectDraw(HMODULE module, int version) Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE lpdds) { + // to do: return extUnlock for unhooked surfaces + char sMsg[81]; void * extUnlock; __try{ // v2.02.31: catch some possible exception (i.e. Abomination in EMULATION mode) @@ -1939,6 +1941,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, OutTraceDW("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n", ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, dwwidth, dwheight); } + if(dxw.dwFlags1 & EMULATESURFACE){ dwbpp = ddsd.ddpfPixelFormat.dwRGBBitCount; } @@ -1948,8 +1951,10 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, else res = (*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); + if(res) OutTraceE("SetDisplayMode: error=%x\n", res); + SetVSyncDelays(lpdd); - return 0; + return DD_OK; } HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW lpdd, @@ -3012,6 +3017,15 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); else OutTraceDDRAW("GetAttachedSurface(%d): attached=%x\n", dxversion, *lplpddas); + +#if 0 + // beware: ddraw 7 surfaces can be created with FLIP capability, hence could have a backbuffer ??? + if((res==DDERR_NOTFOUND) && (dxversion==7) && (!IsPrim) && (!IsBack)){ + *lplpddas = lpdds; + res = DD_OK; + } +#endif + return res; } @@ -3161,8 +3175,6 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, TmpRect.bottom = ddsd.dwHeight = dwHeight; TmpRect.right = ddsd.dwWidth = dwWidth; ddsd.dwFlags = (DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS); - // work only on even width surfaces, or you'd have to take in account proper pitch! - // dwWidth = ddsd.dwWidth = ((dwWidth + 1) >> 1) << 1; // capabilities must cope with primary / backbuffer surface capabilities to get speedy operations ddsd.ddsCaps.dwCaps = bIs3DPrimarySurfaceDevice ? DDSCAPS_OFFSCREENPLAIN : (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); res=(*pCreateSurface1)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL); @@ -3190,9 +3202,8 @@ HRESULT WINAPI PrimaryBilinearBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, bDestBuf, lpdestrect, DestPitch); // fast-blit to primary - //(*pUnlockMethod(lpddssrc))(lpddssrc, NULL); - //(*pUnlockMethod(lpddsTmp))(lpddsTmp, NULL); - (*pUnlock1)(lpddssrc, NULL); + if(lpddssrc==lpDDSEmu_Back) lpddssrc->Unlock(NULL); // this surface is unhooked!!! + else (*pUnlock1)(lpddssrc, NULL); //(*pUnlock1)(lpddsTmp, NULL); lpddsTmp->Unlock(NULL); // this surface is unhooked!!! res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); @@ -3374,8 +3385,9 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, if(dxw.dwFlags5 & NOBLT) return DD_OK; destrect=dxw.MapWindowRect(lpdestrect); - - //OutTraceB("DESTRECT=(%d,%d)-(%d,%d)\n", destrect.left, destrect.top, destrect.right, destrect.bottom); + OutTraceB("DESTRECT=(%d,%d)-(%d,%d) Screen=(%dx%d)\n", + destrect.left, destrect.top, destrect.right, destrect.bottom, + dxw.GetScreenWidth(), dxw.GetScreenHeight()); // ========================= // Blit to primary direct surface @@ -4896,10 +4908,12 @@ HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpd switch(lpddsd->dwSize){ case sizeof(DDSURFACEDESC): if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, lpdds, lpddsd); - /**/ if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); + //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); + if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); break; case sizeof(DDSURFACEDESC2): if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); + //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); break; default: OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); @@ -4917,9 +4931,11 @@ HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 l switch(lpddsd->dwSize){ case sizeof(DDSURFACEDESC): if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); + //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); break; case sizeof(DDSURFACEDESC2): if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); + //else return lpdds->GetSurfaceDesc((LPDDSURFACEDESC)lpddsd); break; default: OutTraceDW("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 6368ea1..6b250e3 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -1406,8 +1406,7 @@ LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPARAM lParam) } else { // fix the message point coordinates - msg->pt=dxw.FixMessagePt(dxw.GethWnd(), msg->pt); - //msg->pt=dxw.FixMessagePt(msg->hwnd, msg->pt); + msg->pt=dxw.FixCursorPos(msg->pt); // beware: needs fix for mousewheel? if((msg->message <= WM_MOUSELAST) && (msg->message >= WM_MOUSEFIRST)) msg->lParam = MAKELPARAM(msg->pt.x, msg->pt.y); OutTraceC("MessageHook: fixed lparam/pt=(%d,%d)\n", msg->pt.x, msg->pt.y); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 2ba86cb..9b12780 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -118,11 +118,17 @@ void dxwCore::InitTarget(TARGETMAP *target) void dxwCore::SetScreenSize(void) { - SetScreenSize(800, 600); // set to default screen resolution - //SetScreenSize(640, 480); // set to default screen resolution + if(dxw.Windowize) + SetScreenSize(800, 600); // set to default screen resolution + else{ + int sizx, sizy; + sizx = GetSystemMetrics(SM_CXSCREEN); + sizy = GetSystemMetrics(SM_CYSCREEN); + SetScreenSize(sizx, sizy); + } } -void dxwCore::SetScreenSize(int x, int y) +void dxwCore::SetScreenSize(int x, int y) { DXWNDSTATUS *p; OutTraceDW("DXWND: set screen size=(%d,%d)\n", x, y); @@ -147,8 +153,9 @@ void dxwCore::SetScreenSize(int x, int y) } if(((DWORD)p->Width > maxw) || ((DWORD)p->Height > maxh)){ OutTraceDW("DXWND: limit device size=(%d,%d)\n", maxw, maxh); - p->Width = (short)maxw; - p->Height = (short)maxh; + // v2.02.95 setting new virtual desktop size + dwScreenWidth = p->Width = (short)maxw; + dwScreenHeight= p->Height = (short)maxh; } } } @@ -461,6 +468,19 @@ POINT dxwCore::FixCursorPos(POINT prev) if (h) curr.y = (curr.y * dxw.GetScreenHeight()) / h; } + if(dxw.dwFlags4 & FRAMECOMPENSATION){ + static int dx, dy, todo=TRUE; + if (todo){ + POINT FrameOffset = dxw.GetFrameOffset(); + dx=FrameOffset.x; + dy=FrameOffset.y; + OutTraceC("GetCursorPos: frame compensation=(%d,%d)\n", dx, dy); + todo=FALSE; + } + curr.x += dx; + curr.y += dy; + } + if((dxw.dwFlags1 & ENABLECLIPPING) && lpClipRegion){ // v2.1.93: // in clipping mode, avoid the cursor position to lay outside the valid rect @@ -645,37 +665,6 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect) return RetRect; } -POINT dxwCore::FixMessagePt(HWND hwnd, POINT point) -{ - RECT rect; - static POINT curr; - curr=point; - - if(!(*pScreenToClient)(hwnd, &curr)){ - OutTraceE("ScreenToClient ERROR=%d hwnd=%x at %d\n", GetLastError(), hwnd, __LINE__); - curr.x = curr.y = 0; - } - - if (!(*pGetClientRect)(hwnd, &rect)) { - OutTraceE("GetClientRect ERROR=%d hwnd=%x at %d\n", GetLastError(), hwnd, __LINE__); - curr.x = curr.y = 0; - } - -#ifdef ISDEBUG - if(IsDebug) OutTrace("FixMessagePt point=(%d,%d) hwnd=%x win pos=(%d,%d) size=(%d,%d)\n", - point.x, point.y, hwnd, point.x-curr.x, point.y-curr.y, rect.right, rect.bottom); -#endif - - if (curr.x < 0) curr.x=0; - if (curr.y < 0) curr.y=0; - if (curr.x > rect.right) curr.x=rect.right; - if (curr.y > rect.bottom) curr.y=rect.bottom; - if (rect.right) curr.x = ((curr.x * dxw.GetScreenWidth()) + (rect.right >> 1)) / rect.right; - if (rect.bottom) curr.y = ((curr.y * dxw.GetScreenHeight()) + (rect.bottom >> 1)) / rect.bottom; - - return curr; -} - void dxwCore::MapClient(LPRECT rect) { RECT client; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 6800dff..acd4c92 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -63,7 +63,6 @@ public: // methods void MapWindow(LPRECT); void MapWindow(int *, int *, int *, int *); void FixWorkarea(LPRECT); - POINT FixMessagePt(HWND, POINT); RECT GetScreenRect(void); RECT GetUnmappedScreenRect(); RECT GetWindowRect(RECT); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 278516f..ec92b34 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.94" +#define VERSION "2.02.95" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 683f2c7..3dbd983 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 6af95e4..e376ef8 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -326,24 +326,34 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) OutTraceDW("GetDeviceCaps: fix(1) BITSPIXEL/COLORRES cap=%x\n",res); return res; case HORZRES: - res = pSetDevMode->dmPelsWidth; - OutTraceDW("GetDeviceCaps: fix(1) HORZRES cap=%d\n", res); - return res; + if(dxw.Windowize){ + res = pSetDevMode->dmPelsWidth; + OutTraceDW("GetDeviceCaps: fix(1) HORZRES cap=%d\n", res); + return res; + } + break; case VERTRES: - res = pSetDevMode->dmPelsHeight; - OutTraceDW("GetDeviceCaps: fix(1) VERTRES cap=%d\n", res); - return res; + if(dxw.Windowize){ + res = pSetDevMode->dmPelsHeight; + OutTraceDW("GetDeviceCaps: fix(1) VERTRES cap=%d\n", res); + return res; + } + break; } } switch(nindex){ case VERTRES: - res= dxw.GetScreenHeight(); - OutTraceDW("GetDeviceCaps: fix(2) VERTRES cap=%d\n", res); + if(dxw.Windowize){ + res= dxw.GetScreenHeight(); + OutTraceDW("GetDeviceCaps: fix(2) VERTRES cap=%d\n", res); + } break; case HORZRES: - res= dxw.GetScreenWidth(); - OutTraceDW("GetDeviceCaps: fix(2) HORZRES cap=%d\n", res); + if(dxw.Windowize){ + res= dxw.GetScreenWidth(); + OutTraceDW("GetDeviceCaps: fix(2) HORZRES cap=%d\n", res); + } break; // WARNING: in no-emu mode, the INIT8BPP and INIT16BPP flags expose capabilities that // are NOT implemented and may cause later troubles! @@ -1313,6 +1323,7 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW } //else if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + // blitting toprimary surface !!! DWORD OrigWidth, OrigHeight; int OrigXDest, OrigYDest; OrigWidth=dwWidth; @@ -1323,6 +1334,10 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW OutTraceDW("SetDIBitsToDevice: fixed dest=(%d,%d)-(%dx%d)\n", XDest, YDest, dwWidth, dwHeight); HDC hTempDc; HBITMAP hbmPic; + + if(dxw.HandleFPS()) return DD_OK; + if(dxw.dwFlags5 & NOBLT) return DD_OK; + if(!(hTempDc=CreateCompatibleDC(hdc))) OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); // tricky part: CreateCompatibleBitmap is needed to set the dc size, but it has to be performed @@ -1338,6 +1353,9 @@ int WINAPI extSetDIBitsToDevice(HDC hdc, int XDest, int YDest, DWORD dwWidth, DW SetStretchBltMode(hdc,HALFTONE); if(!(ret=(*pGDIStretchBlt)(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY))) OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + + dxw.ShowOverlay(hdc); + if(!(DeleteObject(hbmPic))) // v2.02.32 - avoid resource leakage OutTraceE("DeleteObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); if(!(DeleteDC(hTempDc))) diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 96909f3..abd4bf0 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -82,6 +82,7 @@ void HookKernel32Init() HookLibInit(LimitHooks); HookLibInit(TimeHooks); HookLibInit(VersionHooks); + HookLibInit(SuppressChildHooks); } FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) diff --git a/dll/user32.cpp b/dll/user32.cpp index e2c3982..047091a 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -54,8 +54,9 @@ static HookEntry_Type Hooks[]={ {HOOK_HOT_CANDIDATE, "SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW}, {HOOK_HOT_CANDIDATE, "GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW}, - //{HOOK_IAT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, - //{HOOK_IAT_CANDIDATE, "GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, + //{HOOK_HOT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, + //{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, + {HOOK_IAT_CANDIDATE, "IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible}, {HOOK_IAT_CANDIDATE, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA}, {HOOK_IAT_CANDIDATE, "SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW}, @@ -825,6 +826,7 @@ BOOL WINAPI extGetCursorPos(LPPOINT lppoint) *lppoint=dxw.ScreenToClient(*lppoint); *lppoint=dxw.FixCursorPos(*lppoint); +#if 0 if(dxw.dwFlags4 & FRAMECOMPENSATION){ static int dx, dy, todo=TRUE; if (todo){ @@ -837,6 +839,7 @@ BOOL WINAPI extGetCursorPos(LPPOINT lppoint) lppoint->x += dx; lppoint->y += dy; } +#endif GetHookInfo()->CursorX=(short)lppoint->x; GetHookInfo()->CursorY=(short)lppoint->y; @@ -909,12 +912,74 @@ BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsg { BOOL res; - res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, (wRemoveMsg & 0x000F)); +#if 0 + UINT bRemoveMsg = (wRemoveMsg & 0x000F); + UINT message; + + do{ + res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, bRemoveMsg); + if(!res) break; // no message available + + OutTraceW("PeekMessage: GOT lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n", + lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), + lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), + lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); + + message = lpMsg->message; + if(res &&(dxw.dwFlags3 & FILTERMESSAGES)){ // filter offending messages + switch(message){ + case WM_NCMOUSEMOVE: + case WM_NCLBUTTONDOWN: + case WM_NCLBUTTONUP: + case WM_NCLBUTTONDBLCLK: + case WM_NCRBUTTONDOWN: + case WM_NCRBUTTONUP: + case WM_NCRBUTTONDBLCLK: + case WM_NCMBUTTONDOWN: + case WM_NCMBUTTONUP: + case WM_NCMBUTTONDBLCLK: + OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), lpMsg->wParam, lpMsg->lParam); + if(!bRemoveMsg) (*pPeekMessage)(lpMsg, hwnd, message, message, TRUE); + continue; + } + } + if((wMsgFilterMin==0) && (wMsgFilterMax == 0)) break; // no filtering, everything is good + if((message < wMsgFilterMin) || (message > wMsgFilterMax)){ + OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), lpMsg->wParam, lpMsg->lParam); + if(!bRemoveMsg) (*pPeekMessage)(lpMsg, hwnd, message, message, TRUE); + continue; // skip this one .... + } + } while(FALSE); +#endif + + if((wMsgFilterMin==0) && (wMsgFilterMax == 0)){ + // no filtering, everything is good + res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); + } + else { + MSG Dummy; + // better eliminate all messages before and after the selected range !!!! + //if(wMsgFilterMin)(*pPeekMessage)(&Dummy, hwnd, 0, wMsgFilterMin-1, TRUE); + if(wMsgFilterMin>0x0F)(*pPeekMessage)(&Dummy, hwnd, 0x0F, wMsgFilterMin-1, TRUE); + res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); + if(wMsgFilterMaxhwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), + lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), + lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); + else + OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) res=%x\n", + lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), res); - OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n", - lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), - lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), - lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); return res; } @@ -1101,6 +1166,17 @@ int WINAPI extGetSystemMetrics(int nindex) res=(*pGetSystemMetrics)(nindex); OutTraceDW("GetSystemMetrics: index=%x(%s), res=%d\n", nindex, ExplainsSystemMetrics(nindex), res); + if(!dxw.Windowize){ + // v2.02.95: if not in window mode, just implement the HIDEMULTIMONITOR flag + if( (nindex ==SM_CMONITORS) && + (dxw.dwFlags2 & HIDEMULTIMONITOR) && + res>1) { + res=1; + OutTraceDW("GetSystemMetrics: fix SM_CMONITORS=%d\n", res); + } + return res; + } + // if you have a bypassed setting, use it first! if(pSetDevMode){ switch(nindex){ @@ -2556,18 +2632,18 @@ HWND WINAPI extGetActiveWindow(void) { HWND ret; ret=(*pGetActiveWindow)(); - OutTraceDW("GetActiveWindow: ret=%x\n", ret); - STOPPER("GetActiveWindow"); - return ret; + OutTraceDW("GetActiveWindow: ret=%x->%x\n", ret, dxw.GethWnd()); + //STOPPER("GetActiveWindow"); + return dxw.GethWnd(); } HWND WINAPI extGetForegroundWindow(void) { HWND ret; ret=(*pGetForegroundWindow)(); - OutTraceDW("GetForegroundWindow: ret=%x\n", ret); - STOPPER("GetForegroundWindow"); - return ret; + OutTraceDW("GetForegroundWindow: ret=%x->%x\n", ret, dxw.GethWnd()); + //STOPPER("GetForegroundWindow"); + return dxw.GethWnd(); } BOOL WINAPI extIsWindowVisible(HWND hwnd) diff --git a/dll/winmm.cpp b/dll/winmm.cpp index 8783e4e..ab634f6 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -121,7 +121,8 @@ MCIERROR WINAPI extmciSendCommand(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdw } ret=(*pmciSendCommand)(IDDevice, uMsg, fdwCommand, dwParam); + if(dxw.IsFullScreen() && uMsg==MCI_PUT) pr->rc=saverect; - if (ret) OutTraceE("mciSendCommand: ERROR res=%x\n", ret); + if (ret) OutTraceE("mciSendCommand: ERROR res=%d\n", ret); return ret; } diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 90117f8..a16d2df 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/locale/cn/RCa05260 b/locale/cn/RCa05260 deleted file mode 100644 index 7237482..0000000 Binary files a/locale/cn/RCa05260 and /dev/null differ diff --git a/locale/cn/Release/BuildLog.htm b/locale/cn/Release/BuildLog.htm deleted file mode 100644 index 9015c89..0000000 Binary files a/locale/cn/Release/BuildLog.htm and /dev/null differ diff --git a/locale/cn/Release/Resources_CN.dll.intermediate.manifest b/locale/cn/Release/Resources_CN.dll.intermediate.manifest deleted file mode 100644 index ecea6f7..0000000 --- a/locale/cn/Release/Resources_CN.dll.intermediate.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/locale/cn/Release/Resources_CN.res b/locale/cn/Release/Resources_CN.res deleted file mode 100644 index ee878cd..0000000 Binary files a/locale/cn/Release/Resources_CN.res and /dev/null differ diff --git a/locale/cn/Release/mt.dep b/locale/cn/Release/mt.dep deleted file mode 100644 index 3626050..0000000 --- a/locale/cn/Release/mt.dep +++ /dev/null @@ -1 +0,0 @@ -Manifest resource last updated at 23:39:40.80 on 05/10/2014 diff --git a/locale/cn/Resources_CN.vcproj.User-PC.User.user b/locale/cn/Resources_CN.vcproj.User-PC.User.user deleted file mode 100644 index facf31e..0000000 --- a/locale/cn/Resources_CN.vcproj.User-PC.User.user +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - diff --git a/locale/cn/Resources_Cn.ncb b/locale/cn/Resources_Cn.ncb index a8d0402..2b80c0b 100644 Binary files a/locale/cn/Resources_Cn.ncb and b/locale/cn/Resources_Cn.ncb differ diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc index d1c1b76..38041e9 100644 Binary files a/locale/cn/Resources_Cn.rc and b/locale/cn/Resources_Cn.rc differ diff --git a/locale/cn/Resources_Cn.suo b/locale/cn/Resources_Cn.suo index d434b50..91008cb 100644 Binary files a/locale/cn/Resources_Cn.suo and b/locale/cn/Resources_Cn.suo differ diff --git a/locale/cn/Resources_EN.rc b/locale/cn/Resources_EN.rc deleted file mode 100644 index c10d79b..0000000 Binary files a/locale/cn/Resources_EN.rc and /dev/null differ