1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_03_72_src

Former-commit-id: 731195041a2c51fb26edebd153a74bf5060127b1
This commit is contained in:
gho tik 2016-06-21 12:46:09 -04:00 committed by Refael ACkermann
parent ffc6743be1
commit f5e2ede68c
38 changed files with 817 additions and 163 deletions

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:922db77cc7f8ea50e92a54d5579754a304cb92bdc3e422ac9d4f10d5e34f9227
size 657920
oid sha256:b93d0975ec2a090848ed1953cd908344cb91d8e459ffebd7f63b231f23274473
size 660480

View File

@ -0,0 +1,31 @@
[target]
title0=Arcade Pool 2
path0=D:\Games\Arcade Pool 2\Arcade Pool II.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=136314914
flagg0=1207959552
flagh0=20
flagi0=138543108
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=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Hyper Crazy Climber
path0=D:\Games\Hyper Crazy Climber\CRAZY.EXE
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=1
coord0=0
flag0=681574434
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
flagk0=196608
flagl0=0
flagm0=0
tflag0=0
dflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Need For Speed 3
path0=D:\Games\Need For Speed III\NFS3.EXE
launchpath0=
module0=
opengllib0=
notes0=To install the game on x64 systems copy the following folders and files from\nthe CD to a NFS3 directory on the hard drive:\nFEDATA\\nGAMEDATA\\nd3da.dll\neacsnd.dll\nnfs3.exe\nsofttria.dll\n\nThen copy paste the text below to notepad and save it to your NFS3 directory\nas "INSTALL.WIN". (Remember to set file type to "All Files" when saving.)\n\nenglish\nlocal\n.\GameData\\n.\GameData\Tracks\\n.\GameData\Tracks\Tutor\\n.\GameData\CarModel\\n.\GameData\Render\pc\\n.\GameData\DashHud\\n.\GameData\Audio\pc\\n.\GameData\Audio\SFX\\n.\GameData\Audio\Speech\English\\n.\GameData\Audio\Speech\German\\n.\GameData\Audio\Speech\French\\n.\GameData\Audio\Speech\Spanish\\n.\GameData\Audio\Speech\Italian\\n.\FeData\art\\n.\FeData\text\\n.\FeData\text\\n.\FeData\save\\n.\FeData\stats\\n.\FeData\config\\n.\FeData\audio\\n.\FeData\Art\Slides\\n.\FeData\Art\Track\\n.\FeData\Art\Showcase\\n.\FeData\movies\\n.\FeData\stats\prh\\n
registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Need For Speed III]\n"3D Card"="[Direct 3D]"\n"Thrash Driver"="d3d"\n"Group"="D3D"\n"Hardware Acceleration"=dword:00000001\n\n# These values set up NFS3 to run in Direct3D mode. If you want to run the\n# game in software rendering mode turn off the Compat. tab option\n# "Emulate Registry".\n
ver0=0
coord0=0
flag0=136314914
flagg0=1744830464
flagh0=1556
flagi0=138412036
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=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Return to Castle Wolfenstein
path0=D:\Games\Return to Castle Wolfenstein\WolfSP.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=673194498
flagg0=1208090624
flagh0=65556
flagi0=138412038
flagj0=4224
flagk0=-2147418112
flagl0=0
flagm0=0
tflag0=0
dflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7
slowratio0=1

View File

@ -0,0 +1,31 @@
[target]
title0=Sherlock Holmes - Mystery of the Mummy (steam)
path0=D:\Games\Sherlock Holmes - Mystery of the Mummy\game.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=136314914
flagg0=1073741824
flagh0=65556
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=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=St. Row the Third (DX11)
path0=D:\Games\St. Row the Third\Saints Row The Third\saintsrowthethird_dx11.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=11
coord0=0
flag0=136314914
flagg0=1207959552
flagh0=20
flagi0=138416132
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=4
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=St. Row the Third (DX9)
path0=D:\Games\St. Row the Third\Saints Row The Third\SaintsRowTheThird.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=9
coord0=0
flag0=136314914
flagg0=1744830464
flagh0=20
flagi0=136314884
flagj0=4224
flagk0=65536
flagl0=0
flagm0=0
tflag0=0
dflag0=0
posx0=50
posy0=50
sizx0=1024
sizy0=768
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Star Defender 1
path0=D:\Games\Star Defender 123Special\sd1\StarDefender.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=1
coord0=0
flag0=136314922
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
flagk0=329728
flagl0=0
flagm0=0
tflag0=0
dflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Star Defender 2
path0=D:\Games\Star Defender 123Special\sd2\game.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=8
coord0=0
flag0=136315434
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
flagk0=329728
flagl0=0
flagm0=0
tflag0=0
dflag0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Steel Saviour demo (T-Zwei)
path0=D:\Games\T-Zwei\TZwei.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=8
coord0=0
flag0=136314914
flagg0=1744961536
flagh0=20
flagi0=138412036
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=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Steel Saviour
path0=D:\Games\Steel Saviour\SteelSaviour.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=8
coord0=0
flag0=136314922
flagg0=1744961536
flagh0=20
flagi0=138412036
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=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -0,0 +1,31 @@
[target]
title0=Warhammer 40K Rites of War
path0=D:\Games\Warhammer 40K Rites Of War\game\RoW.exe
launchpath0=
module0=
opengllib0=
notes0=After installing the game copy the "Map" -folder from the CD to the \nRites of War\ directory on your hard drive.\n\nThis will fix the issue where the game crashes when starting a campaign.
registry0=
ver0=0
coord0=0
flag0=685772838
flagg0=1207959680
flagh0=20
flagi0=138412036
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=-1
swapeffect0=0
maxddinterface0=7
slowratio0=2

View File

@ -1129,3 +1129,9 @@ v2.03.71
fix: no need to save configuration before running with fake registry
add: icons to notify for non-empty registry and notes tabs
fix: hooked ddrawex.dll DirectDrawEx methods - fixes "Whiteout", what else?
v2.03.72
fix: inserted bypass for DirectDraw::Compact method, that is unimplemented but can return errors. Fixes "Crazy Climber" error detection.
fix: error in d3d9::CrerateDeviceEx method preventing it to work when moving fullscreen devices to window mode, as tipically happens using DxWnd. Fixes d3d9 version of "Saint's Row the Third"
fix: accurate determination of ".text" or "CODE" segments where to apply the REPLACERTSC and REPLACEPRIVOPS flags.
fix: error in logic to add extra reference to backbuffer surface: fixes "Warhammer 40k Rites of War".

View File

@ -29,12 +29,20 @@ static HookEntryEx_Type Hooks[]={
void HookAdvApi32(HMODULE module)
{
if( (dxw.dwFlags3 & EMULATEREGISTRY) ||
(dxw.dwFlags4 & OVERRIDEREGISTRY) ||
(dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) ||
(dxw.dwTFlags & OUTREGISTRY))
HookLibraryEx(module, Hooks, "ADVAPI32.dll");
}
FARPROC Remap_AdvApi32_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if(!(dxw.dwFlags3 & EMULATEREGISTRY) ||
(dxw.dwFlags4 & OVERRIDEREGISTRY) ||
(dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) ||
(dxw.dwTFlags & OUTREGISTRY)) return NULL;
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
return NULL;
}

59
dll/comctl32.cpp Normal file
View File

@ -0,0 +1,59 @@
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "syslibs.h"
#include "dxhook.h"
#include "dxhelper.h"
typedef BOOL (WINAPI *InitializeFlatSB_Type)(HWND);
InitializeFlatSB_Type pInitializeFlatSB = NULL;
BOOL WINAPI extInitializeFlatSB(HWND);
typedef BOOL (WINAPI *UninitializeFlatSB_Type)(HWND);
InitializeFlatSB_Type pUninitializeFlatSB = NULL;
BOOL WINAPI extUninitializeFlatSB(HWND);
static HookEntryEx_Type Hooks[]={
{HOOK_IAT_CANDIDATE, 0, "InitializeFlatSB", NULL, (FARPROC *)&pInitializeFlatSB, (FARPROC)extInitializeFlatSB},
{HOOK_IAT_CANDIDATE, 0, "UninitializeFlatSB", NULL, (FARPROC *)&pUninitializeFlatSB, (FARPROC)extUninitializeFlatSB},
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
void HookComCtl32(HMODULE module)
{
HookLibraryEx(module, Hooks, "comtl32.dll");
}
FARPROC Remap_ComCtl32_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
return NULL;
}
BOOL WINAPI extInitializeFlatSB(HWND hwnd)
{
BOOL ret;
OutTraceDW("InitializeFlatSB: hwnd=%x\n", hwnd);
if(dxw.IsFullScreen() && dxw.IsRealDesktop(hwnd)) {
OutTraceDW("InitializeFlatSB: hwnd=%x->%x\n", hwnd, dxw.GethWnd());
hwnd = dxw.GethWnd();
}
ret = (*pInitializeFlatSB)(hwnd);
if(!ret)OutTraceDW("InitializeFlatSB: ret=%x\n", ret);
return ret;
}
BOOL WINAPI extUninitializeFlatSB(HWND hwnd)
{
BOOL ret;
OutTraceDW("InitializeFlatSB: hwnd=%x\n", hwnd);
if(dxw.IsFullScreen() && dxw.IsRealDesktop(hwnd)) {
OutTraceDW("UninitializeFlatSB: hwnd=%x->%x\n", hwnd, dxw.GethWnd());
hwnd = dxw.GethWnd();
}
ret = (*pUninitializeFlatSB)(hwnd);
if(!ret)OutTraceDW("UninitializeFlatSB: ret=%x\n", ret);
return ret;
}

View File

@ -101,6 +101,21 @@ static HRESULT sBltNoPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR
if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__);
res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx);
break;
case DDERR_UNSUPPORTED:
// to be fixed: parameters coming from BltFast in Star Defender 1 are not compatible with Blt transformation, so clear all....
if(dwflags & (DDBLT_KEYDEST|DDBLT_KEYSRC)){
#if 1
res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, 0, 0);
#else
DDBLTFX ddbltfx;
memset(&ddbltfx, 0, sizeof(ddbltfx));
ddbltfx.dwSize = sizeof(ddbltfx);
if(dwflags & DDBLT_KEYDEST) ddbltfx.dwROP |= DDCKEYCAPS_DESTBLT;
if(dwflags & DDBLT_KEYSRC ) ddbltfx.dwROP |= DDCKEYCAPS_SRCBLT;
res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_ROP, &ddbltfx);
#endif
}
break;
default:
break;
}

View File

@ -15,6 +15,18 @@
#define EMULATEZBUFFERATTACH FALSE
#ifdef CHECKMETHODPOINTERS
static void NullMethodPointer(char *s)
{
char msg[80];
sprintf(msg, "NULL %s method", s);
MessageBox(0, msg, "DxWnd", MB_OK);
}
#define CHECKPTR(p, s) if(!p) NullMethodPointer(s)
#else
#define CHECKPTR(p, s)
#endif
extern BOOL IsChangeDisplaySettingsHotPatched;
DWORD dwBackBufferCaps;
extern void TextureHandling(LPDIRECTDRAWSURFACE, int);
@ -42,7 +54,9 @@ ULONG WINAPI extReleaseD1(LPDIRECTDRAW);
ULONG WINAPI extReleaseD2(LPDIRECTDRAW);
ULONG WINAPI extReleaseD4(LPDIRECTDRAW);
ULONG WINAPI extReleaseD7(LPDIRECTDRAW);
/*** IDirectDraw methods ***/
HRESULT WINAPI extCompact(LPDIRECTDRAW); // unimplemented method ???
HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*);
HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*);
HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*);
@ -758,6 +772,8 @@ static void BypassGOGDDrawRedirector()
int HookDirectDraw(HMODULE module, int version)
{
if(dxw.dwTargetDDVersion == HOOKDDRAWNONE) return 0;
if ((dxw.dwFlags2 & SETCOMPATIBILITY) ||
(dxw.dwFlags6 & DISABLEMAXWINMODE)){
static BOOL AlreadyDone = FALSE;
@ -842,6 +858,7 @@ CreatePalette_Type pCreatePaletteMethod(int dxversion)
case 4: pCreatePalette = pCreatePalette4; break;
case 7: pCreatePalette = pCreatePalette7; break;
}
CHECKPTR(pCreatePalette, "CreatePalette");
return pCreatePalette;
}
@ -854,6 +871,7 @@ SetPalette_Type pSetPaletteMethod(int dxversion)
case 4: pSetPalette=pSetPalette4; break;
case 7: pSetPalette=pSetPalette7; break;
}
CHECKPTR(pSetPalette, "SetPalette");
return pSetPalette;
}
@ -867,6 +885,7 @@ ReleaseS_Type pReleaseSMethod(int dxversion)
case 4: pReleaseS=pReleaseS4; break;
case 7: pReleaseS=pReleaseS7; break;
}
CHECKPTR(pReleaseS, "Surface::Release");
return pReleaseS;
}
@ -880,6 +899,7 @@ ReleaseDC_Type pReleaseDCMethod()
case 4: pReleaseDC=pReleaseDC4; break;
case 7: pReleaseDC=pReleaseDC7; break;
}
CHECKPTR(pReleaseDC, "ReleaseDC");
return pReleaseDC;
}
@ -893,6 +913,7 @@ SetClipper_Type pSetClipperMethod(int dxversion)
case 4: pSetClipper=pSetClipper4; break;
case 7: pSetClipper=pSetClipper7; break;
}
CHECKPTR(pSetClipper, "SetClipper");
return pSetClipper;
}
@ -906,6 +927,7 @@ Blt_Type pBltMethod()
case 4: pBlt=pBlt4; break;
case 7: pBlt=pBlt7; break;
}
CHECKPTR(pBlt, "Blt");
return pBlt;
}
@ -919,6 +941,7 @@ GetDC_Type pGetDCMethod()
case 4: pGetDC=pGetDC4; break;
case 7: pGetDC=pGetDC7; break;
}
CHECKPTR(pGetDC, "GetDC");
return pGetDC;
}
@ -932,6 +955,7 @@ Unlock4_Type pUnlockMethod(int dxversion)
case 4: pUnlock=(Unlock4_Type)pUnlock4; break;
case 7: pUnlock=(Unlock4_Type)pUnlock7; break;
}
CHECKPTR(pUnlock, "Unlock");
return pUnlock;
}
@ -945,6 +969,7 @@ Lock_Type pLockMethod(int dxversion)
case 4: pLock=pLock4; break;
case 7: pLock=pLock7; break;
}
CHECKPTR(pLock, "Lock");
return pLock;
}
@ -958,6 +983,7 @@ CreateSurface2_Type pCreateSurfaceMethod(int dxversion)
case 4: pCreateSurface=(CreateSurface2_Type)pCreateSurface4; break;
case 7: pCreateSurface=(CreateSurface2_Type)pCreateSurface7; break;
}
CHECKPTR(pCreateSurface, "CreateSurface");
return pCreateSurface;
}
@ -972,6 +998,7 @@ GetSurfaceDesc2_Type pGetSurfaceDescMethod()
case 4: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc4; break;
case 7: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc7; break;
}
CHECKPTR(pGetSurfaceDesc, "GetSurfaceDesc");
return pGetSurfaceDesc;
}
@ -985,6 +1012,7 @@ GetGDISurface_Type pGetGDISurfaceMethod(int dxversion)
case 4: pGetGDISurface = pGetGDISurface4; break;
case 7: pGetGDISurface = pGetGDISurface7; break;
}
CHECKPTR(pGetGDISurface, "GetGDISurface");
return pGetGDISurface;
}
@ -1091,6 +1119,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion)
OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n",
*lplpdd, dxversion, GetCurrentThreadId());
SetHook((void *)(**(DWORD **)lplpdd + 12), extCompact, (void **)&pCompact, "Compact");
switch(dxversion) {
case 1:
SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)");
@ -3123,7 +3152,9 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate
// v2.2.84: avoid the extra referenced in non windowed mode since it causes the window shift reported by gsky916
// for Wind Fantasy SP.
// v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2
if((dxw.dwDDVersion>=2) && dxw.Windowize) lpdd->AddRef();
// v2.3.72: fixed previous fix: condition is <=2, not >=2 !
// Be aware that it may perhaps become <=3, if we get the same problem elsewhere
if((dxw.dwDDVersion<=2) && dxw.Windowize) lpdd->AddRef();
return DD_OK;
}
@ -3812,7 +3843,8 @@ HRESULT WINAPI extBlt4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRA
HRESULT WINAPI extBlt7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx)
{ return extBlt(7, pBlt7, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); }
HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy,
HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy,
LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{
// BltFast is supported just on screen surfaces, so it has to be replaced
@ -3834,8 +3866,18 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdd
char sRect[81];
if (lpsrcrect) sprintf(sRect, "(%d,%d)-(%d,%d)", lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom);
else strcpy(sRect, "(NULL)");
OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) srcrect=%s\n",
lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy, sRect);
OutTrace("BltFast(%d): dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) srcrect=%s\n",
dxversion, lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy, sRect);
}
// try the actual method first, it may work in some corcumstances....
// when ret is DDERR_UNSUPPORTED try the emulated path.
if(!(ToPrim || FromPrim)) {
ret = pBltFast(lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans);
if(ret != DDERR_UNSUPPORTED) {
if(ret) OutTraceE("BltFast ERROR: res=%x(%s)\n", ret, ExplainDDError(ret));
return ret;
}
}
// consistency check ....
@ -3849,7 +3891,6 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdd
if(dwtrans & DDBLTFAST_WAIT) flags = DDBLT_WAIT;
if(dwtrans & DDBLTFAST_DESTCOLORKEY) flags |= DDBLT_KEYDEST;
if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC;
//if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_COLORFILL;
if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){
return sBlt(dxversion, pBlt, "BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE);
@ -3890,15 +3931,15 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFACE lpdd
}
HRESULT WINAPI extBltFast1(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{ return extBltFast(1, pBlt1, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
{ return extBltFast(1, pBlt1, pBltFast1, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
HRESULT WINAPI extBltFast2(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{ return extBltFast(2, pBlt2, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
{ return extBltFast(2, pBlt2, pBltFast2, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
HRESULT WINAPI extBltFast3(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{ return extBltFast(3, pBlt3, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
{ return extBltFast(3, pBlt3, pBltFast3, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
HRESULT WINAPI extBltFast4(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{ return extBltFast(4, pBlt4, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
{ return extBltFast(4, pBlt4, pBltFast4, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
HRESULT WINAPI extBltFast7(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{ return extBltFast(7, pBlt7, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
{ return extBltFast(7, pBlt7, pBltFast7, lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans); }
HRESULT WINAPI extWaitForVerticalBlank(WaitForVerticalBlank_Type pWaitForVerticalBlank, LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent)
{
@ -4139,8 +4180,8 @@ static HRESULT WINAPI extLock(int dxversion, Lock_Type pLock, LPDIRECTDRAWSURFAC
char sRect[81];
if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom);
else strcpy(sRect, "(NULL)");
OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n",
lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect);
OutTrace("Lock(%d): lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n",
dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect);
}
res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent);
@ -4202,8 +4243,8 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR
char sRect[81];
if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom);
else strcpy(sRect, "(NULL)");
OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n",
lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect);
OutTrace("Lock(%d): lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n",
dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect);
}
switch(dxversion){
@ -5806,3 +5847,9 @@ HRESULT WINAPI extAddOverlayDirtyRect4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect)
{ return extAddOverlayDirtyRect(4, pAddOverlayDirtyRect4, lpdds, lpRect); }
HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect)
{ return extAddOverlayDirtyRect(7, pAddOverlayDirtyRect7, lpdds, lpRect); }
HRESULT WINAPI extCompact(LPDIRECTDRAW lpdd)
{
OutTraceDW("Compact: lpdd=%x\n", lpdd);
return DD_OK;
}

View File

@ -156,6 +156,8 @@ void HookDirectInput(HMODULE module)
HINSTANCE hinst;
LPDIRECTINPUT lpdi;
if(!(dxw.dwFlags1 & HOOKDI)) return;
HookLibraryEx(module, diHooks, "dinput.dll");
if(!pDirectInputCreateA && !pDirectInputCreateW && !pDirectInputCreateExA){
hinst = LoadLibrary("dinput.dll");
@ -176,6 +178,8 @@ void HookDirectInput8(HMODULE module)
HINSTANCE hinst;
LPDIRECTINPUT lpdi;
if(!(dxw.dwFlags1 & HOOKDI8)) return;
HookLibraryEx(module, di8Hooks, "dinput8.dll");
if(!pDirectInput8Create){
hinst = LoadLibrary("dinput8.dll");

View File

@ -44,6 +44,7 @@ static HookEntryEx_Type Hooks[]={
FARPROC Remap_DSound_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if(!(dxw.dwFlags7 & HOOKDIRECTSOUND)) return NULL;
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
return NULL;
}
@ -52,6 +53,7 @@ static char *libname = "dsound.dll";
void HookDirectSound(HMODULE hModule)
{
if(!(dxw.dwFlags7 & HOOKDIRECTSOUND)) return;
HookLibraryEx(hModule, Hooks, "dsound.dll");
}

View File

@ -6,6 +6,7 @@
#include <stdio.h>
#include <stdarg.h>
#include <psapi.h>
#include <dbghelp.h>
#include "dxwnd.h"
#include "dxwcore.hpp"
#include "shareddc.hpp"
@ -36,6 +37,8 @@ extern LRESULT CALLBACK MessageHook(int, WPARAM, LPARAM);
extern DWORD WINAPI CpuLimit(LPVOID);
extern DWORD WINAPI CpuSlow(LPVOID);
extern HMODULE SysLibs[];
typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long);
typedef int (*Preparedisasm_Type)(void);
typedef void (*Finishdisasm_Type)(void);
@ -72,7 +75,7 @@ static char *FlagNames[32]={
static char *Flag2Names[32]={
"RECOVERSCREENMODE", "REFRESHONRESIZE", "BACKBUFATTACH", "MODALSTYLE",
"KEEPASPECTRATIO", "INIT8BPP", "FORCEWINRESIZE", "INIT16BPP",
"KEEPCURSORFIXED", "DISABLEGAMMARAMP", "**", "FIXNCHITTEST",
"KEEPCURSORFIXED", "DISABLEGAMMARAMP", "INDEPENDENTREFRESH", "FIXNCHITTEST",
"LIMITFPS", "SKIPFPS", "SHOWFPS", "HIDEMULTIMONITOR",
"TIMESTRETCH", "HOOKOPENGL", "WALLPAPERMODE", "SHOWHWCURSOR",
"GDISTRETCHED", "SHOWFPSOVERLAY", "FAKEVERSION", "FULLRECTBLT",
@ -897,31 +900,55 @@ void HookExceptionHandler(void)
(*pSetUnhandledExceptionFilter)((LPTOP_LEVEL_EXCEPTION_FILTER)myUnhandledExceptionFilter);
}
static void InitModuleHooks()
{
for (int i=0; i<SYSLIBIDX_MAX; i++) SysLibs[i]=NULL;
}
void SetModuleHooks()
{
int i;
HMODULE hModule;
for (i=0; i<SYSLIBIDX_MAX; i++){
if(SysLibs[i]==NULL){
hModule = GetModuleHandle(SysNames[i]);
if(hModule) {
SysLibs[i]=hModule;
OutTraceDW("InitModuleHooks: lib=%s hmodule=%x\n", SysNames[i], hModule);
}
}
}
}
void HookModule(HMODULE base, int dxversion)
{
HookKernel32(base);
HookUser32(base);
HookOle32(base);
HookWinMM(base, "winmm.dll");
if(dxw.dwFlags6 & HOOKGOGLIBS) HookWinMM(base, "win32.dll");
//if(dxw.dwFlags2 & SUPPRESSIME) HookImeLib(module);
HookGDI32(base);
if(dxw.dwFlags1 & HOOKDI) HookDirectInput(base);
if(dxw.dwFlags1 & HOOKDI8) HookDirectInput8(base);
if(dxw.dwTargetDDVersion != HOOKDDRAWNONE) HookDirectDraw(base, dxversion);
HookDirect3D(base, dxversion);
HookDirect3D7(base, dxversion);
if(dxw.dwFlags2 & HOOKOPENGL) HookOpenGLLibs(base, dxw.CustomOpenGLLib);
if(dxw.dwFlags4 & HOOKGLIDE) HookGlideLibs(base);
if( (dxw.dwFlags3 & EMULATEREGISTRY) ||
(dxw.dwFlags4 & OVERRIDEREGISTRY) ||
(dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) ||
(dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base);
HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for?
HookAVIFil32(base);
if(dxw.dwFlags7 & HOOKSMACKW32) HookSmackW32(base);
if(dxw.dwFlags7 & HOOKDIRECTSOUND) HookDirectSound(base);
//HookComDlg32(base);
SetModuleHooks();
HookKernel32(base); //SYSLIBIDX_KERNEL32
HookUser32(base); // SYSLIBIDX_USER32
HookGDI32(base); // SYSLIBIDX_GDI32
HookImeLib(base); // SYSLIBIDX_IMELIB
HookAdvApi32(base); // SYSLIBIDX_ADVAPI32
HookOle32(base); // SYSLIBIDX_OLE32
HookDirectDraw(base, dxversion); // SYSLIBIDX_DIRECTDRAW, SYSLIBIDX_DIRECT3D8, SYSLIBIDX_DIRECT3D9, SYSLIBIDX_DIRECT3D10, SYSLIBIDX_DIRECT3D10_1, SYSLIBIDX_DIRECT3D11,
HookOpenGL(base, dxw.CustomOpenGLLib); // SYSLIBIDX_OPENGL,
HookMSV4WLibs(base); // SYSLIBIDX_MSVFW -- used by Aliens & Amazons demo: what for?
HookSmackW32(base); // SYSLIBIDX_SMACK
HookDirectSound(base); // SYSLIBIDX_DSOUND
HookWinMM(base, "winmm.dll"); // SYSLIBIDX_WINMM
if(dxw.dwFlags6 & HOOKGOGLIBS) HookWinMM(base, "win32.dll"); // SYSLIBIDX_WINMM
HookDirectInput(base); // SYSLIBIDX_DINPUT,
HookDirectInput8(base); // SYSLIBIDX_DINPUT8,
HookTrust(base); // SYSLIBIDX_WINTRUST
HookDirect3D(base, dxversion); // SYSLIBIDX_DIRECT3D,
HookDirect3D7(base, dxversion); // SYSLIBIDX_DIRECT3D700,
HookImagehlp(base); // SYSLIBIDX_IMAGEHLP
HookComDlg32(base); // SYSLIBIDX_COMDLG32
HookComCtl32(base); // SYSLIBIDX_COMCTL32
HookAVIFil32(base); // SYSLIBIDX_AVIFIL32
// unimplemented
if(dxw.dwFlags4 & HOOKGLIDE) HookGlideLibs(base);
}
#define USEWINNLSENABLE
@ -998,36 +1025,67 @@ void SetSingleProcessAffinity(BOOL first)
OutTraceE("SetProcessAffinityMask: ERROR err=%d\n", GetLastError());
}
static BOOL GetTextSegment(char *module, unsigned char **start, DWORD *len)
{
typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
MODULEINFO mi;
HMODULE psapilib;
GetModuleInformation_Type pGetModuleInformation;
// getting segment size
psapilib=(*pLoadLibraryA)("psapi.dll");
if(!psapilib) {
OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "psapi.dll", GetLastError());
return FALSE;
}
pGetModuleInformation=(GetModuleInformation_Type)(*pGetProcAddress)(psapilib, "GetModuleInformation");
(*pGetModuleInformation)(GetCurrentProcess(), GetModuleHandle(NULL), &mi, sizeof(mi));
FreeLibrary(psapilib);
typedef IMAGE_NT_HEADERS *(WINAPI *ImageNtHeader_Type)(PVOID);
ImageNtHeader_Type pImageNtHeader = NULL;
HMODULE hDbgLib = LoadLibrary("dbghelp.dll");
if(!hDbgLib) {
OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "dbghelp.dll", GetLastError());
return FALSE;
}
pImageNtHeader = (ImageNtHeader_Type)GetProcAddress(hDbgLib, "ImageNtHeader");
if (!pImageNtHeader) return FALSE;
*start = NULL;
*len = 0;
IMAGE_NT_HEADERS *pNtHdr = (*pImageNtHeader)(GetModuleHandle(module));
IMAGE_SECTION_HEADER *pSectionHdr = (IMAGE_SECTION_HEADER *)(pNtHdr+1);
OutTrace("sections=%d\n", pNtHdr->FileHeader.NumberOfSections);
for(int i=0; i<pNtHdr->FileHeader.NumberOfSections; i++){
char *name = (char *)pSectionHdr->Name;
if ((memcmp(name, ".text", 5) == 0) || (memcmp(name, "CODE", 4) == 0)){
*start = (unsigned char *)mi.lpBaseOfDll + pSectionHdr->VirtualAddress;
*len = pSectionHdr->SizeOfRawData;
break;
}
}
FreeLibrary(hDbgLib);
return (*start != NULL);
}
static void ReplaceRDTSC()
{
typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
HMODULE disasmlib;
unsigned char *opcodes;
t_disasm da;
MODULEINFO mi;
HMODULE psapilib;
GetModuleInformation_Type pGetModuleInformation;
DWORD dwSegSize;
DWORD oldprot;
if (!(disasmlib=LoadDisasm())) return;
// getting segment size
psapilib=(*pLoadLibraryA)("psapi.dll");
if(!psapilib) {
OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "psapi.dll", GetLastError());
return;
}
pGetModuleInformation=(GetModuleInformation_Type)(*pGetProcAddress)(psapilib, "GetModuleInformation");
(*pGetModuleInformation)(GetCurrentProcess(), GetModuleHandle(NULL), &mi, sizeof(mi));
dwSegSize = mi.SizeOfImage;
FreeLibrary(psapilib);
(*pPreparedisasm)();
opcodes = (unsigned char *)mi.lpBaseOfDll;
if(!GetTextSegment(NULL, &opcodes, &dwSegSize)) return;
unsigned int offset = 0;
BOOL cont = TRUE;
OutTraceDW("DXWND: opcode starting at addr=%x size=%x\n", opcodes, dwSegSize);
OutTraceDW("DXWND: ReplaceRDTSC starting at addr=%x size=%x\n", opcodes, dwSegSize);
while (cont) {
int cmdlen = 0;
__try{
@ -1036,13 +1094,7 @@ static void ReplaceRDTSC()
}
__except (EXCEPTION_EXECUTE_HANDLER){
OutTrace("exception at offset=%x\n", offset);
if(opcodes+offset < mi.EntryPoint) {
offset = (unsigned char *)mi.EntryPoint - (unsigned char *)mi.lpBaseOfDll;
OutTraceDW("DXWND: opcode resuming at addr=%x\n", opcodes+offset);
continue;
}
else
cont=FALSE;
cont=FALSE;
}
if (cmdlen==0) break;
// search for RDTSC opcode 0x0F31
@ -1075,7 +1127,7 @@ static void ReplaceRDTSC()
}
}
offset+=cmdlen;
if((offset+0x10) > (int)mi.lpBaseOfDll + dwSegSize) break; // skip last 16 bytes, just in case....
if((offset+0x10) > dwSegSize) break; // skip last 16 bytes, just in case....
}
return;
@ -1085,54 +1137,49 @@ static void ReplaceRDTSC()
static void ReplacePrivilegedOps()
{
typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD);
HMODULE disasmlib;
unsigned char *opcodes;
t_disasm da;
MODULEINFO mi;
HMODULE psapilib;
GetModuleInformation_Type pGetModuleInformation;
DWORD dwSegSize;
DWORD oldprot;
static BOOL bDoOnce=FALSE;
if(bDoOnce) return;
bDoOnce = TRUE;
if (!(disasmlib=LoadDisasm())) return;
// getting segment size
psapilib=(*pLoadLibraryA)("psapi.dll");
if(!psapilib) {
OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", "psapi.dll", GetLastError());
return;
}
pGetModuleInformation=(GetModuleInformation_Type)(*pGetProcAddress)(psapilib, "GetModuleInformation");
(*pGetModuleInformation)(GetCurrentProcess(), GetModuleHandle(NULL), &mi, sizeof(mi));
dwSegSize = mi.SizeOfImage;
FreeLibrary(psapilib);
(*pPreparedisasm)();
opcodes = (unsigned char *)mi.lpBaseOfDll;
if(!GetTextSegment(NULL, &opcodes, &dwSegSize)) return;
unsigned int offset = 0;
BOOL cont = TRUE;
OutTraceDW("DXWND: opcode starting at addr=%x size=%x\n", opcodes, dwSegSize);
OutTraceDW("DXWND: ReplacePrivilegedOps starting at addr=%x size=%x\n", opcodes, dwSegSize);
while (cont) {
int cmdlen = 0;
char *sOpcode;
BOOL bPriv;
__try{
cmdlen=(*pDisasm)(opcodes+offset,20,offset,&da,0,NULL,NULL);
//OutTrace("offset=%x opcode=%x\n", offset, *(opcodes+offset));
}
__except (EXCEPTION_EXECUTE_HANDLER){
OutTrace("exception at offset=%x\n", offset);
if(opcodes+offset < mi.EntryPoint) {
offset = (unsigned char *)mi.EntryPoint - (unsigned char *)mi.lpBaseOfDll;
OutTraceDW("DXWND: opcode resuming at addr=%x\n", opcodes+offset);
continue;
}
else
cont=FALSE;
cont=FALSE;
}
if (cmdlen==0) break;
// search for IN opcode 0xEC (IN AL, DX)
if(*(opcodes+offset) == 0xEC){
OutTraceDW("DXWND: IN opcode found at addr=%x\n", (opcodes+offset));
// search for following opcodes:
// 0xEC (IN AL, DX)
// 0x6D (INS DWORD PTR ES:[EDI],DX)
// 0x6E (OUTS DX,BYTE PTR DS:[ESI])
bPriv = FALSE;
switch(*(opcodes+offset)){
case 0x6D: sOpcode = "INS"; bPriv=TRUE; break;
case 0x6E: sOpcode = "OUTS"; bPriv=TRUE; break;
case 0xEC: sOpcode = "IN"; bPriv=TRUE; break;
}
if(bPriv){
OutTraceDW("DXWND: %s opcode found at addr=%x\n", sOpcode, (opcodes+offset));
if(!VirtualProtect((LPVOID)(opcodes+offset), 8, PAGE_READWRITE, &oldprot)) {
OutTrace("VirtualProtect ERROR: target=%x err=%d at %d\n", opcodes+offset, GetLastError(), __LINE__);
return; // error condition
@ -1150,7 +1197,7 @@ static void ReplacePrivilegedOps()
}
}
offset+=cmdlen;
if((offset+0x10) > (int)mi.lpBaseOfDll + dwSegSize) break; // skip last 16 bytes, just in case....
if((offset+0x10) > dwSegSize) break; // skip last 16 bytes, just in case....
}
return;
@ -1264,6 +1311,7 @@ void HookInit(TARGETMAP *target, HWND hwnd)
if(DoOnce){
DoOnce = FALSE;
InitModuleHooks();
dxw.VirtualDesktop.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
dxw.VirtualDesktop.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
dxw.VirtualDesktop.right = dxw.VirtualDesktop.left + GetSystemMetrics(SM_CXVIRTUALSCREEN);
@ -1508,6 +1556,7 @@ FARPROC RemapLibraryEx(LPCSTR proc, HMODULE hModule, HookEntryEx_Type *Hooks)
void HookLibraryEx(HMODULE hModule, HookEntryEx_Type *Hooks, char *DLLName)
{
HMODULE hDLL = NULL;
//OutTrace("HookLibrary: hModule=%x dll=%s\n", hModule, DLLName);
for(; Hooks->APIName; Hooks++){
void *remapped_addr;

View File

@ -9,18 +9,21 @@ extern void HookDirectSound(HMODULE);
extern void HookImeLib(HMODULE);
extern void HookKernel32(HMODULE);
extern void HookUser32(HMODULE);
extern void HookTrust(HMODULE);
extern void HookWinMM(HMODULE, char *libname);
extern void HookAdvApi32(HMODULE);
extern void HookImagehlp(HMODULE);
extern void HookSmackW32(HMODULE);
extern void HookAVIFil32(HMODULE);
extern void HookComDlg32(HMODULE);
extern void HookComCtl32(HMODULE);
extern void InitPosition(int, int, int, int, int, int);
//void InitWindowPos(int, int, int, int);
extern LPCSTR ProcToString(LPCSTR proc);
extern HRESULT HookDxDiag(REFIID, LPVOID FAR*);
extern FARPROC Remap_AVIFil32_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_ddraw_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_d3d7_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_d3d8_ProcAddress(LPCSTR, HMODULE);
@ -43,6 +46,8 @@ extern FARPROC Remap_Glide_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_Imagehlp_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_DInput_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_DInput8_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_ComCtl32_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_ComDlg32_ProcAddress(LPCSTR, HMODULE);
typedef enum {
HOOK_IAT_CANDIDATE = 0,

View File

@ -259,6 +259,42 @@ extern dxwCore dxw;
extern dxwSStack dxwss;
extern dxwWStack dxwws;
#if 0
typedef enum {
SYSLIBIDX_VERSION = 0,
SYSLIBIDX_DPLAYX,
SYSLIBIDX_WSOCK,
SYSLIBIDX_SHFOLDER,
SYSLIBIDX_SHELL32,
SYSLIBIDX_WS2_32,
SYSLIBIDX_TAPI32,
SYSLIBIDX_NETAPI32,
SYSLIBIDX_GLIDE,
SYSLIBIDX_GLIDE2X,
SYSLIBIDX_GLIDE3X,
}
enum_skipsyslibraries;
#ifdef SYSLIBNAMES_DEFINES
char *SkipNames[]={
"version",
"dplayx",
"wsock32",
"shfolder",
"shell32",
"ws2_32",
"tapi32",
"netapi32",
"glide",
"glide2x",
"glide3x",
NULL
}
#else
extern char *SkipNames[];
#endif
#endif
typedef enum {
SYSLIBIDX_KERNEL32 = 0,
SYSLIBIDX_USER32,
@ -275,29 +311,20 @@ typedef enum {
SYSLIBIDX_OPENGL,
SYSLIBIDX_MSVFW,
SYSLIBIDX_SMACK,
SYSLIBIDX_VERSION,
SYSLIBIDX_DPLAYX,
SYSLIBIDX_DSOUND,
SYSLIBIDX_WINMM,
SYSLIBIDX_IMM32,
SYSLIBIDX_WSOCK,
SYSLIBIDX_DINPUT,
SYSLIBIDX_DINPUT8,
SYSLIBIDX_SHFOLDER,
SYSLIBIDX_SHELL32,
SYSLIBIDX_WS2_32,
SYSLIBIDX_TAPI32,
SYSLIBIDX_NETAPI32,
SYSLIBIDX_WINTRUST,
SYSLIBIDX_DIRECT3D,
SYSLIBIDX_DIRECT3D700,
// SYSLIBIDX_DBGHELP,
SYSLIBIDX_IMAGEHLP,
// SYSLIBIDX_GLIDE,
// SYSLIBIDX_GLIDE2X,
// SYSLIBIDX_GLIDE3X,
SYSLIBIDX_COMDLG32,
SYSLIBIDX_MAX }
SYSLIBIDX_COMCTL32,
SYSLIBIDX_AVIFIL32,
SYSLIBIDX_MAX
}
enum_syslibraries;
#ifdef SYSLIBNAMES_DEFINES
@ -317,27 +344,18 @@ char *SysNames[]={
"opengl32",
"msvfw32",
"smackw32",
"version",
"dplayx",
"dsound",
"winmm",
"imm32",
"wsock32",
"dinput",
"dinput8",
"shfolder",
"shell32",
"ws2_32",
"tapi32",
"netapi32",
"wintrust",
"d3dim",
"d3dim700",
"imagehlp",
// "+glide",
// "+glide2x",
// "+glide3x",
"comdlg32",
"comctl32",
"AVIFIL32",
NULL
};
#else

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h"
#define VERSION "2.03.70"
#define VERSION "2.03.72"
#define DDTHREADLOCK 1
//#define LOCKTHREADS

Binary file not shown.

View File

@ -237,6 +237,10 @@
RelativePath=".\avifile.cpp"
>
</File>
<File
RelativePath=".\comctl32.cpp"
>
</File>
<File
RelativePath=".\comdlg32.cpp"
>

View File

@ -128,6 +128,9 @@ BOOL WINAPI extPolyPolygon(HDC, const POINT *, const INT *, int);
//typedef BOOL (WINAPI *DPtoLP_Type)(HDC, LPPOINT, int);
//DPtoLP_Type pDPtoLP = NULL;
//BOOL WINAPI extDPtoLP(HDC, LPPOINT, int);
typedef BOOL (WINAPI *PlayEnhMetaFile_Type)(HDC, HENHMETAFILE, const RECT *);
PlayEnhMetaFile_Type pPlayEnhMetaFile = NULL;
BOOL WINAPI extPlayEnhMetaFile(HDC, HENHMETAFILE, const RECT *);
static HookEntryEx_Type Hooks[]={
@ -168,6 +171,7 @@ static HookEntryEx_Type RemapHooks[]={
//{HOOK_IAT_CANDIDATE, 0, "GetRegionData", (FARPROC)NULL, (FARPROC *)&pGetRegionData, (FARPROC)extGetRegionData},
{HOOK_IAT_CANDIDATE, 0, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extGDICreateCompatibleDC}, /* to check */
//TODO {HOOK_IAT_CANDIDATE, 0, "DrawEscape", (FARPROC)DrawEscape, (FARPROC *)&pDrawEscape, (FARPROC)extDrawEscape}, /* to check */
{HOOK_IAT_CANDIDATE, 0, "GetDCOrgEx", (FARPROC)GetDCOrgEx, (FARPROC *)&pGetDCOrgEx, (FARPROC)extGetDCOrgEx},
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
@ -226,6 +230,9 @@ static HookEntryEx_Type SyscallHooks[]={
{HOOK_IAT_CANDIDATE, 0, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extGDIDeleteDC}, // for tracing only!
{HOOK_IAT_CANDIDATE, 0, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDCA, (FARPROC)extGDICreateDCA},
{HOOK_IAT_CANDIDATE, 0, "CreateDCW", (FARPROC)CreateDCW, (FARPROC *)&pGDICreateDCW, (FARPROC)extGDICreateDCW},
{HOOK_IAT_CANDIDATE, 0, "PlayEnhMetaFile", (FARPROC)PlayEnhMetaFile, (FARPROC *)&pPlayEnhMetaFile, (FARPROC)extPlayEnhMetaFile},
// CreateDCW .....
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
@ -3312,3 +3319,23 @@ BOOL WINAPI extDPtoLP(HDC hdc, LPPOINT lpPoints, int nCount)
return ret;
}
#endif
BOOL WINAPI extPlayEnhMetaFile(HDC hdc, HENHMETAFILE hemf, const RECT *lpRect)
{
BOOL ret;
MessageBox(0, "PlayEnhMetaFile", "dxwnd", MB_OK);
ret = pPlayEnhMetaFile(hdc, hemf, lpRect);
return ret;
}
BOOL WINAPI extGetDCOrgEx(HDC hdc, LPPOINT lpPoint)
{
BOOL ret;
ret = pGetDCOrgEx(hdc, lpPoint);
OutTraceDW("GetDCOrgEx: hdc=%x pt=(%d,%d)\n", hdc, lpPoint->x, lpPoint->y);
if(ret && dxw.IsFullScreen()){ // ?? and dxw.isDesktop() ???
dxw.UnmapClient(lpPoint);
OutTraceDW("GetDCOrgEx: fixed pt=(%d,%d)\n", lpPoint->x, lpPoint->y);
}
return ret;
}

View File

@ -1,6 +1,6 @@
#include "gl.h"
extern void HookOpenGLLibs(HMODULE, char *);
extern void HookOpenGL(HMODULE, char *);
typedef GLenum (WINAPI *glGetError_Type)();
typedef void (WINAPI *glViewport_Type)(GLint, GLint, GLsizei, GLsizei);

View File

@ -31,6 +31,7 @@ typedef void* (WINAPI *Direct3DCreate9_Type)(UINT);
typedef HRESULT (WINAPI *Direct3DCreate9Ex_Type)(UINT, IDirect3D9Ex **);
typedef HRESULT (WINAPI *CheckFullScreen_Type)(void);
typedef BOOL (WINAPI * DisableD3DSpy_Type)(void);
typedef void (WINAPI * D3DPERF_SetOptions_Type)(DWORD);
void* WINAPI extDirect3DCreate8(UINT);
void* WINAPI extDirect3DCreate9(UINT);
@ -41,12 +42,14 @@ void WINAPI voidDebugSetLevel(void);
void WINAPI voidDebugSetMute(void);
BOOL WINAPI voidDisableD3DSpy(void);
BOOL WINAPI extDisableD3DSpy(void);
void WINAPI extD3DPERF_SetOptions(DWORD);
Direct3DCreate8_Type pDirect3DCreate8 = 0;
Direct3DCreate9_Type pDirect3DCreate9 = 0;
Direct3DCreate9Ex_Type pDirect3DCreate9Ex = 0;
CheckFullScreen_Type pCheckFullScreen = 0;
DisableD3DSpy_Type pDisableD3DSpy = 0;
D3DPERF_SetOptions_Type pD3DPERF_SetOptions = 0;
// IDirect3D8/9 methods
@ -294,6 +297,7 @@ static HookEntryEx_Type d3d9Hooks[]={
{HOOK_HOT_CANDIDATE, 0, "Direct3DCreate9Ex", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9Ex, (FARPROC)extDirect3DCreate9Ex},
{HOOK_HOT_CANDIDATE, 0, "CheckFullScreen", (FARPROC)NULL, (FARPROC *)&pCheckFullScreen, (FARPROC)extCheckFullScreen},
{HOOK_HOT_CANDIDATE, 0, "DisableD3DSpy", (FARPROC)NULL, (FARPROC *)&pDisableD3DSpy, (FARPROC)extDisableD3DSpy},
{HOOK_HOT_CANDIDATE, 0, "D3DPERF_SetOptions", (FARPROC)NULL, (FARPROC *)&pD3DPERF_SetOptions, (FARPROC)extD3DPERF_SetOptions},
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
@ -1083,12 +1087,12 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi
}
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
if(res){
OutTraceD3D("switching to mode=%x\n", mode.Format);
OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format);
param[2] = mode.Format; // first attempt: current screen mode
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
}
if(res){
OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n");
OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res);
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
}
@ -1106,19 +1110,19 @@ static HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devi
}
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
if(res){
OutTraceD3D("switching to mode=%x\n", mode.Format);
OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format);
param[2] = mode.Format; // first attempt: current screen mode
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
}
if(res){
OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n");
OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res);
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
}
}
if(res){
OutTraceD3D("FAILED! %x\n", res);
OutTraceD3D("FAILED! err=%x\n", res);
return res;
}
OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd);
@ -1216,21 +1220,26 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp
param[8] = 1; //Windowed
param[12] = 0; //FullScreen_RefreshRateInHz;
param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval
// from MSDN:
// The display mode for when the device is set to fullscreen. See D3DDISPLAYMODEEX.
// If BehaviorFlags specifies D3DCREATE_ADAPTERGROUP_DEVICE, this parameter is an array.
// This parameter must be NULL for windowed mode.
pFullscreenDisplayMode = NULL;
}
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
if(res){
OutTraceD3D("switching to mode=%x\n", mode.Format);
OutTraceD3D("err=%x switching to mode=%x\n", res, mode.Format);
param[2] = mode.Format; // first attempt: current screen mode
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
}
if(res){
OutTraceD3D("switching to mode=D3DFMT_UNKNOWN\n");
OutTraceD3D("err=%x switching to mode=D3DFMT_UNKNOWN\n", res);
param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
}
if(res){
OutTraceD3D("FAILED! %x\n", res);
OutTraceD3D("FAILED! err=%x\n", res);
return res;
}
OutTraceD3D("SUCCESS!\n");
@ -2244,6 +2253,12 @@ HRESULT WINAPI extUnlockRect8(void *lpd3dtex, UINT Level)
HRESULT WINAPI extUnlockRect9(void *lpd3dtex, UINT Level)
{ return extUnlockRect(pUnlockRect9, lpd3dtex, Level, D3D9TextureHandling); }
void WINAPI extD3DPERF_SetOptions(DWORD dwOptions)
{
if(dwOptions) OutTraceD3D("circumvent D3DPERF_SetOptions\n");
pD3DPERF_SetOptions(0);
}
void RestoreD3DSurfaces(BOOL bFullScreen)
{
//DWORD param[64];

View File

@ -257,15 +257,18 @@ typedef HRESULT (WINAPI *TexLoad_Type)(void *, LPDIRECT3DTEXTURE);
typedef HRESULT (WINAPI *TexUnload_Type)(void *);
TexInitialize_Type pTInitialize = NULL;
TexGetHandle_Type pTGetHandle = NULL;
TexPaletteChanged_Type pTPaletteChanged = NULL;
TexLoad_Type pTLoad = NULL;
TexGetHandle_Type pTGetHandle1, pTGetHandle2;
TexPaletteChanged_Type pTPaletteChanged1, pTPaletteChanged2;
TexLoad_Type pTLoad1, pTLoad2;
TexUnload_Type pTUnload = NULL;
HRESULT WINAPI extTexInitialize(void *, LPDIRECT3DDEVICE, LPDIRECTDRAWSURFACE);
HRESULT WINAPI extTexGetHandle(void *, LPDIRECT3DDEVICE, LPD3DTEXTUREHANDLE);
HRESULT WINAPI extTexPaletteChanged(void *, DWORD, DWORD);
HRESULT WINAPI extTexLoad(void *, LPDIRECT3DTEXTURE);
HRESULT WINAPI extTexGetHandle1(void *, LPDIRECT3DDEVICE, LPD3DTEXTUREHANDLE);
HRESULT WINAPI extTexGetHandle2(void *, LPDIRECT3DDEVICE2, LPD3DTEXTUREHANDLE);
HRESULT WINAPI extTexPaletteChanged1(void *, DWORD, DWORD);
HRESULT WINAPI extTexPaletteChanged2(void *, DWORD, DWORD);
HRESULT WINAPI extTexLoad1(void *, LPDIRECT3DTEXTURE);
HRESULT WINAPI extTexLoad2(void *, LPDIRECT3DTEXTURE);
HRESULT WINAPI extTexUnload(void *);
extern char *ExplainDDError(DWORD);
@ -634,15 +637,15 @@ void HookTexture(LPVOID *lpTexture, int version)
switch(version){
case 1:
SetHook((void *)(**(DWORD **)lpTexture + 12), extTexInitialize, (void **)&pTInitialize, "Initialize(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 16), extTexGetHandle, (void **)&pTGetHandle, "GetHandle(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 20), extTexPaletteChanged, (void **)&pTPaletteChanged, "PaletteChanged(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 24), extTexLoad, (void **)&pTLoad, "Load(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 16), extTexGetHandle1, (void **)&pTGetHandle1, "GetHandle(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 20), extTexPaletteChanged1, (void **)&pTPaletteChanged1, "PaletteChanged(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 24), extTexLoad1, (void **)&pTLoad1, "Load(T1)");
SetHook((void *)(**(DWORD **)lpTexture + 28), extTexUnload, (void **)&pTUnload, "Unload(T1)");
break;
case 2:
SetHook((void *)(**(DWORD **)lpTexture + 12), extTexGetHandle, (void **)&pTGetHandle, "GetHandle(T2)");
SetHook((void *)(**(DWORD **)lpTexture + 16), extTexPaletteChanged, (void **)&pTPaletteChanged, "PaletteChanged(T2)");
SetHook((void *)(**(DWORD **)lpTexture + 20), extTexLoad, (void **)&pTLoad, "Load(T2)");
SetHook((void *)(**(DWORD **)lpTexture + 12), extTexGetHandle2, (void **)&pTGetHandle2, "GetHandle(T2)");
SetHook((void *)(**(DWORD **)lpTexture + 16), extTexPaletteChanged2, (void **)&pTPaletteChanged2, "PaletteChanged(T2)");
SetHook((void *)(**(DWORD **)lpTexture + 20), extTexLoad2, (void **)&pTLoad2, "Load(T2)");
break;
}
}
@ -1590,7 +1593,7 @@ HRESULT WINAPI extTexInitialize(void *t, LPDIRECT3DDEVICE lpd3dd, LPDIRECTDRAWSU
return (*pTInitialize)(t, lpd3dd, lpdds);
}
HRESULT WINAPI extTexGetHandle(void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHANDLE lpth)
HRESULT WINAPI extTexGetHandle(TexGetHandle_Type pTGetHandle, void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHANDLE lpth)
{
HRESULT ret;
OutTrace("Texture::GetHandle lpt=%x lpd3dd=%x lpth=%x\n", t, lpd3dd, lpth);
@ -1599,7 +1602,13 @@ HRESULT WINAPI extTexGetHandle(void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHAN
return ret;
}
HRESULT WINAPI extTexPaletteChanged(void *t, DWORD dw1, DWORD dw2)
HRESULT WINAPI extTexGetHandle1(void *t, LPDIRECT3DDEVICE lpd3dd, LPD3DTEXTUREHANDLE lpth)
{ return extTexGetHandle(pTGetHandle1, t, lpd3dd, lpth); }
HRESULT WINAPI extTexGetHandle2(void *t, LPDIRECT3DDEVICE2 lpd3dd, LPD3DTEXTUREHANDLE lpth)
{ return extTexGetHandle(pTGetHandle2, t, (LPDIRECT3DDEVICE)lpd3dd, lpth); }
HRESULT WINAPI extTexPaletteChanged(TexPaletteChanged_Type pTPaletteChanged, void *t, DWORD dw1, DWORD dw2)
{
HRESULT ret;
OutTrace("Texture::PaletteChanged lpt=%x dw1=%x dw2=%x\n", t, dw1, dw2);
@ -1608,7 +1617,12 @@ HRESULT WINAPI extTexPaletteChanged(void *t, DWORD dw1, DWORD dw2)
return ret;
}
HRESULT WINAPI extTexLoad(void *t, LPDIRECT3DTEXTURE lpt)
HRESULT WINAPI extTexPaletteChanged1(void *t, DWORD dw1, DWORD dw2)
{ return extTexPaletteChanged(pTPaletteChanged1, t, dw1, dw2); }
HRESULT WINAPI extTexPaletteChanged2(void *t, DWORD dw1, DWORD dw2)
{ return extTexPaletteChanged(pTPaletteChanged2, t, dw1, dw2); }
HRESULT WINAPI extTexLoad(TexLoad_Type pTLoad, void *t, LPDIRECT3DTEXTURE lpt)
{
HRESULT ret;
OutTrace("Texture::Load lpt=%x lpd3dt=%x\n", t, lpt);
@ -1617,6 +1631,11 @@ HRESULT WINAPI extTexLoad(void *t, LPDIRECT3DTEXTURE lpt)
return ret;
}
HRESULT WINAPI extTexLoad1(void *t, LPDIRECT3DTEXTURE lpt)
{ return extTexLoad(pTLoad1, t, lpt); }
HRESULT WINAPI extTexLoad2(void *t, LPDIRECT3DTEXTURE lpt)
{ return extTexLoad(pTLoad2, t, lpt); }
HRESULT WINAPI extTexUnload(void *t)
{
HRESULT ret;

View File

@ -23,12 +23,14 @@ static HookEntryEx_Type Hooks[]={
void HookImeLib(HMODULE module)
{
if(!(dxw.dwFlags2 & SUPPRESSIME)) return;
HookLibraryEx(module, Hooks, "IMM32.dll");
}
FARPROC Remap_ImeLib_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if(!(dxw.dwFlags2 & SUPPRESSIME)) return NULL;
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
return NULL;
}

View File

@ -591,6 +591,9 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
if((DWORD)proc & 0xFFFF0000){
FARPROC remap;
switch(idx){
case SYSLIBIDX_AVIFIL32:
if (remap=Remap_AVIFil32_ProcAddress(proc, hModule)) return remap;
break;
case SYSLIBIDX_DIRECTDRAW:
if (remap=Remap_ddraw_ProcAddress(proc, hModule)) return remap;
break;
@ -630,11 +633,6 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
case SYSLIBIDX_OPENGL:
if(dxw.Windowize) if (remap=Remap_gl_ProcAddress(proc, hModule)) return remap;
break;
// case SYSLIBIDX_GLIDE:
// case SYSLIBIDX_GLIDE2X:
// case SYSLIBIDX_GLIDE3X:
// if (remap=Remap_Glide_ProcAddress(proc, hModule)) return remap;
// break;
case SYSLIBIDX_MSVFW:
if (remap=Remap_vfw_ProcAddress(proc, hModule)) return remap;
break;
@ -662,6 +660,12 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
case SYSLIBIDX_DINPUT8:
if (remap=Remap_DInput8_ProcAddress(proc, hModule)) return remap;
break;
case SYSLIBIDX_COMCTL32:
if (remap=Remap_ComCtl32_ProcAddress(proc, hModule)) return remap;
break;
case SYSLIBIDX_COMDLG32:
if (remap=Remap_ComDlg32_ProcAddress(proc, hModule)) return remap;
break;
default:
break;
}

View File

@ -55,6 +55,7 @@ PROC Remap_wgl_ProcAddress(LPCSTR proc)
{
int i;
HookEntryEx_Type *Hook;
if(!(dxw.dwFlags2 & HOOKOPENGL)) return NULL;
for(i=0; Hooks[i].APIName; i++){
Hook=&Hooks[i];
if (!strcmp(proc,Hook->APIName)){
@ -97,22 +98,19 @@ void ForceHookOpenGL(HMODULE base) // to do .....
return;
}
void HookOpenGL(HMODULE module, char *customlib)
void HookOpenGL(HMODULE module, char *customlib)
{
HookLibraryEx(module, Hooks, customlib);
}
if(!(dxw.dwFlags2 & HOOKOPENGL)) return;
void HookOpenGLLibs(HMODULE module, char *customlib)
{
char *DefOpenGLModule="OpenGL32.dll";
if (!customlib) customlib=DefOpenGLModule;
OutTraceDW("HookOpenGLLibs module=%x lib=\"%s\" forced=%x\n", module, customlib, (dxw.dwFlags3 & FORCEHOOKOPENGL)?1:0);
OutTraceDW("HookOpenGL module=%x lib=\"%s\" forced=%x\n", module, customlib, (dxw.dwFlags3 & FORCEHOOKOPENGL)?1:0);
if (dxw.dwFlags3 & FORCEHOOKOPENGL)
ForceHookOpenGL(module);
else
HookOpenGL(module, customlib);
HookLibraryEx(module, Hooks, customlib);
return;
}

View File

@ -185,8 +185,8 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc)
POINT origin = {};
POINT mainwin = {};
GetDCOrgEx(hdc, &origin);
GetDCOrgEx((*pGDIGetDC)(dxw.GethWnd()), &mainwin);
(*pGetDCOrgEx)(hdc, &origin);
(*pGetDCOrgEx)((*pGDIGetDC)(dxw.GethWnd()), &mainwin);
origin.x -= mainwin.x;
origin.y -= mainwin.y;
OutTraceB("dxwSDC::GetPrimaryDC: origin=(%d,%d)\n", origin.x, origin.y);
@ -398,7 +398,7 @@ void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT origin)
//(*pClientToScreen)(dxw.GethWnd(), &upleft);
(*pClientToScreen)(CurrenthWnd, &upleft);
if(IsDebug){
OutTraceB("dxwSDC::setClippingRegion: upleft=(%d,%d)\n", upleft.x, upleft.y);
OutTraceB("dxwSDC::setClippingRegion: hwnd=%x upleft=(%d,%d)\n", CurrenthWnd, upleft.x, upleft.y);
}
OffsetRgn(clipRgn, -upleft.x, -upleft.y);
if(IsDebug){

View File

@ -30,6 +30,7 @@ static HookEntryEx_Type Hooks[]={
FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule)
{
FARPROC addr;
if(!(dxw.dwFlags7 & HOOKSMACKW32)) return NULL;
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
// NULL -> keep the original call address
return NULL;
@ -39,6 +40,7 @@ static char *libname = "smackw32.dll";
void HookSmackW32(HMODULE hModule)
{
if(!(dxw.dwFlags7 & HOOKSMACKW32)) return;
HookLibraryEx(hModule, Hooks, libname);
return;
}

View File

@ -49,6 +49,7 @@ typedef BOOL (WINAPI *DeleteDC_Type)(HDC);
typedef BOOL (WINAPI *ExtTextOutW_Type)(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *);
typedef BOOL (WINAPI *ExtTextOutA_Type)(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *);
typedef int (WINAPI *GetClipBox_Type)(HDC, LPRECT);
typedef BOOL (WINAPI *GetDCOrgEx_Type)(HDC, LPPOINT);
typedef int (WINAPI *GetRgnBox_Type)(HRGN, LPRECT);
typedef DWORD (WINAPI *GetRegionData_Type)(HRGN, DWORD, LPRGNDATA);
typedef int (WINAPI *GetDeviceCaps_Type)(HDC, int);
@ -285,6 +286,7 @@ DXWEXTERN ExtTextOutA_Type pExtTextOutA DXWINITIALIZED;
DXWEXTERN GetClipBox_Type pGDIGetClipBox DXWINITIALIZED;
DXWEXTERN GetRgnBox_Type pGetRgnBox DXWINITIALIZED;
DXWEXTERN GetRegionData_Type pGetRegionData DXWINITIALIZED;
DXWEXTERN GetDCOrgEx_Type pGetDCOrgEx DXWINITIALIZED;
DXWEXTERN GetDeviceCaps_Type pGDIGetDeviceCaps DXWINITIALIZED;
DXWEXTERN GetDeviceGammaRamp_Type pGDIGetDeviceGammaRamp DXWINITIALIZED;
DXWEXTERN GetSystemPaletteEntries_Type pGDIGetSystemPaletteEntries DXWINITIALIZED;
@ -513,6 +515,7 @@ extern BOOL WINAPI extExtTextOutW(HDC, int, int, UINT, const RECT *, LPCWSTR, UI
extern BOOL WINAPI extExtTextOutA(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *);
extern BOOL WINAPI extGDIDeleteDC(HDC);
extern int WINAPI extGetClipBox(HDC, LPRECT);
extern BOOL WINAPI extGetDCOrgEx(HDC, LPPOINT);
extern int WINAPI extGetRgnBox(HRGN, LPRECT);
extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA);
extern int WINAPI extGetDeviceCaps(HDC, int);

View File

@ -1,5 +0,0 @@
[window]
posx=50
posy=50
sizx=320
sizy=200

Binary file not shown.