void checkDXGIHook(bool preonly) { if (bChaining) { ods("DXGI: Causing a chain"); return; } if (! dxgi->iOffsetPresent || ! dxgi->iOffsetResize) return; bChaining = true; HMODULE hDXGI = GetModuleHandleW(L"DXGI.DLL"); HMODULE hD3D10 = GetModuleHandleW(L"D3D10CORE.DLL"); if (hDXGI && hD3D10) { if (! bHooked) { wchar_t procname[2048]; GetModuleFileNameW(NULL, procname, 2048); fods("DXGI: Hookcheck '%ls'", 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 *>(&checkDXGIHook), &hSelf); // Can we use the prepatch data? GetModuleFileNameW(hDXGI, procname, 2048); if (_wcsicmp(dxgi->wcDXGIFileName, procname) == 0) { unsigned char *raw = (unsigned char *) hDXGI; HookPresentRaw((voidFunc)(raw + dxgi->iOffsetPresent)); HookResizeRaw((voidFunc)(raw + dxgi->iOffsetResize)); GetModuleFileNameW(hD3D10, procname, 2048); if (_wcsicmp(dxgi->wcD3D10FileName, procname) == 0) { unsigned char *raw = (unsigned char *) hD3D10; HookAddRelease((voidFunc)(raw + dxgi->iOffsetAddRef), (voidFunc)(raw + dxgi->iOffsetRelease)); } } else if (! preonly) { fods("DXGI Interface changed, can't rawpatch"); } else { bHooked = false; } } } bChaining = false; }
/// @param hD3D10 must be a valid module handle void hookD3D10(HMODULE hD3D10, bool preonly) { // 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 *>(&hookD3D10), &hTempSelf); bHooked = true; wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(hD3D10, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(d3d10->wcFileName, modulename) == 0) { unsigned char *raw = (unsigned char *) hD3D10; HookAddRelease((voidFunc)(raw + d3d10->iOffsetAddRef), (voidFunc)(raw + d3d10->iOffsetRelease)); } else if (! preonly) { ods("D3D10: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, d3d10->wcFileName); } else { bHooked = false; } }