当前位置: 首页 > news >正文

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

一、为什么从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
拦截目标vkGetDeviceProcAddrCreateDXGIFactoryPresent
资源跟踪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注入详解

http://www.jsqmd.com/news/1071000/

相关文章:

  • 超星学习通自动签到终极指南:3分钟掌握全场景智能签到
  • 蒙特卡罗方法
  • Scrapling:现代Python网络爬虫的终极解决方案
  • 目标检测发展
  • 如何构建企业级AI智能体平台:基于Dify的现代化架构设计与技术实践
  • 实时消息传递_azure-messaging-webpubsubservice-py
  • Lexical富文本编辑器图片处理全攻略:从拖拽上传到智能裁剪的完整方案
  • ORC屏幕图片文字提取-聊天截图文字提取-截图文字识别-视频文字提取,免费用先
  • imx6ull 开发板,SD卡启动,给EMMC分区,烧系统。
  • C语言 基于分治法的快速排序算法(Quick Sort)
  • VoxCPM2语音合成终极指南:无需分词器的30种语言语音生成与高保真克隆技术
  • 【模块实现 03】ImGui 游戏内菜单:DX12 渲染路径的完整落地
  • React Native CarPlay 发布指南:App Store审核与CarPlay权限申请完整流程
  • 杰理可视化SDK开发-杰理SDK代码区域说明
  • 【AI应用实战-WorkBuddy】效率翻倍:我的 WorkBuddy 工作流分享(十八)
  • DiskGenius:机械硬盘坏了怎么修复?机械硬盘有坏道,记录使用DiskGenius修复全过程
  • 计算机毕业设计之基于jsp“明丽书屋”图书管理系统
  • 事件中心客户端_azure-eventhub-rust
  • 呆啵宠物DyberPet:让二次元角色活在你的桌面,打造专属数字伙伴的终极指南
  • 项目实训个人9--api适配
  • 27家投标,21家满分并列第一!
  • Softer-NMS 深度技术解析:从定位不准确性到精准边框的后处理革命
  • 【聊天机器人项目】7.结合Ollama,Streamlit实现聊天机器人
  • 分布式事务的几种实现方式
  • 如何用不到百元成本打造你的AI语音交互机器人?ESP32开源项目实战指南
  • Pandora与CVE漏洞分析:Kaspersky CVE-2023-23349等安全漏洞实战利用指南 [特殊字符]
  • Workflow-Orchestration 与 Durable Execution
  • linux系统编程(一):pthread常用函数
  • 大模型幻觉治理:2026前沿技术与实战指南
  • 【万字精讲】计算机网络高频填空简答18题:从死记硬背到体系化精通(原题+深度解析+避坑指南)