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 version https://git-lfs.github.com/spec/v1
oid sha256:922db77cc7f8ea50e92a54d5579754a304cb92bdc3e422ac9d4f10d5e34f9227 oid sha256:b93d0975ec2a090848ed1953cd908344cb91d8e459ffebd7f63b231f23274473
size 657920 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 fix: no need to save configuration before running with fake registry
add: icons to notify for non-empty registry and notes tabs add: icons to notify for non-empty registry and notes tabs
fix: hooked ddrawex.dll DirectDrawEx methods - fixes "Whiteout", what else? 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) void HookAdvApi32(HMODULE module)
{ {
if( (dxw.dwFlags3 & EMULATEREGISTRY) ||
(dxw.dwFlags4 & OVERRIDEREGISTRY) ||
(dxw.dwFlags6 & (WOW32REGISTRY|WOW64REGISTRY)) ||
(dxw.dwTFlags & OUTREGISTRY))
HookLibraryEx(module, Hooks, "ADVAPI32.dll"); HookLibraryEx(module, Hooks, "ADVAPI32.dll");
} }
FARPROC Remap_AdvApi32_ProcAddress(LPCSTR proc, HMODULE hModule) FARPROC Remap_AdvApi32_ProcAddress(LPCSTR proc, HMODULE hModule)
{ {
FARPROC addr; 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; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
return NULL; 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__); if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__);
res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx); res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx);
break; 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: default:
break; break;
} }

View File

@ -15,6 +15,18 @@
#define EMULATEZBUFFERATTACH FALSE #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; extern BOOL IsChangeDisplaySettingsHotPatched;
DWORD dwBackBufferCaps; DWORD dwBackBufferCaps;
extern void TextureHandling(LPDIRECTDRAWSURFACE, int); extern void TextureHandling(LPDIRECTDRAWSURFACE, int);
@ -42,7 +54,9 @@ ULONG WINAPI extReleaseD1(LPDIRECTDRAW);
ULONG WINAPI extReleaseD2(LPDIRECTDRAW); ULONG WINAPI extReleaseD2(LPDIRECTDRAW);
ULONG WINAPI extReleaseD4(LPDIRECTDRAW); ULONG WINAPI extReleaseD4(LPDIRECTDRAW);
ULONG WINAPI extReleaseD7(LPDIRECTDRAW); ULONG WINAPI extReleaseD7(LPDIRECTDRAW);
/*** IDirectDraw methods ***/ /*** IDirectDraw methods ***/
HRESULT WINAPI extCompact(LPDIRECTDRAW); // unimplemented method ???
HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*);
HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*);
HRESULT WINAPI extCreateClipper4(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) int HookDirectDraw(HMODULE module, int version)
{ {
if(dxw.dwTargetDDVersion == HOOKDDRAWNONE) return 0;
if ((dxw.dwFlags2 & SETCOMPATIBILITY) || if ((dxw.dwFlags2 & SETCOMPATIBILITY) ||
(dxw.dwFlags6 & DISABLEMAXWINMODE)){ (dxw.dwFlags6 & DISABLEMAXWINMODE)){
static BOOL AlreadyDone = FALSE; static BOOL AlreadyDone = FALSE;
@ -842,6 +858,7 @@ CreatePalette_Type pCreatePaletteMethod(int dxversion)
case 4: pCreatePalette = pCreatePalette4; break; case 4: pCreatePalette = pCreatePalette4; break;
case 7: pCreatePalette = pCreatePalette7; break; case 7: pCreatePalette = pCreatePalette7; break;
} }
CHECKPTR(pCreatePalette, "CreatePalette");
return pCreatePalette; return pCreatePalette;
} }
@ -854,6 +871,7 @@ SetPalette_Type pSetPaletteMethod(int dxversion)
case 4: pSetPalette=pSetPalette4; break; case 4: pSetPalette=pSetPalette4; break;
case 7: pSetPalette=pSetPalette7; break; case 7: pSetPalette=pSetPalette7; break;
} }
CHECKPTR(pSetPalette, "SetPalette");
return pSetPalette; return pSetPalette;
} }
@ -867,6 +885,7 @@ ReleaseS_Type pReleaseSMethod(int dxversion)
case 4: pReleaseS=pReleaseS4; break; case 4: pReleaseS=pReleaseS4; break;
case 7: pReleaseS=pReleaseS7; break; case 7: pReleaseS=pReleaseS7; break;
} }
CHECKPTR(pReleaseS, "Surface::Release");
return pReleaseS; return pReleaseS;
} }
@ -880,6 +899,7 @@ ReleaseDC_Type pReleaseDCMethod()
case 4: pReleaseDC=pReleaseDC4; break; case 4: pReleaseDC=pReleaseDC4; break;
case 7: pReleaseDC=pReleaseDC7; break; case 7: pReleaseDC=pReleaseDC7; break;
} }
CHECKPTR(pReleaseDC, "ReleaseDC");
return pReleaseDC; return pReleaseDC;
} }
@ -893,6 +913,7 @@ SetClipper_Type pSetClipperMethod(int dxversion)
case 4: pSetClipper=pSetClipper4; break; case 4: pSetClipper=pSetClipper4; break;
case 7: pSetClipper=pSetClipper7; break; case 7: pSetClipper=pSetClipper7; break;
} }
CHECKPTR(pSetClipper, "SetClipper");
return pSetClipper; return pSetClipper;
} }
@ -906,6 +927,7 @@ Blt_Type pBltMethod()
case 4: pBlt=pBlt4; break; case 4: pBlt=pBlt4; break;
case 7: pBlt=pBlt7; break; case 7: pBlt=pBlt7; break;
} }
CHECKPTR(pBlt, "Blt");
return pBlt; return pBlt;
} }
@ -919,6 +941,7 @@ GetDC_Type pGetDCMethod()
case 4: pGetDC=pGetDC4; break; case 4: pGetDC=pGetDC4; break;
case 7: pGetDC=pGetDC7; break; case 7: pGetDC=pGetDC7; break;
} }
CHECKPTR(pGetDC, "GetDC");
return pGetDC; return pGetDC;
} }
@ -932,6 +955,7 @@ Unlock4_Type pUnlockMethod(int dxversion)
case 4: pUnlock=(Unlock4_Type)pUnlock4; break; case 4: pUnlock=(Unlock4_Type)pUnlock4; break;
case 7: pUnlock=(Unlock4_Type)pUnlock7; break; case 7: pUnlock=(Unlock4_Type)pUnlock7; break;
} }
CHECKPTR(pUnlock, "Unlock");
return pUnlock; return pUnlock;
} }
@ -945,6 +969,7 @@ Lock_Type pLockMethod(int dxversion)
case 4: pLock=pLock4; break; case 4: pLock=pLock4; break;
case 7: pLock=pLock7; break; case 7: pLock=pLock7; break;
} }
CHECKPTR(pLock, "Lock");
return pLock; return pLock;
} }
@ -958,6 +983,7 @@ CreateSurface2_Type pCreateSurfaceMethod(int dxversion)
case 4: pCreateSurface=(CreateSurface2_Type)pCreateSurface4; break; case 4: pCreateSurface=(CreateSurface2_Type)pCreateSurface4; break;
case 7: pCreateSurface=(CreateSurface2_Type)pCreateSurface7; break; case 7: pCreateSurface=(CreateSurface2_Type)pCreateSurface7; break;
} }
CHECKPTR(pCreateSurface, "CreateSurface");
return pCreateSurface; return pCreateSurface;
} }
@ -972,6 +998,7 @@ GetSurfaceDesc2_Type pGetSurfaceDescMethod()
case 4: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc4; break; case 4: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc4; break;
case 7: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc7; break; case 7: pGetSurfaceDesc=(GetSurfaceDesc2_Type)pGetSurfaceDesc7; break;
} }
CHECKPTR(pGetSurfaceDesc, "GetSurfaceDesc");
return pGetSurfaceDesc; return pGetSurfaceDesc;
} }
@ -985,6 +1012,7 @@ GetGDISurface_Type pGetGDISurfaceMethod(int dxversion)
case 4: pGetGDISurface = pGetGDISurface4; break; case 4: pGetGDISurface = pGetGDISurface4; break;
case 7: pGetGDISurface = pGetGDISurface7; break; case 7: pGetGDISurface = pGetGDISurface7; break;
} }
CHECKPTR(pGetGDISurface, "GetGDISurface");
return pGetGDISurface; return pGetGDISurface;
} }
@ -1091,6 +1119,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion)
OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n",
*lplpdd, dxversion, GetCurrentThreadId()); *lplpdd, dxversion, GetCurrentThreadId());
SetHook((void *)(**(DWORD **)lplpdd + 12), extCompact, (void **)&pCompact, "Compact");
switch(dxversion) { switch(dxversion) {
case 1: case 1:
SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)"); 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 // v2.2.84: avoid the extra referenced in non windowed mode since it causes the window shift reported by gsky916
// for Wind Fantasy SP. // for Wind Fantasy SP.
// v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2 // 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; 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) 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); } { 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) LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{ {
// BltFast is supported just on screen surfaces, so it has to be replaced // 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]; char sRect[81];
if (lpsrcrect) sprintf(sRect, "(%d,%d)-(%d,%d)", lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom); if (lpsrcrect) sprintf(sRect, "(%d,%d)-(%d,%d)", lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom);
else strcpy(sRect, "(NULL)"); else strcpy(sRect, "(NULL)");
OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) srcrect=%s\n", OutTrace("BltFast(%d): 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); 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 .... // 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_WAIT) flags = DDBLT_WAIT;
if(dwtrans & DDBLTFAST_DESTCOLORKEY) flags |= DDBLT_KEYDEST; if(dwtrans & DDBLTFAST_DESTCOLORKEY) flags |= DDBLT_KEYDEST;
if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC; if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC;
//if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_COLORFILL;
if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){ if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){
return sBlt(dxversion, pBlt, "BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE); 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) 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) 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) 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) 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) 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) 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]; char sRect[81];
if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom);
else strcpy(sRect, "(NULL)"); else strcpy(sRect, "(NULL)");
OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", OutTrace("Lock(%d): lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n",
lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect);
} }
res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent);
@ -4202,8 +4243,8 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR
char sRect[81]; char sRect[81];
if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom);
else strcpy(sRect, "(NULL)"); else strcpy(sRect, "(NULL)");
OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", OutTrace("Lock(%d): lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n",
lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect);
} }
switch(dxversion){ switch(dxversion){
@ -5806,3 +5847,9 @@ HRESULT WINAPI extAddOverlayDirtyRect4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect)
{ return extAddOverlayDirtyRect(4, pAddOverlayDirtyRect4, lpdds, lpRect); } { return extAddOverlayDirtyRect(4, pAddOverlayDirtyRect4, lpdds, lpRect); }
HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect)
{ return extAddOverlayDirtyRect(7, pAddOverlayDirtyRect7, lpdds, 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; HINSTANCE hinst;
LPDIRECTINPUT lpdi; LPDIRECTINPUT lpdi;
if(!(dxw.dwFlags1 & HOOKDI)) return;
HookLibraryEx(module, diHooks, "dinput.dll"); HookLibraryEx(module, diHooks, "dinput.dll");
if(!pDirectInputCreateA && !pDirectInputCreateW && !pDirectInputCreateExA){ if(!pDirectInputCreateA && !pDirectInputCreateW && !pDirectInputCreateExA){
hinst = LoadLibrary("dinput.dll"); hinst = LoadLibrary("dinput.dll");
@ -176,6 +178,8 @@ void HookDirectInput8(HMODULE module)
HINSTANCE hinst; HINSTANCE hinst;
LPDIRECTINPUT lpdi; LPDIRECTINPUT lpdi;
if(!(dxw.dwFlags1 & HOOKDI8)) return;
HookLibraryEx(module, di8Hooks, "dinput8.dll"); HookLibraryEx(module, di8Hooks, "dinput8.dll");
if(!pDirectInput8Create){ if(!pDirectInput8Create){
hinst = LoadLibrary("dinput8.dll"); hinst = LoadLibrary("dinput8.dll");

View File

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

View File

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

View File

@ -9,18 +9,21 @@ extern void HookDirectSound(HMODULE);
extern void HookImeLib(HMODULE); extern void HookImeLib(HMODULE);
extern void HookKernel32(HMODULE); extern void HookKernel32(HMODULE);
extern void HookUser32(HMODULE); extern void HookUser32(HMODULE);
extern void HookTrust(HMODULE);
extern void HookWinMM(HMODULE, char *libname); extern void HookWinMM(HMODULE, char *libname);
extern void HookAdvApi32(HMODULE); extern void HookAdvApi32(HMODULE);
extern void HookImagehlp(HMODULE); extern void HookImagehlp(HMODULE);
extern void HookSmackW32(HMODULE); extern void HookSmackW32(HMODULE);
extern void HookAVIFil32(HMODULE); extern void HookAVIFil32(HMODULE);
extern void HookComDlg32(HMODULE); extern void HookComDlg32(HMODULE);
extern void HookComCtl32(HMODULE);
extern void InitPosition(int, int, int, int, int, int); extern void InitPosition(int, int, int, int, int, int);
//void InitWindowPos(int, int, int, int); //void InitWindowPos(int, int, int, int);
extern LPCSTR ProcToString(LPCSTR proc); extern LPCSTR ProcToString(LPCSTR proc);
extern HRESULT HookDxDiag(REFIID, LPVOID FAR*); extern HRESULT HookDxDiag(REFIID, LPVOID FAR*);
extern FARPROC Remap_AVIFil32_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_ddraw_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_ddraw_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_d3d7_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_d3d7_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_d3d8_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_Imagehlp_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_DInput_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_DInput_ProcAddress(LPCSTR, HMODULE);
extern FARPROC Remap_DInput8_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 { typedef enum {
HOOK_IAT_CANDIDATE = 0, HOOK_IAT_CANDIDATE = 0,

View File

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

View File

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

Binary file not shown.

View File

@ -237,6 +237,10 @@
RelativePath=".\avifile.cpp" RelativePath=".\avifile.cpp"
> >
</File> </File>
<File
RelativePath=".\comctl32.cpp"
>
</File>
<File <File
RelativePath=".\comdlg32.cpp" 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); //typedef BOOL (WINAPI *DPtoLP_Type)(HDC, LPPOINT, int);
//DPtoLP_Type pDPtoLP = NULL; //DPtoLP_Type pDPtoLP = NULL;
//BOOL WINAPI extDPtoLP(HDC, LPPOINT, int); //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[]={ 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, "GetRegionData", (FARPROC)NULL, (FARPROC *)&pGetRegionData, (FARPROC)extGetRegionData},
{HOOK_IAT_CANDIDATE, 0, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extGDICreateCompatibleDC}, /* to check */ {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 */ //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 {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, "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, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDCA, (FARPROC)extGDICreateDCA},
{HOOK_IAT_CANDIDATE, 0, "CreateDCW", (FARPROC)CreateDCW, (FARPROC *)&pGDICreateDCW, (FARPROC)extGDICreateDCW}, {HOOK_IAT_CANDIDATE, 0, "CreateDCW", (FARPROC)CreateDCW, (FARPROC *)&pGDICreateDCW, (FARPROC)extGDICreateDCW},
{HOOK_IAT_CANDIDATE, 0, "PlayEnhMetaFile", (FARPROC)PlayEnhMetaFile, (FARPROC *)&pPlayEnhMetaFile, (FARPROC)extPlayEnhMetaFile},
// CreateDCW ..... // CreateDCW .....
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
}; };
@ -3312,3 +3319,23 @@ BOOL WINAPI extDPtoLP(HDC hdc, LPPOINT lpPoints, int nCount)
return ret; return ret;
} }
#endif #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" #include "gl.h"
extern void HookOpenGLLibs(HMODULE, char *); extern void HookOpenGL(HMODULE, char *);
typedef GLenum (WINAPI *glGetError_Type)(); typedef GLenum (WINAPI *glGetError_Type)();
typedef void (WINAPI *glViewport_Type)(GLint, GLint, GLsizei, GLsizei); 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 *Direct3DCreate9Ex_Type)(UINT, IDirect3D9Ex **);
typedef HRESULT (WINAPI *CheckFullScreen_Type)(void); typedef HRESULT (WINAPI *CheckFullScreen_Type)(void);
typedef BOOL (WINAPI * DisableD3DSpy_Type)(void); typedef BOOL (WINAPI * DisableD3DSpy_Type)(void);
typedef void (WINAPI * D3DPERF_SetOptions_Type)(DWORD);
void* WINAPI extDirect3DCreate8(UINT); void* WINAPI extDirect3DCreate8(UINT);
void* WINAPI extDirect3DCreate9(UINT); void* WINAPI extDirect3DCreate9(UINT);
@ -41,12 +42,14 @@ void WINAPI voidDebugSetLevel(void);
void WINAPI voidDebugSetMute(void); void WINAPI voidDebugSetMute(void);
BOOL WINAPI voidDisableD3DSpy(void); BOOL WINAPI voidDisableD3DSpy(void);
BOOL WINAPI extDisableD3DSpy(void); BOOL WINAPI extDisableD3DSpy(void);
void WINAPI extD3DPERF_SetOptions(DWORD);
Direct3DCreate8_Type pDirect3DCreate8 = 0; Direct3DCreate8_Type pDirect3DCreate8 = 0;
Direct3DCreate9_Type pDirect3DCreate9 = 0; Direct3DCreate9_Type pDirect3DCreate9 = 0;
Direct3DCreate9Ex_Type pDirect3DCreate9Ex = 0; Direct3DCreate9Ex_Type pDirect3DCreate9Ex = 0;
CheckFullScreen_Type pCheckFullScreen = 0; CheckFullScreen_Type pCheckFullScreen = 0;
DisableD3DSpy_Type pDisableD3DSpy = 0; DisableD3DSpy_Type pDisableD3DSpy = 0;
D3DPERF_SetOptions_Type pD3DPERF_SetOptions = 0;
// IDirect3D8/9 methods // 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, "Direct3DCreate9Ex", (FARPROC)NULL, (FARPROC *)&pDirect3DCreate9Ex, (FARPROC)extDirect3DCreate9Ex},
{HOOK_HOT_CANDIDATE, 0, "CheckFullScreen", (FARPROC)NULL, (FARPROC *)&pCheckFullScreen, (FARPROC)extCheckFullScreen}, {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, "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 {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); res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
if(res){ 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 param[2] = mode.Format; // first attempt: current screen mode
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
} }
if(res){ 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 param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); 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); res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
if(res){ 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 param[2] = mode.Format; // first attempt: current screen mode
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
} }
if(res){ 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 param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd);
} }
} }
if(res){ if(res){
OutTraceD3D("FAILED! %x\n", res); OutTraceD3D("FAILED! err=%x\n", res);
return res; return res;
} }
OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd); OutTraceD3D("SUCCESS! device=%x\n", *ppd3dd);
@ -1216,21 +1220,26 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp
param[8] = 1; //Windowed param[8] = 1; //Windowed
param[12] = 0; //FullScreen_RefreshRateInHz; param[12] = 0; //FullScreen_RefreshRateInHz;
param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval 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); res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
if(res){ 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 param[2] = mode.Format; // first attempt: current screen mode
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
} }
if(res){ 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 param[2] = D3DFMT_UNKNOWN; // second attempt: unknown, good for windowed mode
res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd);
} }
if(res){ if(res){
OutTraceD3D("FAILED! %x\n", res); OutTraceD3D("FAILED! err=%x\n", res);
return res; return res;
} }
OutTraceD3D("SUCCESS!\n"); OutTraceD3D("SUCCESS!\n");
@ -2244,6 +2253,12 @@ HRESULT WINAPI extUnlockRect8(void *lpd3dtex, UINT Level)
HRESULT WINAPI extUnlockRect9(void *lpd3dtex, UINT Level) HRESULT WINAPI extUnlockRect9(void *lpd3dtex, UINT Level)
{ return extUnlockRect(pUnlockRect9, lpd3dtex, Level, D3D9TextureHandling); } { 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) void RestoreD3DSurfaces(BOOL bFullScreen)
{ {
//DWORD param[64]; //DWORD param[64];

View File

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

View File

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

View File

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

View File

@ -55,6 +55,7 @@ PROC Remap_wgl_ProcAddress(LPCSTR proc)
{ {
int i; int i;
HookEntryEx_Type *Hook; HookEntryEx_Type *Hook;
if(!(dxw.dwFlags2 & HOOKOPENGL)) return NULL;
for(i=0; Hooks[i].APIName; i++){ for(i=0; Hooks[i].APIName; i++){
Hook=&Hooks[i]; Hook=&Hooks[i];
if (!strcmp(proc,Hook->APIName)){ if (!strcmp(proc,Hook->APIName)){
@ -97,22 +98,19 @@ void ForceHookOpenGL(HMODULE base) // to do .....
return; 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"; char *DefOpenGLModule="OpenGL32.dll";
if (!customlib) customlib=DefOpenGLModule; 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) if (dxw.dwFlags3 & FORCEHOOKOPENGL)
ForceHookOpenGL(module); ForceHookOpenGL(module);
else else
HookOpenGL(module, customlib); HookLibraryEx(module, Hooks, customlib);
return; return;
} }

View File

@ -185,8 +185,8 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc)
POINT origin = {}; POINT origin = {};
POINT mainwin = {}; POINT mainwin = {};
GetDCOrgEx(hdc, &origin); (*pGetDCOrgEx)(hdc, &origin);
GetDCOrgEx((*pGDIGetDC)(dxw.GethWnd()), &mainwin); (*pGetDCOrgEx)((*pGDIGetDC)(dxw.GethWnd()), &mainwin);
origin.x -= mainwin.x; origin.x -= mainwin.x;
origin.y -= mainwin.y; origin.y -= mainwin.y;
OutTraceB("dxwSDC::GetPrimaryDC: origin=(%d,%d)\n", origin.x, origin.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)(dxw.GethWnd(), &upleft);
(*pClientToScreen)(CurrenthWnd, &upleft); (*pClientToScreen)(CurrenthWnd, &upleft);
if(IsDebug){ 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); OffsetRgn(clipRgn, -upleft.x, -upleft.y);
if(IsDebug){ if(IsDebug){

View File

@ -30,6 +30,7 @@ static HookEntryEx_Type Hooks[]={
FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule) FARPROC Remap_smack_ProcAddress(LPCSTR proc, HMODULE hModule)
{ {
FARPROC addr; FARPROC addr;
if(!(dxw.dwFlags7 & HOOKSMACKW32)) return NULL;
if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr;
// NULL -> keep the original call address // NULL -> keep the original call address
return NULL; return NULL;
@ -39,6 +40,7 @@ static char *libname = "smackw32.dll";
void HookSmackW32(HMODULE hModule) void HookSmackW32(HMODULE hModule)
{ {
if(!(dxw.dwFlags7 & HOOKSMACKW32)) return;
HookLibraryEx(hModule, Hooks, libname); HookLibraryEx(hModule, Hooks, libname);
return; 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 *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 BOOL (WINAPI *ExtTextOutA_Type)(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *);
typedef int (WINAPI *GetClipBox_Type)(HDC, LPRECT); typedef int (WINAPI *GetClipBox_Type)(HDC, LPRECT);
typedef BOOL (WINAPI *GetDCOrgEx_Type)(HDC, LPPOINT);
typedef int (WINAPI *GetRgnBox_Type)(HRGN, LPRECT); typedef int (WINAPI *GetRgnBox_Type)(HRGN, LPRECT);
typedef DWORD (WINAPI *GetRegionData_Type)(HRGN, DWORD, LPRGNDATA); typedef DWORD (WINAPI *GetRegionData_Type)(HRGN, DWORD, LPRGNDATA);
typedef int (WINAPI *GetDeviceCaps_Type)(HDC, int); typedef int (WINAPI *GetDeviceCaps_Type)(HDC, int);
@ -285,6 +286,7 @@ DXWEXTERN ExtTextOutA_Type pExtTextOutA DXWINITIALIZED;
DXWEXTERN GetClipBox_Type pGDIGetClipBox DXWINITIALIZED; DXWEXTERN GetClipBox_Type pGDIGetClipBox DXWINITIALIZED;
DXWEXTERN GetRgnBox_Type pGetRgnBox DXWINITIALIZED; DXWEXTERN GetRgnBox_Type pGetRgnBox DXWINITIALIZED;
DXWEXTERN GetRegionData_Type pGetRegionData DXWINITIALIZED; DXWEXTERN GetRegionData_Type pGetRegionData DXWINITIALIZED;
DXWEXTERN GetDCOrgEx_Type pGetDCOrgEx DXWINITIALIZED;
DXWEXTERN GetDeviceCaps_Type pGDIGetDeviceCaps DXWINITIALIZED; DXWEXTERN GetDeviceCaps_Type pGDIGetDeviceCaps DXWINITIALIZED;
DXWEXTERN GetDeviceGammaRamp_Type pGDIGetDeviceGammaRamp DXWINITIALIZED; DXWEXTERN GetDeviceGammaRamp_Type pGDIGetDeviceGammaRamp DXWINITIALIZED;
DXWEXTERN GetSystemPaletteEntries_Type pGDIGetSystemPaletteEntries 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 extExtTextOutA(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *);
extern BOOL WINAPI extGDIDeleteDC(HDC); extern BOOL WINAPI extGDIDeleteDC(HDC);
extern int WINAPI extGetClipBox(HDC, LPRECT); extern int WINAPI extGetClipBox(HDC, LPRECT);
extern BOOL WINAPI extGetDCOrgEx(HDC, LPPOINT);
extern int WINAPI extGetRgnBox(HRGN, LPRECT); extern int WINAPI extGetRgnBox(HRGN, LPRECT);
extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA); extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA);
extern int WINAPI extGetDeviceCaps(HDC, int); 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.