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

v2_03_18_src

Former-commit-id: 7c52867ad6c452042b2ec3734cc315859698b95c
This commit is contained in:
gho tik 2015-04-18 12:40:38 -04:00 committed by Refael ACkermann
parent 890f146ec6
commit 27a7d10a25
29 changed files with 389 additions and 108 deletions

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f437c5d0f51575ce6fd0d3ffcc160d7c5f84f86db47b3af6847427a28466cde4
size 577024
oid sha256:2e7c1adfbd594089e1c8eb7040b06037ae1f239498a09399e82ef4e52023c080
size 576512

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4637fee61c70d8ffa927a88878191e4174bac16129dd30242892a5ad07dcbc6b
oid sha256:a512e18dc9a004e3cb5f8f08eca94a0b06c8e5d935689eac885ba75f5636cde1
size 538624

View File

@ -0,0 +1,29 @@
[target]
title0=Axis & Allies Iron Blitz Edition
path0=D:\Games\Axis & Allies Iron Blitz Edition\Axis & Allies\AxisAllies.exe
launchpath0=
module0=
opengllib0=
notes0=
ver0=0
coord0=0
flag0=-2013265822
flagg0=1207959552
flagh0=20
flagi0=138412037
flagj0=128
tflag0=6402
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1

View File

@ -0,0 +1,29 @@
[target]
title0=Crusaders of Might and Magic (GOG)
path0=D:\Games\Crusaders of Might and Magic (GOG)\crusaders.exe
launchpath0=
module0=gfx_d3d gfx_sw
opengllib0=
notes0=the ddraw.dll hooker in the game folder must be deleted or renamed \nto allow DxWnd to play the game.
ver0=0
coord0=0
flag0=-1467989966
flagg0=1744830472
flagh0=20
flagi0=138412036
flagj0=4224
tflag0=-2147477229
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1

View File

@ -0,0 +1,29 @@
[target]
title0=Crusaders of Might and Magic Demo
path0=D:\Games\Crusaders of Might and Magic Demo\crusaders demo.exe
launchpath0=
module0=gfx_d3d gfx_sw
opengllib0=
notes0=
ver0=0
coord0=0
flag0=-1467989966
flagg0=1207959560
flagh0=20
flagi0=138412036
flagj0=4224
tflag0=6418
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1

View File

@ -5,7 +5,7 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=679493666
flag0=679493664
flagg0=1207959552
flagh0=65556
flagi0=69206020
@ -25,5 +25,3 @@ initts0=0
winver0=0
maxres0=-1
launchpath0=
notes0=
flagj0=128

View File

@ -6,11 +6,11 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=671105312
flag0=671105058
flagg0=1207959568
flagh0=20
flagi0=4194308
tflag0=64
tflag0=0
initx0=0
inity0=0
minx0=0
@ -25,3 +25,5 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
notes0=
flagj0=128

View File

@ -5,10 +5,10 @@ module0=
opengllib0=
ver0=0
coord0=0
flag0=134217760
flag0=134217762
flagg0=1207959552
flagh0=20
flagi0=4
flagi0=4194308
tflag0=6146
initx0=0
inity0=0
@ -24,3 +24,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
launchpath0=
notes0=
flagj0=128

View File

@ -8,7 +8,7 @@ coord0=0
flag0=411058208
flagg0=1207959808
flagh0=20
flagi0=4
flagi0=2097156
tflag0=0
initx0=0
inity0=0
@ -24,3 +24,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
launchpath0=
notes0=
flagj0=8388736

View File

@ -0,0 +1,29 @@
[target]
title0=Galapagos
path0=D:\Games\Galapagos\GALA.EXE
launchpath0=
module0=
opengllib0=
notes0=
ver0=7
coord0=0
flag0=746602528
flagg0=1207959552
flagh0=16
flagi0=138412036
flagj0=142610600
tflag0=6402
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1

View File

@ -6,10 +6,10 @@ opengllib0=
ver0=0
coord0=0
flag0=134217766
flagg0=134217728
flagg0=1207959552
flagh0=20
flagi0=4
tflag0=64
flagi0=4194308
tflag0=0
initx0=0
inity0=0
minx0=0
@ -24,3 +24,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
launchpath0=
notes0=
flagj0=128

View File

@ -6,10 +6,10 @@ opengllib0=
ver0=0
coord0=0
flag0=134217766
flagg0=134217728
flagg0=1207959552
flagh0=20
flagi0=4
tflag0=64
flagi0=4194308
tflag0=0
initx0=0
inity0=0
minx0=0
@ -24,3 +24,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
launchpath0=
notes0=
flagj0=128

View File

@ -0,0 +1,29 @@
[target]
title0=The Mummy
path0=D:\Games\The Mummy\MummyPC.exe
launchpath0=
module0=
opengllib0=
notes0=
ver0=0
coord0=0
flag0=134217762
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
tflag0=0
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1

View File

@ -0,0 +1,29 @@
[target]
title0=Ultimate Soccer Manager 98
path0=D:\Games\USM98\USM98.EXE
launchpath0=
module0=
opengllib0=
notes0=
ver0=0
coord0=0
flag0=134217760
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=266368
tflag0=-2147477245
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1

View File

@ -1,5 +1,5 @@
[window]
posx=1439
posy=619
posx=1496
posy=246
sizx=320
sizy=200

View File

@ -776,4 +776,12 @@ v2.03.16
fix: MapWindowPoints hook - added coordinate scaling (fixes "NBA Live 99" components size and position)
fix: using "Suppress D3D8/9 reset" sets the backbuffer area as large as the whole desktop to avoid clipping
add: added "Unlock Z-order" flag to avoid window to stay locked on top of z-order (useful for "NBA Live 99")
add: added "EA Sprots hack" flag to suppress some interfering hooks set by EA games internally (useful for "NBA Live 99")
add: added "EA Sprots hack" flag to suppress some interfering hooks set by EA games internally (useful for "NBA Live 99")
v2.03.18:
fix: eliminated direct output to primary surface, causing more troubles than goods ("Divine Divinity" flickering...)
fix: handled CoCreateInstance calling CoCreateInstanceEx in hot patch mode.
fix: eliminated InvalidateRect calls in ddrow Unlock hooker: this is not the right way to fix "Deadlock II", sorry.
fix: DirectDrawEnumerateEx log
fix: cursor is hidden in fullscreen mode only
fix: CoCreateInstance & CoCreateInstanceEx wrappers. Now "Crusaders of Might & Magic" is playable in window

View File

@ -64,15 +64,16 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
// Wrong guess!!! The cause was not compression, but simply a pixelformat mismatch. Better
// configure things properly and avoid this branch.
switch(res){
case DDERR_UNSUPPORTED:
if (dxw.dwFlags1 & EMULATESURFACE){
RECT targetrect;
if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__);
targetrect=*lpdestrect;
dxw.MapWindowRect(&targetrect);
res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx);
}
break;
// commented out: it was the cause of the "Divine Divinity" flickering.
// commented in?: it seems useful in "Axis and Allies"....
//case DDERR_UNSUPPORTED:
// if (dxw.dwFlags1 & EMULATESURFACE){
// RECT targetrect;
// if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__);
// targetrect = dxw.MapWindowRect(lpdestrect);
// res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx);
// }
// break;
case DDERR_SURFACEBUSY:
(*pUnlockMethod(lpdds))(lpdds, NULL);
if (lpddssrc) (*pUnlockMethod(lpddssrc))(lpddssrc, NULL);
@ -261,8 +262,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
RECT targetrect;
dxw.ShowOverlay(lpddssrc);
if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, __LINE__);
targetrect=destrect;
dxw.MapWindowRect(&targetrect); // v2.03.15
targetrect=dxw.MapWindowRect(&destrect); // v2.03.18
res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
}

View File

@ -1760,9 +1760,10 @@ HRESULT WINAPI extInitialize(LPDIRECTDRAW lpdd, GUID FAR *lpguid)
res=(*pInitialize)(lpdd, lpPrivGuid);
if(res == DDERR_ALREADYINITIALIZED) res=DD_OK; // v2.03.18: this error could be caused by the CoCreateInstance implementation
if(dxw.dwFlags3 & COLORFIX) (((DDRAWI_DIRECTDRAW_INT *)lpdd))->lpLcl->dwAppHackFlags |= 0x800;
if(res) OutTraceE("Initialize ERROR: res=%x(%s)\n", res, ExplainDDError(res));
return res;
}
@ -3716,18 +3717,12 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC
}
res=(*pUnlock)(lpdds, lprect);
if (IsPrim && res==DD_OK) {
if(dxversion == 1) lprect=NULL;
res=sBlt("Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE);
}
if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error
if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__);
if (IsPrim && res==DD_OK) {
if(dxversion == 1){
res=sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE);
(*pInvalidateRect)(dxw.GethWnd(), NULL, FALSE); // to fix "Deadlock II" mouse trails....
}
else {
res=sBlt("Unlock", lpdds, lprect, lpdds, lprect, NULL, 0, FALSE);
(*pInvalidateRect)(dxw.GethWnd(), lprect, FALSE);
}
}
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK;
@ -4712,7 +4707,7 @@ HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette)
return ref;
}
BOOL WINAPI DDEnumerateCallbackFilter(GUID *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext)
BOOL FAR PASCAL DDEnumerateCallbackFilter(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext)
{
BOOL res;
typedef struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} Context_Type;
@ -4725,7 +4720,7 @@ BOOL WINAPI DDEnumerateCallbackFilter(GUID *lpGuid, LPSTR lpDriverDescription, L
return res;
}
BOOL WINAPI DDEnumerateCallbackExFilter(GUID *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm)
BOOL FAR PASCAL DDEnumerateCallbackExFilter(GUID FAR *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm)
{
BOOL res;
typedef struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} Context_Type;
@ -4759,15 +4754,16 @@ HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lp
{
HRESULT ret;
OutTraceDDRAW("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n",
lpCallback, lpContext, dxw.dwFlags1, ExplainDDEnumerateFlags(dwFlags));
lpCallback, lpContext, dwFlags, ExplainDDEnumerateFlags(dwFlags));
if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){
struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} myContext;
myContext.lpCallback=lpCallback;
myContext.lpContext=lpContext;
ret=(*pDirectDrawEnumerateEx)(DDEnumerateCallbackExFilter, (LPVOID)&myContext, dwFlags);
}
else
else{
ret=(*pDirectDrawEnumerateEx)(lpCallback, lpContext, dwFlags);
}
if(ret) OutTraceE("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret));
if(dxw.dwFlags1 & SUPPRESSDXERRORS) ret=0;
return ret;

View File

@ -936,6 +936,7 @@ char *ExplainSetWindowIndex(DWORD c)
case GWL_STYLE: eb="GWL_STYLE"; break;
case GWL_USERDATA: eb="GWL_USERDATA"; break;
case GWL_WNDPROC: eb="GWL_WNDPROC"; break;
case GWL_HWNDPARENT: eb="GWL_HWNDPARENT"; break;
case DWL_DLGPROC: eb="DWL_DLGPROC"; break;
case DWL_MSGRESULT: eb="DWL_MSGRESULT"; break;
case DWL_USER: eb="DWL_USER"; break;

View File

@ -598,7 +598,6 @@ void HookWindowProc(HWND hwnd)
void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height)
{
HRESULT res=0;
LONG style;
@ -629,7 +628,7 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height)
// fixing cursor view and clipping region
if (dxw.dwFlags1 & HIDEHWCURSOR) while ((*pShowCursor)(0) >= 0);
if ((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while ((*pShowCursor)(0) >= 0);
if (dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0);
if (dxw.dwFlags1 & CLIPCURSOR) {
OutTraceDW("AdjustWindowFrame: setting clip region\n");
@ -937,7 +936,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
dxw.dwFlags1 |= LOCKWINPOS;
dx_UpdatePositionLock(hwnd);
}
if(dxw.dwFlags1 & HIDEHWCURSOR) while((*pShowCursor)(0) >= 0);
if((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()) while((*pShowCursor)(0) >= 0);
if(dxw.dwFlags2 & SHOWHWCURSOR) while((*pShowCursor)(1) < 0);
if(dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion);
if(dxw.dwFlags2 & REFRESHONRESIZE) dxw.ScreenRefresh();
@ -974,7 +973,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
if(dxw.Windowize){
prev.x = LOWORD(lparam);
prev.y = HIWORD(lparam);
if (dxw.dwFlags1 & HIDEHWCURSOR) {
if ((dxw.dwFlags1 & HIDEHWCURSOR) && dxw.IsFullScreen()){
(*pGetClientRect)(hwnd, &rect);
if(prev.x >= 0 && prev.x < rect.right && prev.y >= 0 && prev.y < rect.bottom)
while((*pShowCursor)(0) >= 0);
@ -1681,7 +1680,6 @@ void HookInit(TARGETMAP *target, HWND hwnd)
if(dxw.dwFlags5 & GDIMODE) dxw.dwFlags1 |= EMULATESURFACE;
if(dxw.dwFlags5 & STRESSRESOURCES) dxw.dwFlags5 |= LIMITRESOURCES;
if(hwnd){ // v2.02.32: skip this when in code injection mode.
// v2.1.75: is it correct to set hWnd here?
//dxw.SethWnd(hwnd);

View File

@ -997,7 +997,7 @@ void dxwCore::ScreenRefresh(void)
if (lpDDSPrim) extBlt(lpDDSPrim, NULL, lpDDSPrim, NULL, 0, NULL);
// v2.02.44 - used for what? Commenting out seems to fix the palette update glitches
// and make the "Palette updates don't blit"option useless....
// and make the "Palette updates don't blit" option useless....
//(*pInvalidateRect)(hWnd, NULL, FALSE);
}

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.16"
#define VERSION "2.03.18"
#define DDTHREADLOCK 1
//#define LOCKTHREADS

Binary file not shown.

View File

@ -17,6 +17,16 @@ typedef BOOL (WINAPI *CreateProcessA_Type)(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTE
BOOL, DWORD, LPVOID, LPCTSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION);
CreateProcessA_Type pCreateProcessA = NULL;
#ifdef NOFREELIBRARY
typedef BOOL (WINAPI *FreeLibrary_Type)(HMODULE);
FreeLibrary_Type pFreeLibrary = NULL;
BOOL WINAPI extFreeLibrary(HMODULE hModule)
{
OutTrace("FreeLibrary: hModule=%x SUPPRESS\n", hModule);
return TRUE;
}
#endif
// v2.02.96: the GetSystemInfo API is NOT hot patchable on Win7. This can cause problems because it can't be hooked by simply
// enabling hot patch. A solution is making all LoadLibrary* calls hot patchable, so that when loading the module, the call
// can be hooked by the IAT lookup. This fixes a problem after movie playing in Wind Fantasy SP.
@ -33,6 +43,9 @@ static HookEntry_Type Hooks[]={
{HOOK_IAT_CANDIDATE, "GetLogicalDrives", (FARPROC)NULL, (FARPROC *)&pGetLogicalDrives, (FARPROC)extGetLogicalDrives},
{HOOK_IAT_CANDIDATE, "GetTempFileNameA", (FARPROC)GetTempFileNameA, (FARPROC *)&pGetTempFileName, (FARPROC)extGetTempFileName},
{HOOK_IAT_CANDIDATE, "CreateProcessA", (FARPROC)NULL, (FARPROC *)&pCreateProcessA, (FARPROC)extCreateProcessA},
#ifdef NOFREELIBRARY
{HOOK_HOT_CANDIDATE, "FreeLibrary", (FARPROC)FreeLibrary, (FARPROC *)&pFreeLibrary, (FARPROC)extFreeLibrary},
#endif
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
@ -533,7 +546,6 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
}
// to do: the else condition: the program COULD load addresses by ordinal value ... done ??
// to do: CoCreateInstanceEx
if((DWORD)proc & 0xFFFF0000){
FARPROC remap;
switch(idx){

View File

@ -7,10 +7,13 @@
extern void HookModule(HMODULE, int);
static BOOL bRecursedHook = FALSE;
static HookEntry_Type Hooks[]={
{HOOK_HOT_CANDIDATE, "CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance},
{HOOK_HOT_CANDIDATE, "CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx},
{HOOK_HOT_CANDIDATE, "CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize},
//{HOOK_HOT_CANDIDATE, "CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize},
//{HOOK_HOT_CANDIDATE, "CoUninitialize", NULL, (FARPROC *)&pCoUninitialize, (FARPROC)extCoUninitialize},
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
@ -29,7 +32,7 @@ FARPROC Remap_ole32_ProcAddress(LPCSTR proc, HMODULE hModule)
return NULL;
}
// so far, there are 4 additional libraries that could be loaded by meand of a CoCreateInstance call....
// so far, there are 4 additional libraries that could be loaded by means of a CoCreateInstance call....
#define ADDITIONAL_MODULE_COUNT 4
struct {
@ -61,58 +64,94 @@ static void HookAdditionalModules()
// -------------------------------------------------------------------------------------
// Ole32 CoCreateInstance handling: you can create DirectDraw objects through it!
// utilized so far in a single game: Axiz & Allies
// utilized so far in a single game: "Axis & Allies"
// another one: "Crusaders of Might and Magic" ....
// -------------------------------------------------------------------------------------
extern void HookDDSession(LPDIRECTDRAW *, int);
#if 0
typedef HRESULT (WINAPI *Initialize_Type)(LPDIRECTDRAW, GUID FAR *);
extern Initialize_Type pInitialize;
HRESULT WINAPI extInitialize1(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("1\n"); HookDDSession(&lpdd, 1); return DD_OK; }
HRESULT WINAPI extInitialize2(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("2\n"); HookDDSession(&lpdd, 2); return DD_OK; }
HRESULT WINAPI extInitialize4(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("4\n"); HookDDSession(&lpdd, 4); return DD_OK; }
HRESULT WINAPI extInitialize7(LPDIRECTDRAW lpdd, GUID FAR *lpguid) { OutTrace("7\n"); HookDDSession(&lpdd, 7); return DD_OK; }
void HookDDSessionInitialize(LPDIRECTDRAW *lplpdd, int dxversion, Initialize_Type extInitialize)
{
OutTraceDW("Hooking directdraw Init dd=%x dxversion=%d pInit=%x\n",
*lplpdd, dxversion, extInitialize);
SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize, (void **)&pInitialize, "Initialize(D)");
}
#endif
HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv)
{
HRESULT res;
OutTraceDW("CoCreateInstance: rclsid=%x UnkOuter=%x ClsContext=%x refiid=%x(%s)\n",
rclsid, pUnkOuter, dwClsContext, riid.Data1, ExplainGUID((GUID *)&riid));
rclsid.Data1, pUnkOuter, dwClsContext, riid.Data1, ExplainGUID((GUID *)&riid));
bRecursedHook = TRUE;
res=(*pCoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv);
if(res)
bRecursedHook = FALSE;
if(res) {
OutTraceE("CoCreateInstance: ERROR res=%x\n", res);
else
OutTraceDW("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv);
return res;
}
OutTraceDW("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv);
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){
LPDIRECTDRAW lpOldDDraw;
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ // v2.03.18: fixed
OutTraceDW("CoCreateInstance: CLSID_DirectDraw object\n");
HookDDSession((LPDIRECTDRAW *)ppv, 1);
switch (*(DWORD *)&riid){
#if 0
case 0x6C14DB80:
OutTraceDW("DirectDrawCreate: IID_DirectDraw RIID\n");
res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0);
if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res));
HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 1, extInitialize1); break;
case 0xB3A6F3E0:
HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 2, extInitialize2); break;
case 0x9C59509A:
HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 4, extInitialize4); break;
case 0x15E65EC0:
HookDDSessionInitialize((LPDIRECTDRAW *)ppv, 7, extInitialize7); break;
#else
LPDIRECTDRAW lpOldDDraw;
case 0x6C14DB80:
OutTraceDW("CoCreateInstance: IID_DirectDraw RIID\n");
HookDDSession((LPDIRECTDRAW *)ppv, 1);
break;
case 0xB3A6F3E0:
OutTraceDW("DirectDrawCreate: IID_DirectDraw2 RIID\n");
OutTraceDW("CoCreateInstance: IID_DirectDraw2 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv);
res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)ppv);
if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
break;
case 0x9c59509a:
OutTraceDW("DirectDrawCreate: IID_DirectDraw4 RIID\n");
case 0x9C59509A:
OutTraceDW("CoCreateInstance: IID_DirectDraw4 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv);
res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)ppv);
if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
case 0x15e65ec0:
break;
case 0x15E65EC0:
OutTraceDW("CoCreateInstance: IID_DirectDraw7 RIID\n");
res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0);
res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)ppv, IID_IDirectDraw7, 0);
if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
break;
case 0xe436ebb3:
case 0xE436EBB3:
break;
#endif
}
}
else
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv);
else {
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv);
}
HookAdditionalModules();
OutTraceDW("CoCreateInstance: res=%x ppv=%x->%x\n", res, *ppv, *(DWORD *)*ppv);
return res;
}
@ -122,13 +161,14 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute
DWORD i;
OutTraceDW("CoCreateInstanceEx: rclsid=%x UnkOuter=%x ClsContext=%x Count=%d\n",
rclsid, punkOuter, dwClsCtx, dwCount);
rclsid.Data1, punkOuter, dwClsCtx, dwCount);
res=(*pCoCreateInstanceEx)(rclsid, punkOuter, dwClsCtx, pServerInfo, dwCount, pResults);
if(res) {
OutTraceE("CoCreateInstanceEx: ERROR res=%x\n", res);
return res;
}
if(bRecursedHook) return res;
for(i=0; i<dwCount; i++){
LPVOID FAR* ppv;
@ -150,43 +190,46 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute
}
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){
LPDIRECTDRAW lpOldDDraw;
OutTraceDW("CoCreateInstanceEx: CLSID_DirectDraw object\n");
extern void HookDDSession(LPDIRECTDRAW *, int);
OutTraceDW("CoCreateInstance: CLSID_DirectDraw object\n");
switch (*(DWORD *)&riid){
case 0x6C14DB80:
OutTraceDW("DirectDrawCreateEx: IID_DirectDraw RIID\n");
res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0);
if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
break;
case 0xB3A6F3E0:
OutTraceDW("DirectDrawCreateEx: IID_DirectDraw2 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv);
if(res)OutTraceDW("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
break;
case 0x9c59509a:
OutTraceDW("DirectDrawCreateEx: IID_DirectDraw4 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv);
if(res)OutTraceDW("QueryInterfaceEx: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
case 0x15e65ec0:
OutTraceDW("CoCreateInstanceEx: IID_DirectDraw7 RIID\n");
res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0);
if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
break;
case 0xe436ebb3:
break;
LPDIRECTDRAW lpOldDDraw;
case 0x6C14DB80:
OutTraceDW("CoCreateInstance: IID_DirectDraw RIID\n");
HookDDSession((LPDIRECTDRAW *)ppv, 1);
break;
case 0xB3A6F3E0:
OutTraceDW("CoCreateInstance: IID_DirectDraw2 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)ppv);
if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
break;
case 0x9C59509A:
OutTraceDW("CoCreateInstance: IID_DirectDraw4 RIID\n");
res=extDirectDrawCreate(NULL, &lpOldDDraw, 0);
if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res));
res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)ppv);
if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res));
lpOldDDraw->Release();
break;
case 0x15E65EC0:
OutTraceDW("CoCreateInstance: IID_DirectDraw7 RIID\n");
res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)ppv, IID_IDirectDraw7, 0);
if(res)OutTraceDW("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res));
break;
case 0xE436EBB3:
break;
}
}
else
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv);
else {
if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv);
}
}
HookAdditionalModules();
OutTraceDW("CoCreateInstanceEx: res=%x\n", res);
return res;
}
@ -197,3 +240,9 @@ HRESULT WINAPI extCoInitialize(LPVOID pvReserved)
res=(*pCoInitialize)(pvReserved);
return res;
}
void WINAPI extCoUninitialize(void)
{
OutTraceDW("CoUninitialize\n");
(*pCoUninitialize)();
}

View File

@ -136,6 +136,7 @@ typedef BOOL (WINAPI *GetExitCodeProcess_Type)(HANDLE, LPDWORD);
typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*);
typedef HRESULT (STDAPICALLTYPE *CoCreateInstanceEx_Type)(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *);
typedef HRESULT (STDAPICALLTYPE *CoInitialize_Type)(LPVOID);
typedef void (STDAPICALLTYPE *CoUninitialize_Type)(void);
// user32.dll:
typedef HDC (WINAPI *BeginPaint_Type)(HWND, LPPAINTSTRUCT);
@ -350,6 +351,7 @@ DXWEXTERN GetExitCodeProcess_Type pGetExitCodeProcess DXWINITIALIZED;
DXWEXTERN CoCreateInstance_Type pCoCreateInstance DXWINITIALIZED;
DXWEXTERN CoCreateInstanceEx_Type pCoCreateInstanceEx DXWINITIALIZED;
DXWEXTERN CoInitialize_Type pCoInitialize DXWINITIALIZED;
DXWEXTERN CoUninitialize_Type pCoUninitialize DXWINITIALIZED;
// user32.dll:
DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED;
@ -565,6 +567,7 @@ extern BOOL WINAPI extQueryPerformanceCounter(LARGE_INTEGER *);
extern HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*);
extern HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *);
extern HRESULT STDAPICALLTYPE extCoInitialize(LPVOID);
extern void STDAPICALLTYPE extCoUninitialize(void);
// user32.dll:
extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT);

View File

@ -36,6 +36,12 @@ HHOOK WINAPI extSetWindowsHookEx(int, HOOKPROC, HINSTANCE, DWORD);
typedef BOOL (WINAPI *PostMessageA_Type)(HWND, UINT, WPARAM, LPARAM);
PostMessageA_Type pPostMessageA = NULL;
BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM);
typedef HRESULT (WINAPI *MessageBoxTimeoutA_Type)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD);
MessageBoxTimeoutA_Type pMessageBoxTimeoutA = NULL;
HRESULT WINAPI extMessageBoxTimeoutA(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD);
typedef HRESULT (WINAPI *MessageBoxTimeoutW_Type)(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD);
MessageBoxTimeoutW_Type pMessageBoxTimeoutW = NULL;
HRESULT WINAPI extMessageBoxTimeoutW(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD);
#ifdef TRACEPALETTE
typedef UINT (WINAPI *GetDIBColorTable_Type)(HDC, UINT, UINT, RGBQUAD *);
@ -99,6 +105,9 @@ static HookEntry_Type Hooks[]={
{HOOK_HOT_CANDIDATE, "WindowFromPoint", (FARPROC)WindowFromPoint, (FARPROC *)&pWindowFromPoint, (FARPROC)extWindowFromPoint},
{HOOK_HOT_CANDIDATE, "SetWindowsHookExA", (FARPROC)SetWindowsHookExA, (FARPROC *)&pSetWindowsHookEx, (FARPROC)extSetWindowsHookEx},
//{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutA", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutA, (FARPROC)extMessageBoxTimeoutA},
//{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutW", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutW, (FARPROC)extMessageBoxTimeoutW},
{HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator
};
@ -1113,6 +1122,7 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT
ret=(*pMapWindowPoints)(hWndFrom, hWndTo, lpPoints, cPoints);
// v2.03.16: now must scale every point (fixes "NBA Live 99")
// v2.03.18: in some cases it should not! "New Your Race"...
for(pi=0; pi<cPoints; pi++){
dxw.UnmapClient(&lpPoints[pi]);
}
@ -3037,3 +3047,21 @@ HHOOK WINAPI extSetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWOR
ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId);
return ret;
}
HRESULT WINAPI extMessageBoxTimeoutA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
{
HRESULT res;
if(1) dwMilliseconds=1000;
res=(*pMessageBoxTimeoutA)(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds);
return res;
}
HRESULT WINAPI extMessageBoxTimeoutW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
{
HRESULT res;
if(1) dwMilliseconds=1000;
res=(*pMessageBoxTimeoutW)(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds);
return res;
}

Binary file not shown.

Binary file not shown.