#include #include #include "dxwnd.h" #include "dxwcore.hpp" #include "syslibs.h" #include "dxhook.h" #include "dxhelper.h" extern void HookModule(HMODULE, int); extern void HookDirectSoundObj(LPDIRECTSOUND *); extern void HookDirectDrawFactory(void *); static BOOL bRecursedHook = FALSE; static HookEntryEx_Type Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance}, {HOOK_HOT_CANDIDATE, 0, "CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx}, //{HOOK_HOT_CANDIDATE, 0, "CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize}, //{HOOK_HOT_CANDIDATE, 0, "CoUninitialize", NULL, (FARPROC *)&pCoUninitialize, (FARPROC)extCoUninitialize}, {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); extern HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *, LPDIRECTDRAW FAR *, REFIID, IUnknown FAR *); void HookOle32(HMODULE module) { HookLibraryEx(module, Hooks, "ole32.dll"); } FARPROC Remap_ole32_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; if (addr=RemapLibraryEx(proc, hModule, Hooks)) return addr; return NULL; } // so far, there are 4 additional libraries that could be loaded by means of a CoCreateInstance call.... #define ADDITIONAL_MODULE_COUNT 4 struct { BOOL Hooked; char *ModuleName; } AddedModules[ADDITIONAL_MODULE_COUNT]= { {FALSE, "quartz"}, //{FALSE, "ddrawex"}, //v2.03.71: hooking this library makes "WhiteOut" crash {FALSE, "amstream"}, {FALSE, "dplayx"}, {0, 0} // it seems necessary to also repeat the hook the main module .... }; static void HookAdditionalModules() { for(int i=0; i%x\n", *ppv, *(DWORD *)*ppv); switch (rclsid.Data1) { case 0xD7B70EE0: // CLSID_DirectDraw: // v2.03.18: fixed OutTraceDW("CoCreateInstance: CLSID_DirectDraw object\n"); switch (*(DWORD *)&riid){ LPDIRECTDRAW lpOldDDraw; case 0x6C14DB80: // must go through DirectDrawCreate: needed for "Darius Gaiden" OutTraceDW("CoCreateInstance: IID_DirectDraw RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); if(res)OutTraceDW("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw, (LPVOID *)ppv); if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); 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; } break; case 0xA65B8071: // CLSID_DxDiagProvider: if ((rclsid.Data2==0x3BFE) && (rclsid.Data3 == 0x4213)){ OutTraceDW("CoCreateInstance: CLSID_DxDiagProvider object\n"); res=HookDxDiag(riid, ppv); } break; case 0x47d4d946: // CLSID_DirectSound OutTraceDW("CoCreateInstance: CLSID_DirectSound object\n"); HookDirectSoundObj((LPDIRECTSOUND *)ppv); break; case 0x4fd2a832: // CLSID_DirectDrawFactory if ((rclsid.Data2==0x86c8) && (rclsid.Data3 == 0x11d0)){ OutTraceDW("CoCreateInstance: CLSID_DirectDrawFactory object\n"); HookDirectDrawFactory((void *)ppv); } break; default: break; } HookAdditionalModules(); OutTraceDW("CoCreateInstance: res=%x ppv=%x->%x\n", res, *ppv, *(DWORD *)*ppv); return S_OK; } HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOuter, DWORD dwClsCtx, COSERVERINFO *pServerInfo, DWORD dwCount, MULTI_QI *pResults) { HRESULT res; DWORD i; OutTraceDW("CoCreateInstanceEx: rclsid=%x UnkOuter=%x ClsContext=%x Count=%d\n", 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; iQueryInterface(IID_IDirectDraw2, (LPVOID *)ppv); if(res)OutTraceDW("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); break; case 0x9C59509A: OutTraceDW("CoCreateInstanceEx: 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("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; } break; case 0xA65B8071: // CLSID_DxDiagProvider: if ((rclsid.Data2==0x3BFE) && (rclsid.Data3 == 0x4213)){ OutTraceDW("CoCreateInstanceEx: CLSID_DxDiagProvider object\n"); res=HookDxDiag(riid, ppv); } break; case 0x4fd2a832: // CLSID_DirectDrawFactory if ((rclsid.Data2==0x86c8) && (rclsid.Data3 == 0x11d0)){ OutTraceDW("CoCreateInstanceEx: CLSID_DirectDrawFactory object\n"); HookDirectDrawFactory((LPDIRECTSOUND *)ppv); } break; } } HookAdditionalModules(); OutTraceDW("CoCreateInstanceEx: res=%x\n", res); return res; } HRESULT WINAPI extCoInitialize(LPVOID pvReserved) { HRESULT res; OutTraceDW("CoInitialize: Reserved=%x\n", pvReserved); res=(*pCoInitialize)(pvReserved); return res; } void WINAPI extCoUninitialize(void) { OutTraceDW("CoUninitialize\n"); (*pCoUninitialize)(); }