/// @param hDXGI must be a valid module handle. void hookDXGI(HMODULE hDXGI, bool preonly) { wchar_t modulename[MODULEFILEPATH_BUFLEN]; GetModuleFileNameW(NULL, modulename, ARRAY_NUM_ELEMENTS(modulename)); ods("DXGI: hookDXGI in App '%ls'", modulename); // 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<LPCTSTR>(&hookDXGI), &hTempSelf); bHooked = true; // Can we use the prepatch data? GetModuleFileNameW(hDXGI, modulename, ARRAY_NUM_ELEMENTS(modulename)); if (_wcsicmp(dxgi->wcFileName, modulename) == 0) { // The module seems to match the one we prepared d3dd for. unsigned char *raw = (unsigned char *) hDXGI; HookPresentRaw((voidFunc)(raw + dxgi->offsetPresent)); HookResizeRaw((voidFunc)(raw + dxgi->offsetResize)); } else if (! preonly) { ods("DXGI: Interface changed, can't rawpatch. Current: %ls ; Previously: %ls", modulename, dxgi->wcFileName); } else { bHooked = false; } }
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; }