static void HookCreateEx(IDirect3D9Ex *pD3D) { ods("D3D9Ex: Injecting CreateDevice / CreateDeviceEx"); // Best effort hooking for the non-ex create method. If it was set up // previously this setup call is safely ignored by the hook. HookCreate(pD3D); hhCreateDeviceEx.setupInterface(pD3D, VTABLE_OFFSET_ID3D_CREATEDEVICE_EX, reinterpret_cast<voidFunc>(myCreateDeviceEx)); }
void checkD3D9Hook(bool preonly) { if (bChaining) { ods("D3D9: Causing a chain"); return; } bChaining = true; HMODULE hD3D = GetModuleHandle("D3D9.DLL"); if (hD3D != NULL) { if (! bHooked) { char procname[2048]; GetModuleFileName(NULL, procname, 2048); fods("D3D9: CreateWnd in unhooked D3D App %s", procname); bHooked = true; // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<char *>(&HookCreate), &hSelf); // Can we use the prepatch data? GetModuleFileName(hD3D, procname, 2048); if (_stricmp(d3dd->cFileName, procname) == 0) { unsigned char *raw = (unsigned char *) hD3D; HookCreateRaw((voidFunc)(raw + d3dd->iOffsetCreate)); if (d3dd->iOffsetCreateEx) HookCreateRawEx((voidFunc)(raw + d3dd->iOffsetCreateEx)); } else if (! preonly) { fods("D3D9 Interface changed, can't rawpatch"); pDirect3DCreate9 d3dc9 = reinterpret_cast<pDirect3DCreate9>(GetProcAddress(hD3D, "Direct3DCreate9")); ods("Got %p", d3dc9); if (d3dc9) { IDirect3D9 *id3d9 = d3dc9(D3D_SDK_VERSION); if (id3d9) { HookCreate(id3d9); id3d9->Release(); } else { ods("Failed Direct3DCreate9"); } } else { ods("D3D Library without Direct3DCreate9?"); } } else { bHooked = false; } } } bChaining = false; }
void hookD3D9(HMODULE hD3D, bool preonly) { const int procnamesize = 2048; char procname[procnamesize]; GetModuleFileName(NULL, procname, procnamesize); ods("D3D9: hookD3D9 in App %s", procname); // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<char *>(&HookCreate), &hSelf); bHooked = true; // Can we use the prepatch data? GetModuleFileName(hD3D, procname, procnamesize); if (_stricmp(d3dd->cFileName, procname) == 0) { unsigned char *raw = (unsigned char *) hD3D; HookCreateRaw((voidFunc)(raw + d3dd->iOffsetCreate)); if (d3dd->iOffsetCreateEx) HookCreateRawEx((voidFunc)(raw + d3dd->iOffsetCreateEx)); } else if (! preonly) { ods("D3D9: Interface changed, can't rawpatch"); pDirect3DCreate9 d3dcreate9 = reinterpret_cast<pDirect3DCreate9>(GetProcAddress(hD3D, "Direct3DCreate9")); if (d3dcreate9) { ods("D3D9: Got %p for Direct3DCreate9", d3dcreate9); IDirect3D9 *id3d9 = d3dcreate9(D3D_SDK_VERSION); if (id3d9) { HookCreate(id3d9); id3d9->Release(); } else { ods("D3D9: Failed call to Direct3DCreate9"); } } else { ods("D3D9: Library without Direct3DCreate9?"); } } else { bHooked = false; } }
static void hookD3D9(HMODULE hD3D, bool preonly) { char procname[MODULEFILEPATH_BUFLEN]; GetModuleFileName(NULL, procname, ARRAY_NUM_ELEMENTS(procname)); ods("D3D9: hookD3D9 in App '%s'", procname); // Add a ref to ourselves; we do NOT want to get unloaded directly from this process. HMODULE hTempSelf = NULL; GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, reinterpret_cast<char *>(&hookD3D9), &hTempSelf); bHooked = true; // Can we use the prepatch data? wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(hD3D, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(d3dd->wcFileName, modulename) == 0) { // The module seems to match the one we prepared d3dd for. unsigned char *raw = (unsigned char *) hD3D; HookCreateRaw((voidFunc)(raw + d3dd->iOffsetCreate)); if (d3dd->iOffsetCreateEx) { HookCreateRawEx((voidFunc)(raw + d3dd->iOffsetCreateEx)); } } else if (! preonly) { ods("D3D9: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, d3dd->wcFileName); pDirect3DCreate9 d3dcreate9 = reinterpret_cast<pDirect3DCreate9>(GetProcAddress(hD3D, "Direct3DCreate9")); if (d3dcreate9) { ods("D3D9: Got %p for Direct3DCreate9", d3dcreate9); IDirect3D9 *id3d9 = d3dcreate9(D3D_SDK_VERSION); if (id3d9) { HookCreate(id3d9); id3d9->Release(); } else { ods("D3D9: Failed call to Direct3DCreate9"); } } else { ods("D3D9: Library without Direct3DCreate9?"); } pDirect3DCreate9Ex d3dcreate9ex = reinterpret_cast<pDirect3DCreate9Ex>(GetProcAddress(hD3D, "Direct3DCreate9Ex")); if (d3dcreate9ex) { ods("D3D9: Got %p for Direct3DCreate9Ex", d3dcreate9ex); IDirect3D9Ex** id3d9ex = 0; HRESULT hr = d3dcreate9ex(D3D_SDK_VERSION, id3d9ex); if (SUCCEEDED(hr)) { HookCreateEx(*id3d9ex); (*id3d9ex)->Release(); } else { switch (hr) { case D3DERR_OUTOFVIDEOMEMORY: ods("D3D11: Direct3DCreate9Ex returned with out of memory error."); break; case D3DERR_NOTAVAILABLE: ods("D3D11: Direct3DCreate9Ex is not available."); break; default: ods("D3D11: Unexpected return result from Direct3DCreate9Ex"); break; } } } } else { bHooked = false; } }