MinHook挂钩vkCreateDevice失效:BeamNG Drive Vulkan模式无触发
解决Vulkan
vkCreateDevice 钩子未触发的可行方案 核心问题分析
- 游戏可能静态链接Vulkan库或直接调用显卡厂商驱动库,而非系统
vulkan-1.dll,导致GetProcAddress获取的地址并非实际调用入口 - Vulkan加载层(如Steam Overlay、NVIDIA Reflex)会拦截函数调用,跳过你的钩子
- 注入时机过晚,游戏已完成
vkCreateDevice调用,钩子挂载时函数已执行
具体解决方案
1. 拦截Vulkan库加载流程
- 挂钩
LoadLibraryW/LoadLibraryA,在游戏加载Vulkan相关库(vulkan-1.dll、nvoglv64.dll、amdvlk64.dll等)时,立即在该库内挂钩目标函数:
HMODULE WINAPI Hook_LoadLibraryW(LPCWSTR lpLibFileName) { HMODULE hMod = Original_LoadLibraryW(lpLibFileName); if (wcsstr(lpLibFileName, L"vulkan-1.dll") || wcsstr(lpLibFileName, L"nvoglv64.dll") || wcsstr(lpLibFileName, L"amdvlk64.dll")) { // 挂钩vkCreateDevice PFN_vkCreateDevice pfnCreateDevice = reinterpret_cast<PFN_vkCreateDevice>(GetProcAddress(hMod, "vkCreateDevice")); if (pfnCreateDevice) { MH_CreateHook(pfnCreateDevice, Hook_vkCreateDevice, reinterpret_cast<void**>(&Original_vkCreateDevice)); MH_EnableHook(pfnCreateDevice); } // 挂钩vkCreateSwapchainKHR PFN_vkCreateSwapchainKHR pfnCreateSwapchain = reinterpret_cast<PFN_vkCreateSwapchainKHR>(GetProcAddress(hMod, "vkCreateSwapchainKHR")); if (pfnCreateSwapchain) { MH_CreateHook(pfnCreateSwapchain, Hook_vkCreateSwapchainKHR, reinterpret_cast<void**>(&Original_vkCreateSwapchainKHR)); MH_EnableHook(pfnCreateSwapchain); } } return hMod; }
2. 直接挂钩显卡驱动的Vulkan入口
- 部分游戏会绕过系统
vulkan-1.dll,直接调用显卡驱动的Vulkan实现。找到对应驱动库(NVIDIA:nvoglv64.dll,AMD:amdvlk64.dll,Intel:igvk64.dll),动态获取vkCreateDevice地址并挂钩,避免依赖系统库。
3. 提前注入DLL
- 放弃延迟注入,改用进程初始化阶段注入:
- 通过
CreateRemoteThread在游戏进程刚启动时注入DLL - 修改游戏导入表,让游戏启动时自动加载你的DLL
- 通过
- 确保DLL在游戏加载任何Vulkan相关库前完成钩子初始化。
4. 应对Vulkan加载层干扰
- 若加载层拦截导致钩子失效,可尝试在
vkEnumerateInstanceExtensionProperties钩子中移除加载层相关扩展(如VK_EXT_debug_utils),但可能影响游戏功能,需测试验证。 - 或者在钩子逻辑中检查调用栈,确认是原始调用还是加载层转发,确保钩子正常执行。
5. 调试验证技巧
- 在
vkCreateDevice钩子中写入调试日志或弹出消息框,确认触发状态 - 用Process Explorer查看游戏进程加载的Vulkan库,确认你的DLL加载时机是否早于这些库
- 用x64dbg等调试器下断点,对比实际调用的
vkCreateDevice地址与你挂钩的地址是否一致
内容的提问来源于stack exchange,提问作者The DEV
相关产品推荐
相关产品推荐

