#include #include "dxwnd.h" #include "dxwcore.hpp" #include "syslibs.h" #include "dxhook.h" #include "dxhelper.h" static HookEntry_Type Hooks[]={ {"CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance}, // {"CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx}, remote object creation.... {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) { HookLibrary(module, Hooks, "ole32.dll"); } FARPROC Remap_ole32_ProcAddress(LPCSTR proc, HMODULE hModule) { FARPROC addr; if (addr=RemapLibrary(proc, hModule, Hooks)) return addr; return NULL; } // ------------------------------------------------------------------------------------- // Ole32 CoCreateInstance handling: you can create DirectDraw objects through it! // utilized so far in a single game: Axiz & Allies // ------------------------------------------------------------------------------------- static void HookDDSession(LPDIRECTDRAW *, int); HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv) { HRESULT res; OutTraceD("CoCreateInstance: rclsid=%x UnkOuter=%x ClsContext=%x refiid=%x\n", rclsid, pUnkOuter, dwClsContext, riid); // CLSID e436ebb3 implies loading quartz.dll to play movies through dshow: // quartz.dll must be hooked. if (*(DWORD *)&rclsid==0xe436ebb3){ HMODULE qlib; OutTraceD("CoCreateInstance: CLSID_FilterGraph RIID=%x\n", *(DWORD *)&riid); qlib=(*pLoadLibraryA)("quartz.dll"); OutTraceD("CoCreateInstance: quartz lib handle=%x\n", qlib); HookKernel32(qlib); HookUser32(qlib); HookWinMM(qlib); } res=(*pCoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv); if(res) OutTraceE("CoCreateInstance: ERROR res=%x\n", res); else OutTraceD("CoCreateInstance: ppv=%x->%x\n", *ppv, *(DWORD *)*ppv); if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ LPDIRECTDRAW lpOldDDraw; OutTraceD("CoCreateInstance: CLSID_DirectDraw object\n"); switch (*(DWORD *)&riid){ case 0x6C14DB80: OutTraceD("DirectDrawCreate: IID_DirectDraw RIID\n"); res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0); if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xB3A6F3E0: OutTraceD("DirectDrawCreate: IID_DirectDraw2 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); break; case 0x9c59509a: OutTraceD("DirectDrawCreate: IID_DirectDraw4 RIID\n"); res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); lpOldDDraw->Release(); case 0x15e65ec0: OutTraceD("CoCreateInstance: IID_DirectDraw7 RIID\n"); res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); break; case 0xe436ebb3: break; } } else if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); return res; }