diff --git a/Include/dxwnd.h b/Include/dxwnd.h index bce14e7..54e7063 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -365,6 +365,7 @@ int GetHookStatus(DXWNDSTATUS *); DXWNDSTATUS *GetHookInfo(); void HookInit(TARGETMAP *, HWND); void ShowHint(int); +LPCSTR GetFlagCaption(int, int); char *GetDxWndPath(); void *SetHook(void *, void *); diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 52954a9..92f262f 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fc4cf8ef5a8514260d213b7d89caebe950a9dcfc43e948b25bb835c57e2df28 -size 782848 +oid sha256:f56c6024dad175adc0c6a62555e71669b86c0f56e010de59375d88049230b5e3 +size 785920 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 96e20d7..47ac055 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0478367b7c87124f807b20c7a3f5e3c6337815e9f8d63619ae023702f0efd817 -size 673792 +oid sha256:0229b0055c3941f91b315ef934a7e335fdfc62799b6ef489883c3beecace2971 +size 675840 diff --git a/build/exports/Daytona USA Deluxe Edition.dxw b/build/exports/Daytona USA Deluxe Edition.dxw new file mode 100644 index 0000000..d236dfd --- /dev/null +++ b/build/exports/Daytona USA Deluxe Edition.dxw @@ -0,0 +1,36 @@ +[target] +title0=Daytona USA Deluxe Edition +path0=D:\Games\Daytona USA Deluxe Edition\DAYTONA USA Deluxe.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Need for Speed Underground 2.dxw b/build/exports/Need for Speed Underground 2.dxw new file mode 100644 index 0000000..8028d0b --- /dev/null +++ b/build/exports/Need for Speed Underground 2.dxw @@ -0,0 +1,36 @@ +[target] +title0=Need for Speed Underground 2 +path0=D:\Games\Need for Speed Underground 2\SPEED2.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=1081344 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index bec78ce..bafc6df 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,41 +1,5 @@ [window] -posx=1165 -posy=618 +posx=0 +posy=472 sizx=320 sizy=200 -[target] -title0=administrator -path0=administrator -startfolder0= -launchpath0= -module0= -opengllib0= -notes0= -registry0= -ver0=0 -monitorid0=-1 -coord0=0 -flag0=673185826 -flagg0=1207959552 -flagh0=20 -flagi0=134217732 -flagj0=4224 -flagk0=65536 -flagl0=0 -flagm0=0 -tflag0=0 -dflag0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=0 -swapeffect0=0 -maxddinterface0=7 -slowratio0=2 -scanline0=0 -initresw0=800 -initresh0=600 diff --git a/build/exports/dxwnd.log b/build/exports/dxwnd.log index 0f66b21..9273cd6 100644 --- a/build/exports/dxwnd.log +++ b/build/exports/dxwnd.log @@ -1,2 +1,5 @@ -OnRun idx=28 prog="D:\Games\ManTT\MANXTT.EXE" unhooked=0 +OnRun idx=36 prog="D:\Games\International Football 2000\MSIF2000.ICD" unhooked=0 +setwindowshook mode +OnRun idx=36 prog="D:\Games\International Football 2000\MSIF2000.ICD" unhooked=0 +self elevation setwindowshook mode diff --git a/build/exports/dxwnd.reg b/build/exports/dxwnd.reg deleted file mode 100644 index ee2d7f7..0000000 --- a/build/exports/dxwnd.reg +++ /dev/null @@ -1,52 +0,0 @@ - -[HKEY_LOCAL_MACHINE\SOFTWARE] - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape] - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB] -;"Options"="3,1,1,2,1,1,0,0" // High Quality, digital audio off -"Options"="3,1,1,2,1,1,1,1" // High Quality, digital audio on - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallDir] -@="\{path}" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\InstallOption] -@="Maximum" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\Language] -@="ENG" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\LocalDir] -@="\{path}\\FILE" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\RemoteDir] -@="\{path}\\REMOTE" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\SaveDir] -@="\{path}\\TEMP" - -[HKEY_LOCAL_MACHINE\SOFTWARE\Mindscape\WarHammerFB\UpdateDir] -@="C:\\GAMES\\WARFB\\Update" - -[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SharedDLLs] -"C:\\WINDOWS\\SYSTEM32\\WING.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\WING32.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\WINGDE.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\WINGDIB.DRV"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\WINGPAL.WND"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RLDDF.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RLDDI.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTF.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFTI.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG16M.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG256.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRG64K.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM16M.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM256.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLFRM64K.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG16M.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG256.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRG64K.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM16M.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM256.DLL"=hex:01,00,00,00 -"C:\\WINDOWS\\SYSTEM32\\RL\\SOFT\\RLIRM64K.DLL"=hex:01,00,00,00 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 4b9799f..5126e9b 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1494,3 +1494,14 @@ fix: version hooking for IDIrectDraw methods called by IDIrectDrawSurface method fix: capability registration passed in IDIrectDrawSurface::QueryInterface() calls: fixes settings for ZBUFFER surfaces fix: capsdb logging (developer's use only) fix: handling of WM_NCCALCSIZE & WM_NCPAINT messages in winproc hooker to align behaviour to comment. To be tested ... + +v2.04.10 +GUI: +add: view flags window (expert mode only) +DLL: +fix: prevent InvalidateRect on desktop, eliminates some flickering +fix: ZBUFFER capability management - fixes "Galapagos" in HW mode (but it may crash because of the intro movie...) +fix: logging of log flags +fix: D3D8/9 QueryInterface fully revisited +add: (very) preliminary texture transparency hack + diff --git a/dll/d3dtexture.cpp b/dll/d3dtexture.cpp index 7c7d0d6..08540cf 100644 --- a/dll/d3dtexture.cpp +++ b/dll/d3dtexture.cpp @@ -929,6 +929,69 @@ void D3DTextureHack(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) } } +void D3DTextureTransp(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) +{ + switch (Desc.Format){ + case D3DFMT_X8R8G8B8: + case D3DFMT_A8R8G8B8: + { + DWORD *p; + for(UINT y=0; y> 2); + for(UINT x=0; x> 1); + for(UINT x=0; xddpfPixelFormat.dwFourCC = 0; lpddsd->ddpfPixelFormat.dwFlags &= ~DDPF_FOURCC; } + + //// try + //if((lpddsd->dwFlags & DDSD_PIXELFORMAT) && (lpddsd->ddpfPixelFormat.dwRGBBitCount == 16)){ + // lpddsd->ddpfPixelFormat.dwRGBAlphaBitMask = 0x8000; + // lpddsd->ddpfPixelFormat.dwBBitMask = 0x001F; + // lpddsd->ddpfPixelFormat.dwGBitMask = 0x03E0; + // lpddsd->ddpfPixelFormat.dwRBitMask = 0x7C00; + //} + //// try return; } @@ -2335,8 +2378,6 @@ void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) return; } - - // 3DDEVICE no TEXTURE: enforce PIXELFORMAT // v2.02.90: added for "Zoo Tycoon" textures // v2.03.48 - there are two situations @@ -4550,7 +4591,7 @@ static HRESULT WINAPI extAddAttachedSurface(AddAttachedSurface_Type pAddAttached } //else if (IsBack) { else { - // v2.02.13: emulate ZBUFFER attach to backbuffer: do nothing and return OK + // v2.02.13: emulate ZBUFFER attach to backbuffer/plain surface: do nothing and return OK // this trick makes at least "Nocturne" work also in emulated mode when hardware acceleration // is set in the game "Options" menu. if (sd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) // DDSCAPS_BACKBUFFER for double buffering ??? @@ -4561,6 +4602,40 @@ static HRESULT WINAPI extAddAttachedSurface(AddAttachedSurface_Type pAddAttached } } } + else { + // AddAttachedSurface successful, manage CAPS propagation + if ((dxw.dwFlags1 & EMULATESURFACE) && (IsPrim || IsBack)){ + } + HRESULT sdres; + DDSURFACEDESC2 sd; + sd.dwSize=Set_dwSize_From_Surface(); + sdres=lpddsadd->GetSurfaceDesc((DDSURFACEDESC *)&sd); + if (sdres) + OutTraceE("AddAttachedSurface: GetSurfaceDesc ERROR res=%x at %d\n", sdres, __LINE__); + else + OutTraceDW("AddAttachedSurface: GetSurfaceDesc dwCaps=%x(%s)\n", + sd.ddsCaps.dwCaps, ExplainDDSCaps(sd.ddsCaps.dwCaps)); + if (IsPrim){ + if (sd.ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) + OutTraceDW("AddAttachedSurface: registering BACKBUFFER attach on PRIMARY\n"); + dxwss.PushBackBufferSurface(lpddsadd, 1); + } + //else if (IsBack) or plain surface for ZBUFFER { + else { + // v2.02.13: emulate ZBUFFER attach to backbuffer/plain surface + if ((sd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) && (dxw.dwFlags1 & EMULATESURFACE)){ + DWORD dwCaps; + OutTraceDW("AddAttachedSurface: registering ZBUFFER attach on %s surface\n", IsBack ? "BACKBUFFER" : "PLAIN"); + dwCaps = dxwcdb.GetCaps(lpdds); + if(dwCaps){ + dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_BACKBUFFER|DDSCAPS_3DDEVICE|DDSCAPS_COMPLEX); + dwCaps |= DDSCAPS_ZBUFFER; + //if(dwCaps & DDSCAPS_VIDEOMEMORY) dwCaps|=DDSCAPS_LOCALVIDMEM; + dxwcdb.PushCaps(lpddsadd, dwCaps); + } + } + } + } if (res) OutTraceE("AddAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); return res; } @@ -4644,33 +4719,18 @@ static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDI while(TRUE){ // fake loop if (IsPrim) { IsFixed=TRUE; - caps->dwCaps |= DDSD_Prim.ddsCaps.dwCaps; - caps->dwCaps |= DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE; // primary surfaces must be this way - caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - if(caps->dwCaps & DDSCAPS_3DDEVICE) caps->dwCaps |= DDSCAPS_LOCALVIDMEM; + caps->dwCaps = SetPrimaryCaps(caps->dwCaps); + break; } - if (IsBack) { IsFixed=TRUE; - // v2.03.11: added DDSCAPS_FLIP capability to backbuffer surface: "Ignition" checks for it before Flip-ping to primary - caps->dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP|DDSCAPS_LOCALVIDMEM); // you never know.... - caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way - if(caps->dwCaps & DDSCAPS_3DDEVICE) caps->dwCaps |= DDSCAPS_LOCALVIDMEM; - //if(caps->dwCaps & DDSCAPS_3DDEVICE) caps->dwCaps |= (DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX); + caps->dwCaps = SetBackBufferCaps(caps->dwCaps); + break; } - - // v2.03.82: fixed logic for ZBUFFER capabilities: "The Creed" may have two, in SYSTEMMEMORY or in VIDEOMEMORY ... - // v2.03.90: "Galapagos" fix - if there's a DDSCAPS_SYSTEMMEMORY or DDSCAPS_VIDEOMEMORY spec, let it be. - // v2.03.97: "Galapagos" fix erased. if (IsZBuf) { - DWORD dwCaps = dxwcdb.GetCaps(lpdds); - // beware! the ZBUFFER surface could have never been registered! - // in this case better keep the original capabilities (or adapt to the primary/backbuffer ones?) - if(dwCaps) { - IsFixed=TRUE; - sLabel="(REG.ZBUFFER)"; - caps->dwCaps = dwCaps; - } + IsFixed=TRUE; + caps->dwCaps = SetZBufferCaps(dxwcdb.GetCaps(lpdds)); + break; } break; // inconditional break; } @@ -4738,36 +4798,22 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS if (IsPrim) { IsFixed=TRUE; if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; - lpddsd->ddsCaps.dwCaps |= DDSD_Prim.ddsCaps.dwCaps; - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE); // primary surfaces must be this way - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) lpddsd->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; + lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(lpddsd->ddsCaps.dwCaps); lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount; lpddsd->dwHeight=dxw.GetScreenHeight(); lpddsd->dwWidth=dxw.GetScreenWidth(); break; } - if (IsBack) { IsFixed=TRUE; - // flags that backbuffer surfaces must have set - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP|DDSCAPS_LOCALVIDMEM);; - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) lpddsd->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; + lpddsd->ddsCaps.dwCaps = SetBackBufferCaps(lpddsd->ddsCaps.dwCaps); break; } - - // v2.03.82: fixed logic for ZBUFFER capabilities: "The Creed" may have two, in SYSTEMMEMORY or in VIDEOMEMORY ... - if(IsZBuf) { - DWORD dwCaps = dxwcdb.GetCaps(lpdds); - if(dwCaps) { - IsFixed=TRUE; - sLabel="(REG.ZBUFFER)"; - lpddsd->ddsCaps.dwCaps = dwCaps; - } + if (IsZBuf) { + IsFixed=TRUE; + lpddsd->ddsCaps.dwCaps = SetZBufferCaps(dxwcdb.GetCaps(lpdds)); break; } - break; // inconditional break } diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index c0c5d70..338edd9 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -503,6 +503,55 @@ static void TextureHack(LPDIRECTDRAWSURFACE s, int dxversion) if (res) OutTraceE("TextureHack: Unlock ERROR lpdds=%x res=%x(%s) at %d\n", s, res, ExplainDDError(res), __LINE__); } +void TextureTransp(LPDIRECTDRAWSURFACE s, int dxversion) +{ + DDSURFACEDESC2 ddsd; + int x, y, w, h; + HRESULT res; + + OutTraceB("TextureTransp(%d): lpdds=%x\n", dxversion, s); + + memset(&ddsd,0,sizeof(DDSURFACEDESC2)); + ddsd.dwSize = Set_dwSize_From_Surface(); + ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; +// if(res=(*pLockMethod(lpddsHookedVersion()))(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + if(res=(*pLockMethod(dxversion))(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + OutTraceE("TextureTransp(%d): Lock ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); + return; + } + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) { + OutTrace("TextureTransp(%d): lpdds=%x BitCount=%d size=(%dx%d)\n", + dxversion, s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); + w = ddsd.dwWidth; + h = ddsd.dwHeight; + switch (ddsd.ddpfPixelFormat.dwRGBBitCount){ + case 8: + // no way + break; + case 16: + { + WORD *p; + for(y=0; y> 1); + for(x=0; x> 2); + for(x=0; x>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag2Names[i]); - for(i=0, dword=dxw.dwFlags3; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag3Names[i]); - for(i=0, dword=dxw.dwFlags4; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag4Names[i]); - for(i=0, dword=dxw.dwFlags5; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag5Names[i]); - for(i=0, dword=dxw.dwFlags6; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag6Names[i]); - for(i=0, dword=dxw.dwFlags7; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag7Names[i]); - for(i=0, dword=dxw.dwFlags8; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag8Names[i]); - for(i=0, dword=dxw.dwTFlags; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", TFlagNames[i]); + for(i=0, dword=dxw.dwFlags1; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(0,i)); + for(i=0, dword=dxw.dwFlags2; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(1,i)); + for(i=0, dword=dxw.dwFlags3; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(2,i)); + for(i=0, dword=dxw.dwFlags4; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(3,i)); + for(i=0, dword=dxw.dwFlags5; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(4,i)); + for(i=0, dword=dxw.dwFlags6; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(5,i)); + for(i=0, dword=dxw.dwFlags7; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(6,i)); + for(i=0, dword=dxw.dwFlags8; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(7,i)); + for(i=0, dword=tflags ; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(8,i)); fprintf(fp, "***\n"); } @@ -259,7 +160,7 @@ void OutTrace(const char *format, ...) if (fp==NULL) return; // last chance: do not log... else - OutTraceHeader(fp); + OutTraceHeader(fp, tFlags); } va_start(al, format); //vfprintf(fp, format, al); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index fb4c6c0..7e5b5c0 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -462,6 +462,11 @@ void dxwCore::SetClipCursor() Rect.right+=UpLeftCorner.x; Rect.top+=UpLeftCorner.y; Rect.bottom+=UpLeftCorner.y; + +// if(0) { +// if(GetMenu(hWnd)) Rect.top -= (*pGetSystemMetrics)(SM_CYMENU); +// } + (*pClipCursor)(NULL); if(!(*pClipCursor)(&Rect)) OutTraceE("SetClipCursor: ERROR err=%d at %d\n", GetLastError(), __LINE__); diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index f1007eb..07f36f0 100644 Binary files a/dll/dxwnd.aps and b/dll/dxwnd.aps differ diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 932100f..266f3a0 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.09.fx1" +#define VERSION "2.04.10" #define DDTHREADLOCK 1 @@ -279,4 +279,105 @@ void InjectHook() } } } +} + +static char *FlagNames[9][32] ={{ + // Flags1 + "UNNOTIFY", "EMULATESURFACE", "CLIPCURSOR", "NEEDADMINCAPS", + "HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD", + "EMULATEBUFFER", "HOOKDI8", "BLITFROMBACKBUFFER", "SUPPRESSCLIPPING", + "AUTOREFRESH", "FIXWINFRAME", "HIDEHWCURSOR", "SLOWDOWN", + "DISABLECLIPPING", "LOCKWINSTYLE", "MAPGDITOPRIMARY", "FIXTEXTOUT", + "KEEPCURSORWITHIN", "USERGB565", "SUPPRESSDXERRORS", "PREVENTMAXIMIZE", + "LOCKEDSURFACE", "FIXPARENTWIN", "SWITCHVIDEOMEMORY", "CLIENTREMAPPING", + "HANDLEALTF4", "LOCKWINPOS", "HOOKCHILDWIN", "MESSAGEPROC" + },{ + // Flags2 + "RECOVERSCREENMODE", "REFRESHONRESIZE", "BACKBUFATTACH", "MODALSTYLE", + "KEEPASPECTRATIO", "INIT8BPP", "FORCEWINRESIZE", "INIT16BPP", + "KEEPCURSORFIXED", "DISABLEGAMMARAMP", "INDEPENDENTREFRESH", "FIXNCHITTEST", + "LIMITFPS", "SKIPFPS", "SHOWFPS", "HIDEMULTIMONITOR", + "TIMESTRETCH", "HOOKOPENGL", "LOCKEDSIZE", "SHOWHWCURSOR", + "GDISTRETCHED", "SHOWFPSOVERLAY", "FAKEVERSION", "FULLRECTBLT", + "NOPALETTEUPDATE", "SUPPRESSIME", "NOBANNER", "WINDOWIZE", + "LIMITRESOURCES", "STARTDEBUG", "SETCOMPATIBILITY", "WIREFRAME", + },{ + // Flags3 + "FORCEHOOKOPENGL", "MARKBLIT", "HOOKDLLS", "SUPPRESSD3DEXT", + "HOOKENABLED", "FIXD3DFRAME", "FORCE16BPP", "BLACKWHITE", + "MARKLOCK", "SINGLEPROCAFFINITY", "EMULATEREGISTRY", "CDROMDRIVETYPE", + "NOWINDOWMOVE", "FORCECLIPPER", "LOCKSYSCOLORS", "GDIEMULATEDC", + "FULLSCREENONLY", "FONTBYPASS", "MINIMALCAPS", "DEFAULTMESSAGES", + "BUFFEREDIOFIX", "FILTERMESSAGES", "PEEKALLMESSAGES", "SURFACEWARN", + "ANALYTICMODE", "FORCESHEL", "CAPMASK", "COLORFIX", + "NODDRAWBLT", "NODDRAWFLIP", "NOGDIBLT", "NOPIXELFORMAT", + },{ + // Flags4 + "NOALPHACHANNEL", "SUPPRESSCHILD", "FIXREFCOUNTER", "SHOWTIMESTRETCH", + "ZBUFFERCLEAN", "ZBUFFER0CLEAN", "ZBUFFERALWAYS", "DISABLEFOGGING", + "NOPOWER2FIX", "NOPERFCOUNTER", "BILINEAR2XFILTER", "INTERCEPTRDTSC", + "LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP", + "STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF", + "FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV", + "RELEASEMOUSE", "ENABLETIMEFREEZE", "HOTPATCH", "ENABLEHOTKEYS", + "HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "HIDECDROMEMPTY", + },{ + // Flags5 + "DIABLOTWEAK", "CLEARTARGET", "NOWINPOSCHANGES", "ANSIWIDE", + "NOBLT", "USELASTCORE", "DOFASTBLT", "AEROBOOST", + "QUARTERBLT", "NOIMAGEHLP", "BILINEARFILTER", "REPLACEPRIVOPS", + "REMAPMCI", "TEXTUREHIGHLIGHT", "TEXTUREDUMP", "TEXTUREHACK", + "TEXTURETRANSP", "NORMALIZEPERFCOUNT", "HYBRIDMODE", "GDICOLORCONV", + "INJECTSON", "ENABLESONHOOK", "FREEZEINJECTEDSON", "GDIMODE", + "CENTERTOWIN", "STRESSRESOURCES", "MESSAGEPUMP", "TEXTUREFORMAT", + "DEINTERLACE", "LOCKRESERVEDPALETTE", "UNLOCKZORDER", "EASPORTSHACK", + },{ + // Flags6 + "FORCESWAPEFFECT", "LEGACYALLOC", "NODESTROYWINDOW", "NOMOVIES", + "SUPPRESSRELEASE", "FIXMOVIESCOLOR", "WOW64REGISTRY", "DISABLEMAXWINMODE", + "FIXPITCH", "POWER2WIDTH", "HIDETASKBAR", "ACTIVATEAPP", + "NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "CONFIRMONCLOSE", "TERMINATEONCLOSE", + "FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "WOW32REGISTRY", + "STRETCHMOVIES", "BYPASSMCI", "FIXPIXELZOOM", "---REUSEEMULATEDDC---", + "CREATEDESKTOP", "NOWINDOWHOOKS", "SYNCPALETTE", "VIRTUALJOYSTICK", + "UNACQUIRE", "HOOKGOGLIBS", "BYPASSGOGLIBS", "EMULATERELMOUSE", + },{ + // Flags7 + "LIMITDDRAW", "DISABLEDISABLEALTTAB", "FIXCLIPPERAREA", "HOOKDIRECTSOUND", + "HOOKSMACKW32", "BLOCKPRIORITYCLASS", "CPUSLOWDOWN", "CPUMAXUSAGE", + "NOWINERRORS", "SUPPRESSOVERLAY", "INIT24BPP", "INIT32BPP", + "FIXGLOBALUNLOCK", "SHOWHINTS", "SKIPDEVTYPEHID", "INJECTSUSPENDED", + "SSUPPRESSDIERRORS", "HOOKNORUN", "FIXBINDTEXTURE", "ENUM16BITMODES", + "SHAREDKEYBOARD", "HOOKNOUPDATE", "HOOKGLUT32", "INITIALRES", + "MAXIMUMRES", "LOCKCOLORDEPTH", "FIXSMACKLOOP", "FIXFREELIBRARY", + "ANCHORED", "CLEARTEXTUREFOURCC", "NODDEXCLUSIVEMODE", "COPYNOSHIMS", + },{ + // Flags8 + "FORCEWAIT", "FORCENOWAIT", "FORCEVSYNC", "FORCENOVSYNC", + "VSYNCSCANLINES", "TRIMTEXTUREFORMATS", "NOHALDEVICE", "CLIPLOCK", + "PRETENDVISIBLE", "RAWFORMAT", "WININSULATION", "FIXMOUSEHOOK", + "DDSFORMAT", "HOOKWING32", "SEQUENCEDIAT", "D3D8BACK16", + "MARKWING32", "DYNAMICZCLEAN", "MARKGDI32", "DUMPDIBSECTION", + "DUMPDEVCONTEXT", "QUALITYFONTS", "ALLOWSYSMEMON3DDEV", "", + "", "", "", "", + "", "", "", "", + },{ + // TFlags + "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", + "OUTSEPARATED", "**", "ASSERTDIALOG", "OUTIMPORTTABLE", + "OUTDEBUG", "OUTREGISTRY", "TRACEHOOKS", "OUTD3DTRACE", + "OUTDXWINTRACE", "OUTWINGTRACE", "OUTOGLTRACE", "", + "", "", "", "", + "", "", "", "", + "", "", "", "ADDRELATIVETIME", + "**", "ADDTIMESTAMP", "OUTDEBUGSTRING", "ERASELOGFILE", + }}; + +LPCSTR GetFlagCaption(int flag, int bit) +{ + //if((flag<0) || (flag>(9*32))) return ""; + //return FlagNames[flag >> 5][flag & 0x1F]; + if((flag<0) || (flag>8)) return ""; + if((bit<0) || (bit>31)) return ""; + return FlagNames[flag][bit]; } \ No newline at end of file diff --git a/dll/dxwnd.def b/dll/dxwnd.def index a4d06bb..7818ba0 100644 --- a/dll/dxwnd.def +++ b/dll/dxwnd.def @@ -8,3 +8,4 @@ EXPORTS GetHookInfo @6 Inject @7 GetThreadStartAddress @8 + GetFlagCaption @9 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index fee1db8..549918d 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 0003bba..1c10b9a 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -17,6 +17,7 @@ #define HOOKD3D10ANDLATER 1 #define TRACEALLMETHODS 1 +//#define DXWNDDISABLEDHOOKS 1 extern void D3D9TextureHandling(void *, int); extern void D3D8TextureHandling(void *, int); @@ -316,7 +317,6 @@ static HookEntryEx_Type d3d8Hooks[]={ {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; - static HookEntryEx_Type d3d9Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "Direct3DCreate9", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9, (FARPROC)extDirect3DCreate9}, {HOOK_HOT_CANDIDATE, 0, "Direct3DCreate9Ex", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9Ex, (FARPROC)extDirect3DCreate9Ex}, @@ -496,7 +496,7 @@ void HookD3DDevice8(void** ppD3Ddev8) SetHook((void *)(**(DWORD **)ppD3Ddev8 + 120), extGetFrontBuffer, (void **)&pGetFrontBuffer, "GetFrontBuffer(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 136), extBeginScene8, (void **)&pBeginScene8, "BeginScene(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 140), extEndScene8, (void **)&pEndScene8, "EndScene(D8)"); - if((dxw.dwFlags2 & WIREFRAME) || (dxw.dwFlags4 & DISABLEFOGGING) || (dxw.dwFlags4 & ZBUFFERALWAYS)){ + if((dxw.dwFlags2 & WIREFRAME) || (dxw.dwFlags4 & DISABLEFOGGING) || (dxw.dwFlags4 & ZBUFFERALWAYS) || (dxw.dwFlags5 & TEXTURETRANSP)){ SetHook((void *)(**(DWORD **)ppD3Ddev8 + 200), extSetRenderState8, (void **)&pSetRenderState8, "SetRenderState(D8)"); SetHook((void *)(**(DWORD **)ppD3Ddev8 + 204), extGetRenderState8, (void **)&pGetRenderState8, "GetRenderState(D8)"); if(dxw.dwFlags2 & WIREFRAME) (*pSetRenderState8)((void *)*ppD3Ddev8, D3DRS_FILLMODE, D3DFILL_WIREFRAME); @@ -544,7 +544,7 @@ void HookD3DDevice9(void** ppD3Ddev9) SetHook((void *)(**(DWORD **)ppD3Ddev9 + 168), extEndScene9, (void **)&pEndScene9, "EndScene(D9)"); //SetHook((void *)(**(DWORD **)ppD3Ddev9 +188), extSetViewport, (void **)&pSetViewport, "SetViewport(D9)"); //SetHook((void *)(**(DWORD **)ppD3Ddev9 +192), extGetViewport, (void **)&pGetViewport, "GetViewport(D9)"); - if((dxw.dwFlags2 & WIREFRAME) || (dxw.dwFlags4 & DISABLEFOGGING) || (dxw.dwFlags4 & ZBUFFERALWAYS)){ + if((dxw.dwFlags2 & WIREFRAME) || (dxw.dwFlags4 & DISABLEFOGGING) || (dxw.dwFlags4 & ZBUFFERALWAYS) || (dxw.dwFlags5 & TEXTURETRANSP)){ SetHook((void *)(**(DWORD **)ppD3Ddev9 + 228), extSetRenderState9, (void **)&pSetRenderState9, "SetRenderState(D9)"); SetHook((void *)(**(DWORD **)ppD3Ddev9 + 232), extGetRenderState9, (void **)&pGetRenderState9, "GetRenderState(D9)"); if(dxw.dwFlags2 & WIREFRAME) (*pSetRenderState9)((void *)*ppD3Ddev9, D3DRS_FILLMODE, D3DFILL_WIREFRAME); @@ -588,6 +588,131 @@ void HookDirect3D8(void *lpd3d) SetHook((void *)(*(DWORD *)lpd3d + 60), extCreateDevice8, (void **)&pCreateDevice8, "CreateDevice(D8)"); } +void HookDirect3D9(void *lpd3d, BOOL ex) +{ + SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D9, (void **)&pQueryInterfaceD3D9, "QueryInterface(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount9, (void **)&pGetAdapterCount9, "GetAdapterCount(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier9, (void **)&pGetAdapterIdentifier9, "GetAdapterIdentifier(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 24), extGetAdapterModeCount9, (void **)&pGetAdapterModeCount9, "GetAdapterGetAdapterModeCount(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes9, (void **)&pEnumAdapterModes9, "EnumAdapterModes(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode9, (void **)&pGetAdapterDisplayMode9, "GetAdapterDisplayMode(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 36), extCheckDeviceType9, (void **)&pCheckDeviceType9, "CheckDeviceType(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 56), extD3DGetDeviceCaps9, (void **)&pD3DGetDeviceCaps9, "GetDeviceCaps(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 60), extGetAdapterMonitor9, (void **)&pGetAdapterMonitor9, "GetAdapterMonitor(D9)"); + SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice9, (void **)&pCreateDevice9, "CreateDevice(D9)"); + if(ex) SetHook((void *)(*(DWORD *)lpd3d + 80), extCreateDeviceEx, (void **)&pCreateDeviceEx, "CreateDeviceEx(D9)"); +} + +typedef enum { + TYPE_OBJECT_UNKNOWN = 0, + TYPE_OBJECT_DIRECT3D, + TYPE_OBJECT_DIRECT3DDEVICE, + TYPE_OBJECT_GAMMARAMP, + TYPE_OBJECT_BASETEXTURE, + TYPE_OBJECT_TEXTURE, + TYPE_OBJECT_3DSURFACE, + TYPE_OBJECT_VIEWPORT }; + +static HRESULT WINAPI QueryInterfaceD3D(int d3dversion, QueryInterface_Type pQueryInterfaceD3D, void *obj, REFIID riid, void** ppvObj) +{ + HRESULT res; + int iObjectType; + int iObjectVersion; + BOOL bEx = FALSE; + + iObjectVersion = 0; + iObjectType = TYPE_OBJECT_UNKNOWN; + + OutTraceD3D("D3D::QueryInterface(%d): d3d=%x riid=%x(%s)\n", d3dversion, obj, riid.Data1, ExplainGUID((GUID *)&riid)); + + switch(riid.Data1){ + // DirectDraw + case 0x1dd9e8da: //IID_IDirect3D8 + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=8; break; + case 0x81bdcbca: // IID_IDirect3D9 + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=9; break; + case 0x02177241: // IID_IDirect3D9Ex + iObjectType=TYPE_OBJECT_DIRECT3D; iObjectVersion=9; bEx=TRUE; break; + case 0x7385e5df: // IID_IDirect3DDevice8 + iObjectType=TYPE_OBJECT_DIRECT3DDEVICE; iObjectVersion=8; break; + case 0xd0223b96: // IID_IDirect3DDevice9 + iObjectType=TYPE_OBJECT_DIRECT3DDEVICE; iObjectVersion=9; break; + case 0xb18b10ce: // IID_IDirect3DDevice9Ex + iObjectType=TYPE_OBJECT_DIRECT3DDEVICE; iObjectVersion=9; bEx=TRUE; break; // !!!! + case 0xb4211cfa: // IID_IDirect3DBaseTexture8 + iObjectType=TYPE_OBJECT_BASETEXTURE; iObjectVersion=8; break; + case 0xe4cdd575: // IID_IDirect3DTexture8 + iObjectType=TYPE_OBJECT_TEXTURE; iObjectVersion=8; break; + case 0x580ca87e: // IID_IDirect3DBaseTexture9 + iObjectType=TYPE_OBJECT_BASETEXTURE; iObjectVersion=9; break; + case 0x85c31227: // IID_IDirect3DTexture9 + iObjectType=TYPE_OBJECT_TEXTURE; iObjectVersion=9; break; + case 0xb96eebca: // IID_IDirect3DSurface8 + iObjectType=TYPE_OBJECT_3DSURFACE; iObjectVersion=8; break; + case 0x0cfbaf3a: // IID_IDirect3DSurface9 + iObjectType=TYPE_OBJECT_3DSURFACE; iObjectVersion=9; break; + } + +/* IID_IDirect3DDevice9Video */ +// {26DC4561-A1EE-4ae7-96DA-118A36C0EC95} +// DEFINE_GUID(IID_IDirect3DDevice9Video, 0x26dc4561, 0xa1ee, 0x4ae7, 0x96, 0xda, 0x11, 0x8a, 0x36, 0xc0, 0xec, 0x95); + + char *sLabel; + switch(iObjectType){ + case TYPE_OBJECT_DIRECT3D: sLabel = "IID_IDirect3D"; break; + case TYPE_OBJECT_DIRECT3DDEVICE: sLabel = "IID_IDirect3DDevice"; break; + case TYPE_OBJECT_BASETEXTURE: sLabel = "IID_IDirect3DBaseTexture"; break; + case TYPE_OBJECT_TEXTURE: sLabel = "IID_IDirect3DTexture"; break; + case TYPE_OBJECT_3DSURFACE: sLabel = "IID_IDirect3DSurface"; break; + case TYPE_OBJECT_UNKNOWN: + default: sLabel = "(unknown)"; break; + } + OutTraceDW("D3D::QueryInterface: Got interface for %s version %d\n", sLabel, iObjectVersion); + + res=pQueryInterfaceD3D(obj, riid, ppvObj); + if(res) { + OutTraceDW("D3D::QueryInterface ERROR: obj=%x REFIID=%x obp=%x ret=%x(%s)\n", + obj, riid.Data1, *ppvObj, res, ExplainDDError(res)); + return res; + } + + if (! *ppvObj) { + OutTraceDW("D3D::QueryInterface: Interface for object %x not found\n", riid.Data1); + return res; + } + + // added trace + OutTraceDW("D3D::QueryInterface: obj=%x REFIID=%x obp=%x obj=%s version=%d ret=0\n", + obj, riid.Data1, *ppvObj, sLabel, iObjectVersion); + + if(iObjectVersion == 8){ + switch(iObjectType){ + case TYPE_OBJECT_DIRECT3D: HookDirect3D8(ppvObj); break; + case TYPE_OBJECT_DIRECT3DDEVICE: HookD3DDevice8(ppvObj); break; + case TYPE_OBJECT_TEXTURE: HookD3DTexture8(ppvObj); break; + } + } + else{ // 9! + switch(iObjectType){ + case TYPE_OBJECT_DIRECT3D: HookDirect3D9(ppvObj, bEx); break; + case TYPE_OBJECT_DIRECT3DDEVICE: HookD3DDevice9(ppvObj); break; + case TYPE_OBJECT_TEXTURE: HookD3DTexture9(ppvObj); break; + } + } + + OutTraceD3D("D3D::QueryInterface: obp=%x\n", *ppvObj); + return res; +} + +HRESULT WINAPI extQueryInterfaceD3D8(void *obj, REFIID riid, void** ppvObj) +{ return QueryInterfaceD3D(8, pQueryInterfaceD3D8, obj, riid, ppvObj); } +HRESULT WINAPI extQueryInterfaceDev8(void *obj, REFIID riid, void** ppvObj) +{ return QueryInterfaceD3D(8, pQueryInterfaceDev8, obj, riid, ppvObj); } +HRESULT WINAPI extQueryInterfaceD3D9(void *obj, REFIID riid, void** ppvObj) +{ return QueryInterfaceD3D(9, pQueryInterfaceD3D9, obj, riid, ppvObj); } +HRESULT WINAPI extQueryInterfaceDev9(void *obj, REFIID riid, void** ppvObj) +{ return QueryInterfaceD3D(9, pQueryInterfaceDev9, obj, riid, ppvObj); } + BOOL WINAPI extDisableD3DSpy(void) { if(TRUE) return FALSE; @@ -611,21 +736,6 @@ void* WINAPI extDirect3DCreate8(UINT sdkversion) return lpd3d; } -void HookDirect3D9(void *lpd3d, BOOL ex) -{ - SetHook((void *)(*(DWORD *)lpd3d + 0), extQueryInterfaceD3D9, (void **)&pQueryInterfaceD3D9, "QueryInterface(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 16), extGetAdapterCount9, (void **)&pGetAdapterCount9, "GetAdapterCount(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 20), extGetAdapterIdentifier9, (void **)&pGetAdapterIdentifier9, "GetAdapterIdentifier(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 24), extGetAdapterModeCount9, (void **)&pGetAdapterModeCount9, "GetAdapterGetAdapterModeCount(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 28), extEnumAdapterModes9, (void **)&pEnumAdapterModes9, "EnumAdapterModes(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 32), extGetAdapterDisplayMode9, (void **)&pGetAdapterDisplayMode9, "GetAdapterDisplayMode(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 36), extCheckDeviceType9, (void **)&pCheckDeviceType9, "CheckDeviceType(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 56), extD3DGetDeviceCaps9, (void **)&pD3DGetDeviceCaps9, "GetDeviceCaps(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 60), extGetAdapterMonitor9, (void **)&pGetAdapterMonitor9, "GetAdapterMonitor(D9)"); - SetHook((void *)(*(DWORD *)lpd3d + 64), extCreateDevice9, (void **)&pCreateDevice9, "CreateDevice(D9)"); - if(ex) SetHook((void *)(*(DWORD *)lpd3d + 80), extCreateDeviceEx, (void **)&pCreateDeviceEx, "CreateDeviceEx(D9)"); -} - static char *ExplainD3DBehaviourFlags(DWORD c) { static char eb[256]; @@ -1373,6 +1483,10 @@ static HRESULT WINAPI extSetRenderState(SetRenderState_Type pSetRenderState, voi OutTraceD3D("SetRenderState: FIXED State=FOGENABLE Value=%x->FALSE\n", Value); Value = FALSE; } + if((dxw.dwFlags5 & TEXTURETRANSP) && (State == D3DRS_ALPHABLENDENABLE)){ + OutTraceD3D("SetRenderState: FIXED State=ALPHABLENDENABLE Value=%x->TRUE\n", Value); + Value = TRUE; + } res=(*pSetRenderState)(pd3dd, State, Value); if(res) OutTraceE("SetRenderState: res=%x(%s)\n", res, ExplainDDError(res)); @@ -1697,76 +1811,6 @@ void WINAPI extRSSetViewports11(ID3D11DeviceContext *This, UINT NumViewports, D3 (*pRSSetViewports11)(This, NumViewports, pViewports); } -HRESULT WINAPI extQueryInterfaceD3D8(void *obj, REFIID riid, void** ppvObj) -{ - HRESULT res; - OutTraceD3D("D3D::QueryInterface(8): d3d=%x riid=%x\n", obj, riid.Data1); - res=pQueryInterfaceD3D8(obj, riid, ppvObj); - if(res) - OutTraceE("D3D::QueryInterface(8): ERROR ret=%x(%s)\n", res, ExplainDDError(res)); - else - OutTraceD3D("D3D::QueryInterface(8): obp=%x\n", *ppvObj); - return res; -} - -HRESULT WINAPI extQueryInterfaceDev8(void *obj, REFIID riid, void** ppvObj) -{ - HRESULT res; - OutTraceD3D("Device::QueryInterface(8): d3d=%x riid=%x\n", obj, riid.Data1); - res=pQueryInterfaceDev8(obj, riid, ppvObj); - if(res){ - OutTraceE("Device::QueryInterface(8): ERROR ret=%x(%s)\n", res, ExplainDDError(res)); - return res; - } - OutTraceD3D("Device::QueryInterface(8): obp=%x\n", *ppvObj); - - switch(*(DWORD *)&riid){ - case 0x7385E5DF: // IID_IDirect3DDevice8 - HookD3DDevice8(ppvObj); - break; - case 0xD0223B96: // IID_IDirect3DDevice9 - HookD3DDevice9(ppvObj); - break; - } - return res; -} - -HRESULT WINAPI extQueryInterfaceD3D9(void *obj, REFIID riid, void** ppvObj) -{ - HRESULT res; - OutTraceD3D("D3D::QueryInterface(9): d3d=%x riid=%x\n", obj, riid.Data1); - res=pQueryInterfaceD3D9(obj, riid, ppvObj); - if(res) - OutTraceE("D3D::QueryInterface(9): ERROR ret=%x(%s)\n", res, ExplainDDError(res)); - else - OutTraceD3D("D3D::QueryInterface(9): obp=%x\n", *ppvObj); - return res; -} - -HRESULT WINAPI extQueryInterfaceDev9(void *obj, REFIID riid, void** ppvObj) -{ - HRESULT res; - - OutTraceD3D("Device::QueryInterface(9): d3d=%x riid=%x\n", obj, riid.Data1); - res=pQueryInterfaceDev9(obj, riid, ppvObj); - if(res){ - OutTraceD3D("Device::QueryInterface(9): ERROR ret=%x\n", res); - return res; - } - OutTraceD3D("Device::QueryInterface(9): ppvObj=%x\n", *ppvObj); - - switch(*(DWORD *)&riid){ - case 0x7385E5DF: // IID_IDirect3DDevice8 - HookD3DDevice8(ppvObj); - break; - case 0xD0223B96: // IID_IDirect3DDevice9 - HookD3DDevice9(ppvObj); - break; - } - - return res; -} - static ULONG WINAPI ReleaseDev(int d3dversion, ReleaseDev_Type pReleaseDev, void *lpdd) { ULONG ActualRef; @@ -1789,7 +1833,7 @@ HRESULT WINAPI extGetDirect3D8(void *lpdd3dd, void **ppD3D8) OutTraceE("Device::GetDirect3D ERROR: d3dd=%x ret=%x\n", lpdd3dd, res); else{ OutTraceD3D("Device::GetDirect3D: d3dd=%x d3d=%x\n", lpdd3dd, *ppD3D8); - HookDirect3D8(*ppD3D8); + // HookDirect3D8(*ppD3D8); } return res; } @@ -1804,7 +1848,8 @@ HRESULT WINAPI extGetDirect3D9(void *lpdd3dd, void **ppD3D9) else{ OutTraceD3D("Device::GetDirect3D: d3dd=%x d3d=%x\n", lpdd3dd, *ppD3D9); // re-hook d3d session: neeeded for Need for Speed Underground - HookDirect3D9(*ppD3D9, FALSE); + // commented out: NFSU works also without it .... + // HookDirect3D9(*ppD3D9, FALSE); } return res; } @@ -1880,6 +1925,8 @@ ULONG WINAPI extBeginScene8(void *lpdd3dd) OutTraceB("Device::BeginScene(8): d3dd=%x\n", lpdd3dd); res=(*pBeginScene8)(lpdd3dd); if (res) OutTraceE("Device::BeginScene(8) ERROR: err=%x\n", res); + + //if(dxw.dwFlags5 & TEXTURETRANSP) (*pSetRenderState8)(lpdd3dd, D3DRS_ALPHABLENDENABLE, TRUE); return res; } @@ -1889,6 +1936,8 @@ ULONG WINAPI extBeginScene9(void *lpdd3dd) OutTraceB("Device::BeginScene(9): d3dd=%x\n", lpdd3dd); res=(*pBeginScene9)(lpdd3dd); if (res) OutTraceE("Device::BeginScene(9) ERROR: err=%x\n", res); + + //if(dxw.dwFlags5 & TEXTURETRANSP) (*pSetRenderState9)(lpdd3dd, D3DRS_ALPHABLENDENABLE, TRUE); return res; } diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index d101f5d..843d58d 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -1175,6 +1175,10 @@ HRESULT WINAPI extSetRenderState(int version, SetRenderState3_Type pSetRenderSta OutTraceD3D("SetRenderState: FIXED State=FOGENABLE Value=%x->FALSE\n", Value); Value = FALSE; } + if((dxw.dwFlags5 & TEXTURETRANSP) && (State == D3DRENDERSTATE_ALPHABLENDENABLE)){ + OutTraceD3D("SetRenderState: FIXED State=ALPHABLENDENABLE Value=%x->TRUE\n", Value); + Value = TRUE; + } // beware!!! likely this code would work for interface version 3 only !!! if((State==D3DRENDERSTATE_ZWRITEENABLE) && (Value==TRUE) && (dxw.dwFlags8 & DYNAMICZCLEAN)){ diff --git a/dll/hd3d8.cpp b/dll/hd3d8.cpp index 17681b1..316a0a7 100644 --- a/dll/hd3d8.cpp +++ b/dll/hd3d8.cpp @@ -47,15 +47,20 @@ void D3D8TextureHandling(void *arg, int Level) return; } pSurfaceLevel->Release(); + OutTraceB("D3D8TextureHandling: level=%d type=%x usage=%x\n", Level, Desc.Type, Desc.Usage); switch(Desc.Type){ case D3DRTYPE_SURFACE: case D3DRTYPE_TEXTURE: break; default: + OutTraceB("D3D88TextureHandling: SKIP type=%x\n", Desc.Type); return; break; } - if(Desc.Usage == D3DUSAGE_RENDERTARGET)return; + if(Desc.Usage == D3DUSAGE_RENDERTARGET){ + OutTraceB("D3D8TextureHandling: SKIP usage=%x\n", Desc.Usage); + return; + } //pSurfaceLevel->GetRenderTargetData(&pRenderTarget, &pDestSurface); res=(*pLockRect8)(lpd3dtex, Level, &LockedRect, NULL, 0); OutTrace("D3D8TextureHandling: lpd3dtex=%x level=%d format=0x%x(%s) size=(%dx%d) bits=%x pitch=%d\n", diff --git a/dll/hd3d9.cpp b/dll/hd3d9.cpp index 4784c1e..0f20e19 100644 --- a/dll/hd3d9.cpp +++ b/dll/hd3d9.cpp @@ -39,15 +39,20 @@ void D3D9TextureHandling(void *arg, int Level) OutTraceE("Texture::GetLevelDesc ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; } + OutTraceB("D3D9TextureHandling: level=%d type=%x usage=%x\n", Level, Desc.Type, Desc.Usage); switch(Desc.Type){ case D3DRTYPE_SURFACE: case D3DRTYPE_TEXTURE: break; default: + OutTraceB("D3D9TextureHandling: SKIP type=%x usage=%x\n", Desc.Type); return; break; } - if(Desc.Usage == D3DUSAGE_RENDERTARGET)return; + if(Desc.Usage == D3DUSAGE_RENDERTARGET){ + OutTraceB("D3D9TextureHandling: SKIP usage=%x\n", Desc.Usage); + return; + } //pSurfaceLevel->GetRenderTargetData(&pRenderTarget, &pDestSurface); res=(*pLockRect9)(lpd3dtex, Level, &LockedRect, NULL, D3DLOCK_READONLY); OutTrace("D3D9TextureHandling: lpd3dtex=%x level=%d format=0x%x(%s) size=(%dx%d) bits=%x pitch=%d\n", diff --git a/dll/user32.cpp b/dll/user32.cpp index cd678da..5095ff3 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -631,6 +631,10 @@ BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) OutTrace("InvalidateRect: hwnd=%x rect=%s erase=%x\n", hwnd, sRect, bErase); } + if(dxw.IsRealDesktop(hwnd)){ + hwnd = dxw.GethWnd(); + } + RECT ScaledRect; if(dxw.IsFullScreen()) { switch(dxw.GDIEmulationMode){ @@ -2513,6 +2517,7 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { HWND RetHWND; + OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=(style=%x extstyle=%x items=%d pos=(%d,%d) size=(%dx%d)) hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, lpTemplate->style, lpTemplate->dwExtendedStyle, lpTemplate->cdit, lpTemplate->x, lpTemplate->y, lpTemplate->cx, lpTemplate->cy, diff --git a/host/ViewFlagsDialog.cpp b/host/ViewFlagsDialog.cpp new file mode 100644 index 0000000..149af56 --- /dev/null +++ b/host/ViewFlagsDialog.cpp @@ -0,0 +1,73 @@ +// ViewFlagsDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "dxwndhost.h" +#include "ViewFlagsDialog.h" + +// CViewFlagsDialog dialog + +IMPLEMENT_DYNAMIC(CViewFlagsDialog, CDialog) + +CViewFlagsDialog::CViewFlagsDialog(CWnd* pParent /*=NULL*/) + : CDialog(CViewFlagsDialog::IDD, pParent) +{ +} + +CViewFlagsDialog::~CViewFlagsDialog() +{ +} + +void CViewFlagsDialog::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CViewFlagsDialog, CDialog) +END_MESSAGE_MAP() + +// CViewFlagsDialog message handlers + +BOOL CViewFlagsDialog::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // TODO: Add extra initialization here + CString sflags; + extern TARGETMAP *ViewTarget; // dirty !!!! + int i; + TARGETMAP *t; + DWORD dword; + t = ViewTarget; + sflags.Append("Flags1: "); + for(i=0, dword = t->flags ; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(0,i)); + sflags.Append("\nFlags2: "); + for(i=0, dword = t->flags2; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(1,i)); + sflags.Append("\nFlags3: "); + for(i=0, dword = t->flags3; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(2,i)); + sflags.Append("\nFlags4: "); + for(i=0, dword = t->flags4; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(3,i)); + sflags.Append("\nFlags5: "); + for(i=0, dword = t->flags5; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(4,i)); + sflags.Append("\nFlags6: "); + for(i=0, dword = t->flags6; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(5,i)); + sflags.Append("\nFlags7: "); + for(i=0, dword = t->flags7; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(6,i)); + sflags.Append("\nFlags8: "); + for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(7,i)); + sflags.Append("\nTFlags: "); + for(i=0, dword = t->tflags; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(8,i)); + + this->SetDlgItemTextA(IDC_DESKTOPINFO, sflags); + this->SetWindowTextA(t->path); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CViewFlagsDialog::OnOK() +{ + // TODO: Add your specialized code here and/or call the base class + + CDialog::OnOK(); +} diff --git a/host/ViewFlagsDialog.h b/host/ViewFlagsDialog.h new file mode 100644 index 0000000..31cd337 --- /dev/null +++ b/host/ViewFlagsDialog.h @@ -0,0 +1,26 @@ +#pragma once + + +// CViewFlagsDialog dialog + +class CViewFlagsDialog : public CDialog +{ + DECLARE_DYNAMIC(CViewFlagsDialog) + +public: + CViewFlagsDialog(CWnd* pParent = NULL); // standard constructor + virtual ~CViewFlagsDialog(); + + // Dialog Data + enum { IDD = IDD_VIEWFLAGS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() +public: +public: + virtual BOOL OnInitDialog(); +protected: + virtual void OnOK(); +}; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 53e7361..456d77d 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index f928197..9e11f4c 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index d1b93ff..e82059f 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index b260e60..ec04e8b 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -507,6 +507,10 @@ RelativePath=".\TimeSliderDlg.cpp" > + + + + - - + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 8b6acea..1c20a73 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -17,6 +17,7 @@ #include "PaletteDialog.h" #include "TimeSliderDialog.h" #include "ShimsDialog.h" +#include "ViewFlagsDialog.h" #include "CGlobalSettings.h" #ifdef _DEBUG @@ -153,6 +154,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView) ON_COMMAND(ID_MOVE_UP, OnMoveUp) ON_COMMAND(ID_MOVE_DOWN, OnMoveDown) ON_COMMAND(ID_MOVE_BOTTOM, OnMoveBottom) + ON_COMMAND(ID_VIEW_FLAGS, OnViewFlags) ON_WM_RBUTTONDOWN() ON_WM_HOTKEY() ON_WM_DROPFILES() @@ -293,6 +295,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 1: t->flags5 |= TEXTUREHIGHLIGHT; break; case 2: t->flags5 |= TEXTUREDUMP; break; case 3: t->flags5 |= TEXTUREHACK; break; + case 4: t->flags5 |= TEXTURETRANSP; break; } switch(dlg->m_SonProcessMode){ @@ -628,6 +631,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->flags5 & TEXTUREHIGHLIGHT) dlg->m_TextureHandling = 1; if(t->flags5 & TEXTUREDUMP) dlg->m_TextureHandling = 2; if(t->flags5 & TEXTUREHACK) dlg->m_TextureHandling = 3; + if(t->flags5 & TEXTURETRANSP) dlg->m_TextureHandling = 4; dlg->m_SonProcessMode = 0; if(t->flags4 & SUPPRESSCHILD) dlg->m_SonProcessMode = 1; @@ -2527,6 +2531,26 @@ void CDxwndhostView::OnViewShims() pDlg->ShowWindow(SW_SHOW); } +TARGETMAP *ViewTarget; // dirty !!!! + +void CDxwndhostView::OnViewFlags() +{ + int i; + CTargetDlg dlg; + POSITION pos; + CListCtrl& listctrl = GetListCtrl(); + + if(!listctrl.GetSelectedCount()) return; + pos = listctrl.GetFirstSelectedItemPosition(); + i = listctrl.GetNextSelectedItem(pos); + ViewTarget = &TargetMaps[i]; + + CViewFlagsDialog *pDlg = new CViewFlagsDialog(); + + BOOL ret = pDlg->Create(CViewFlagsDialog::IDD, this); + pDlg->ShowWindow(SW_SHOW); +} + void CDxwndhostView::OnViewDesktop() { CDesktopDialog *pDlg = new CDesktopDialog(); @@ -2680,6 +2704,9 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) case ID_MOVE_BOTTOM: OnMoveBottom(); break; + case ID_VIEW_FLAGS: + OnViewFlags(); + break; } CListView::OnRButtonDown(nFlags, point); } diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index 7fd0698..446bcfd 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -116,6 +116,7 @@ protected: afx_msg void OnMoveDown(); afx_msg void OnMoveBottom(); afx_msg void OnDropFiles(HDROP hDropInfo); + afx_msg void OnViewFlags(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/host/resource b/host/resource index bf16a16..61c6a3c 100644 Binary files a/host/resource and b/host/resource differ diff --git a/proxy/wing32.cpp b/proxy/wing32.cpp new file mode 100644 index 0000000..5e3e866 --- /dev/null +++ b/proxy/wing32.cpp @@ -0,0 +1,77 @@ +//------------------------------------------------------------------------------ +// Tiny WinG32 Proxy DLL v1.0 [30.01.2017] +// Copyright 2010 Evgeny Vrublevsky , 2017 GHO +//------------------------------------------------------------------------------ +#define APP_NAME "Tiny WinG32 Proxy" +#define APP_VERSION "1.0 [28.05.2010]" + +#define WIN32_LEAN_AND_MEAN +#include +#include + +void InitDxWnd(void); +void DxWndEndHook(void); + +struct wing32_dll +{ + HMODULE dll; + FARPROC WinGCreateDC; + FARPROC WinGCreateBitmap; + FARPROC WinGBitBlt; + FARPROC WinGStretchBlt; + FARPROC WinGRecommendDIBFormat; + FARPROC WinGGetDIBPointer; + FARPROC WinGSetDIBColorTable; + FARPROC WinGGetDIBColorTable; + FARPROC WinGCreateHalftonePalette; + FARPROC WinGCreateHalftoneBrush; +} wing32; + +__declspec(naked) void FakeWinGCreateDC() { _asm { jmp [wing32.WinGCreateDC] } } +__declspec(naked) void FakeWinGCreateBitmap() { _asm { jmp [wing32.WinGCreateBitmap] } } +__declspec(naked) void FakeWinGBitBlt() { _asm { jmp [wing32.WinGBitBlt] } } +__declspec(naked) void FakeWinGStretchBlt() { _asm { jmp [wing32.WinGStretchBlt] } } +__declspec(naked) void FakeWinGRecommendDIBFormat() { _asm { jmp [wing32.WinGRecommendDIBFormat] } } +__declspec(naked) void FakeWinGGetDIBPointer() { _asm { jmp [wing32.WinGGetDIBPointer] } } +__declspec(naked) void FakeWinGSetDIBColorTable() { _asm { jmp [wing32.WinGSetDIBColorTable] } } +__declspec(naked) void FakeWinGGetDIBColorTable() { _asm { jmp [wing32.WinGGetDIBColorTable] } } +__declspec(naked) void FakeWinGCreateHalftonePalette() { _asm { jmp [wing32.WinGCreateHalftonePalette] } } +__declspec(naked) void FakeWinGCreateHalftoneBrush() { _asm { jmp [wing32.WinGCreateHalftoneBrush] } } + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + char path[MAX_PATH]; + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + { + CopyMemory(path+GetSystemDirectory(path,MAX_PATH-10), "\\wing32.dll",11); + wing32.dll = LoadLibrary(path); + if (wing32.dll == false) + { + MessageBox(0, "Cannot load original wing32.dll library", APP_NAME, MB_ICONERROR); + ExitProcess(0); + } + wing32.WinGCreateDC = GetProcAddress(wing32.dll, "WinGCreateDC"); + wing32.WinGCreateBitmap = GetProcAddress(wing32.dll, "WinGCreateBitmap"); + wing32.WinGBitBlt = GetProcAddress(wing32.dll, "WinGBitBlt"); + wing32.WinGStretchBlt = GetProcAddress(wing32.dll, "WinGStretchBlt"); + wing32.WinGRecommendDIBFormat = GetProcAddress(wing32.dll, "WinGRecommendDIBFormat"); + wing32.WinGGetDIBPointer = GetProcAddress(wing32.dll, "WinGGetDIBPointer"); + wing32.WinGSetDIBColorTable = GetProcAddress(wing32.dll, "WinGSetDIBColorTable"); + wing32.WinGGetDIBColorTable = GetProcAddress(wing32.dll, "WinGGetDIBColorTable"); + wing32.WinGCreateHalftonePalette = GetProcAddress(wing32.dll, "WinGCreateHalftonePalette"); + wing32.WinGCreateHalftoneBrush = GetProcAddress(wing32.dll, "WinGCreateHalftoneBrush"); + + InitDxWnd(); + break; + } + case DLL_PROCESS_DETACH: + { + DxWndEndHook(); + FreeLibrary(wing32.dll); + } + break; + } + return TRUE; +} diff --git a/proxy/wing32.def b/proxy/wing32.def new file mode 100644 index 0000000..634dc83 --- /dev/null +++ b/proxy/wing32.def @@ -0,0 +1,12 @@ +LIBRARY "wing32" +EXPORTS +WinGCreateDC = FakeWinGCreateDC @1 +WinGCreateBitmap = FakeWinGCreateBitmap @2 +WinGBitBlt = FakeWinGBitBlt @3 +WinGStretchBlt = FakeWinGStretchBlt @4 +WinGRecommendDIBFormat = FakeWinGRecommendDIBFormat @5 +WinGGetDIBPointer = FakeWinGGetDIBPointer @6 +WinGSetDIBColorTable = FakeWinGSetDIBColorTable @7 +WinGGetDIBColorTable = FakeWinGGetDIBColorTable @8 +WinGCreateHalftonePalette = FakeWinGCreateHalftonePalette @9 +WinGCreateHalftoneBrush = FakeWinGCreateHalftoneBrush @10 diff --git a/proxy/wing32.sln b/proxy/wing32.sln new file mode 100644 index 0000000..17badf0 --- /dev/null +++ b/proxy/wing32.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wing32", "wing32.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {579E7FE7-2745-4100-A802-23511711FCDF}.Debug|Win32.ActiveCfg = Debug|Win32 + {579E7FE7-2745-4100-A802-23511711FCDF}.Debug|Win32.Build.0 = Debug|Win32 + {579E7FE7-2745-4100-A802-23511711FCDF}.Release|Win32.ActiveCfg = Release|Win32 + {579E7FE7-2745-4100-A802-23511711FCDF}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/proxy/wing32.suo b/proxy/wing32.suo new file mode 100644 index 0000000..d434246 Binary files /dev/null and b/proxy/wing32.suo differ diff --git a/proxy/wing32.vcproj b/proxy/wing32.vcproj new file mode 100644 index 0000000..acc4257 --- /dev/null +++ b/proxy/wing32.vcproj @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wing/wing32.suo b/wing/wing32.suo deleted file mode 100644 index f1e9a69..0000000 Binary files a/wing/wing32.suo and /dev/null differ