尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

项目实训博客(四)从Vulkan到D3D12:注入与拦截架构演变

项目实训博客(四)从Vulkan到D3D12:注入与拦截架构演变
📅 发布时间:2026/6/24 5:55:40

一、为什么从Vulkan转向D3D12

中期项目基于Vulkan,通过vulkan-1.dllProxy DLL注入,拦截vkGetDeviceProcAddr,在vkQueuePresentKHR前插入图像处理。经过评估,最终项目转向D3D12方案,原因:

维度VulkanD3D12
游戏覆盖部分更广泛
超分SDKFSR2较好,DLSS有限DLSS/FSR/XeSS全支持
开源参考较少upscalerBridge完整参考

核心洞察:虽然API不同,但注入思想相同——在Present前插入自定义GPU处理。区别在于实现手段。


二、Vulkan方案回顾(中期)

Vulkan通过拦截vkGetDeviceProcAddr控制所有设备级函数:

cpp

// vk_dispatch.cpp(真实代码) PFN_vkVoidFunction VKAPI_CALL VkDispatch::WrappedGetDeviceProcAddr(VkDevice device, const char* pName) { if (strcmp(pName, "vkQueuePresentKHR") == 0) return (PFN_vkVoidFunction)&VkHooks::vkQueuePresentKHR; if (strcmp(pName, "vkCreateSwapchainKHR") == 0) return (PFN_vkVoidFunction)&VkHooks::vkCreateSwapchainKHR; return g_vkGetDeviceProcAddr(device, pName); }

注入点在vkQueuePresentKHR:解析VkPresentInfoKHR获取swapchain/imageIndex,录制CommandBuffer(清屏或Blit),通过Semaphore串联同步后调用真实Present。


三、D3D12核心实现

3.1 多马甲注入

与Vulkan仅伪装vulkan-1.dll不同,D3D12支持多个系统DLL伪装:

cpp

// dllmain.cpp CheckWorkingMode()(真实代码) if (lCaseFilename == "dxgi.dll") { originalModule = LoadSystemDLL(L"dxgi.dll"); DxgiProxy::Init(originalModule); State::Instance().workingMode = WorkingMode::Dxgi; } if (lCaseFilename == "winmm.dll") { /* 类似 */ } if (lCaseFilename == "version.dll") { /* 类似 */ }

3.2 LoadLibrary重定向

cpp

// LibraryLoad_Hooks.cpp(真实代码) HMODULE LibraryLoadHooks::LoadLibraryCheckW(std::wstring libName, ...) { if (CheckDllNameW(&libName, &nvngxNamesW)) { LOG_INFO("nvngx call, returning this dll!"); return dllModule; // 游戏以为加载了nvngx.dll,实际是我们 } // 其余DLL透传 return nullptr; }

3.3 DXGI Factory Hook

cpp

// Dxgi_Hooks.cpp(真实代码) VALIDATE_HOOK(hkCreateDXGIFactory2, DxgiProxy::PFN_CreateDxgiFactory2) inline static HRESULT hkCreateDXGIFactory2(UINT Flags, REFIID riid, IDXGIFactory2** ppFactory) { HRESULT result = o_CreateDXGIFactory2(Flags, riid, ppFactory); if (result == S_OK) { // 包装Factory,拦截所有SwapChain创建 *ppFactory = (IDXGIFactory2*)(new WrappedIDXGIFactory7(*ppFactory)); } return result; }

3.4 Present注入

cpp

// wrapped_swapchain.cpp(真实代码) HRESULT WrappedIDXGISwapChain4::Present(UINT SyncInterval, UINT Flags) { if ((Flags & DXGI_PRESENT_TEST) == 0) { // LocalPresent:ImGui覆盖层 + 帧生成 + 原始Present return LocalPresent(_real, SyncInterval, Flags, ...); } return _real->Present(SyncInterval, Flags); }

3.5 状态恢复(关键难点)

D3D12注入最复杂的部分:插入GPU命令后必须恢复游戏原始状态,否则闪退/花屏。

cpp

// D3D12_Hooks.cpp(真实代码) void D3D12Hooks::RestoreRoot(ID3D12GraphicsCommandList* cmdList) { // 恢复描述符堆、管线状态、根签名及所有根参数 RestoreDescriptorHeaps(cmdList); RestorePipelineState(cmdList); RestoreComputeRootState(cmdList); RestoreGraphicsRootState(cmdList); }

四、与Vulkan方案对比

维度VulkanD3D12
拦截目标vkGetDeviceProcAddrCreateDXGIFactory→Present
资源跟踪VkSwapchainKHR查表IDXGISwapChain包装
同步机制VkSemaphoreD3D12 Fence
状态管理自动手动追踪+恢复

五、验证结果

text

[Loader] Real dxgi.dll loaded [Hook] CreateDXGIFactory2 intercepted [Hook] WrappedIDXGISwapChain4 created [Present] ImGui overlay rendered, frame=120

程序正常运行,ImGui覆盖层显示,证明注入成功。


下一篇:SwapChain包装与Present注入详解

相关新闻

  • Lexical富文本编辑器图片处理全攻略:从拖拽上传到智能裁剪的完整方案
  • 实时消息传递_azure-messaging-webpubsubservice-py
  • 如何构建企业级AI智能体平台:基于Dify的现代化架构设计与技术实践

最新新闻

  • Jetson Nano大模型实测:拆穿GPT-5.4幻觉,横评Haiku/GLM-4/DeepSeek
  • Nginx配置CORS跨域:反向代理与响应头两种方案详解
  • Claude Code安装配置全链路指南:Node.js、npm与VS Code深度协同
  • Playwright企业级测试架构:模块化分层与可扩展性设计
  • OpenClaw飞书AI副驾驶:Windows零基础部署与技能实战
  • Claude Code不是插件,是本地智能体运行时

日新闻

  • 终极指南:如何用shadPS4在电脑上免费畅玩PS4游戏
  • 打造个性化Instagram Clone:主题定制与用户体验优化技巧
  • 未来展望:RoseTTAFold-All-Atom的发展路线图与社区支持资源汇总

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号