diff --git a/DDrawCompat/Common/Hook.cpp b/DDrawCompat/Common/Hook.cpp index 67d4ac0..ac7fe2f 100644 --- a/DDrawCompat/Common/Hook.cpp +++ b/DDrawCompat/Common/Hook.cpp @@ -70,12 +70,13 @@ namespace auto origThunk = reinterpret_cast(moduleBase + desc->OriginalFirstThunk); while (0 != thunk->u1.AddressOfData && 0 != origThunk->u1.AddressOfData) { - auto origImport = reinterpret_cast( - moduleBase + origThunk->u1.AddressOfData); - - if (0 == strcmp(origImport->Name, procName)) + if (!(origThunk->u1.Ordinal & IMAGE_ORDINAL_FLAG)) { - return reinterpret_cast(&thunk->u1.Function); + auto origImport = reinterpret_cast(moduleBase + origThunk->u1.AddressOfData); + if (0 == strcmp(origImport->Name, procName)) + { + return reinterpret_cast(&thunk->u1.Function); + } } ++thunk; diff --git a/DDrawCompat/D3dDdi/KernelModeThunks.cpp b/DDrawCompat/D3dDdi/KernelModeThunks.cpp index 91b662d..0a1ba03 100644 --- a/DDrawCompat/D3dDdi/KernelModeThunks.cpp +++ b/DDrawCompat/D3dDdi/KernelModeThunks.cpp @@ -416,11 +416,6 @@ namespace D3dDdi void installHooks() { - g_origSubmitPresentBltToHwQueue = reinterpret_cast( - GetProcAddress(GetModuleHandle("gdi32"), "D3DKMTSubmitPresentBltToHwQueue")); - g_origSubmitPresentToHwQueue = reinterpret_cast( - GetProcAddress(GetModuleHandle("gdi32"), "D3DKMTSubmitPresentToHwQueue")); - Compat::hookIatFunction(Dll::g_origDDrawModule, "CreateDCA", ddrawCreateDcA); Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTCloseAdapter", closeAdapter); Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTCreateDCFromMemory", createDcFromMemory); @@ -431,7 +426,21 @@ namespace D3dDdi Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTReleaseProcessVidPnSourceOwners", releaseProcessVidPnSourceOwners); Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTSetGammaRamp", setGammaRamp); Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTSetVidPnSourceOwner", setVidPnSourceOwner); - Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTSubmitPresentToHwQueue", submitPresentToHwQueue); + + auto gdi32 = GetModuleHandle("gdi32"); + g_origSubmitPresentBltToHwQueue = reinterpret_cast( + GetProcAddress(gdi32, "D3DKMTSubmitPresentBltToHwQueue")); + if (g_origSubmitPresentBltToHwQueue) + { + Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTSubmitPresentBltToHwQueue", submitPresentBltToHwQueue); + } + + g_origSubmitPresentToHwQueue = reinterpret_cast( + GetProcAddress(gdi32, "D3DKMTSubmitPresentToHwQueue")); + if (g_origSubmitPresentToHwQueue) + { + Compat::hookIatFunction(Dll::g_origDDrawModule, "D3DKMTSubmitPresentToHwQueue", submitPresentToHwQueue); + } Dll::createThread(&vsyncThreadProc, nullptr, THREAD_PRIORITY_TIME_CRITICAL); }