项目实训博客(四)从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(Ldxgi.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 Hookcpp// 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) { // LocalPresentImGui覆盖层 帧生成 原始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, frame120程序正常运行ImGui覆盖层显示证明注入成功。下一篇SwapChain包装与Present注入详解

相关新闻

【工具优化】Windows工具MobaXterm_Personal_20.3解除最多保存14个Session的限制_20260505

【工具优化】Windows工具MobaXterm_Personal_20.3解除最多保存14个Session的限制_20260505

【工具优化】Windows工具MobaXterm_Personal_20.3解除最多保存14个Session的限制_20260505 一、激活前 补充说明: MobaXterm这个应用程序没有复杂的激活算法,真的很神奇。如果可能的话,请支持购买正版。 二、激活操作 2.1基于 github项目…

2026/6/24 5:43:02阅读更多 →
Altium Designer(AD 20)-PcbDoc中的黑色pcb可编辑区域怎么调大

Altium Designer(AD 20)-PcbDoc中的黑色pcb可编辑区域怎么调大

现象如图:调整方法:先点击黑色的区域,按数字1,再按D,进入pcb板调整区域。最后按数字2退出该模式。最后结果如图

2026/6/24 5:43:02阅读更多 →
2026年全球社交APP格局大洗牌!这20款APP,你手机里装了几个?

2026年全球社交APP格局大洗牌!这20款APP,你手机里装了几个?

即时通讯赛道杀出一匹黑马,CQCQ强势跻身前三 全球热门社交APP最新排名,这三款霸榜了 移动互联网发展到今天,各大APP早已深度渗透进我们生活的方方面面。无论是想找人聊聊天、刷刷视频解解闷,还是网购淘点好物、远程办公开个会&…

2026/6/24 5:38:02阅读更多 →
深入解析PowerPC e300核心寄存器模型:从架构原理到嵌入式调试实战

深入解析PowerPC e300核心寄存器模型:从架构原理到嵌入式调试实战

1. 项目概述:为什么需要深入理解e300核心的寄存器模型?如果你正在开发基于MPC8309这类PowerQUICC II Pro系列处理器的嵌入式系统,无论是网络交换机、工业网关还是通信控制器,那么你迟早会与它的核心——e300处理器——的寄存器模型…

2026/6/24 6:48:05阅读更多 →
从纽约时报配色到设计系统:如何构建克制高效的数字产品色彩体系

从纽约时报配色到设计系统:如何构建克制高效的数字产品色彩体系

1. 项目缘起:当《纽约时报》的配色成为一种设计语言最近在做一个品牌视觉升级的项目,客户希望传达一种“权威、可信赖且富有深度”的调性。在寻找设计灵感时,我下意识地打开了《纽约时报》的网站和App。这几乎成了我的一个职业习惯——每当需…

2026/6/24 6:48:05阅读更多 →
Qwen3Guard-Gen-WEB HTTPS配置实战:从Let‘s Encrypt到Nginx反向代理

Qwen3Guard-Gen-WEB HTTPS配置实战:从Let‘s Encrypt到Nginx反向代理

1. 项目概述:为什么Qwen3Guard-Gen-WEB必须配置HTTPS? 最近在折腾大模型应用部署的朋友,估计没少跟各种API调用、Web界面打交道。我自己在本地部署Qwen3Guard-Gen-WEB时,就遇到了一个绕不开的问题:如何让这个Web服务安…

2026/6/24 6:48:05阅读更多 →
从零构建手势识别智能灯:深度学习与物联网边缘部署实战

从零构建手势识别智能灯:深度学习与物联网边缘部署实战

1. 项目概述:一次技术、社区与职业发展的交汇如果你对深度学习和物联网(IoT)这两个前沿领域感兴趣,同时又渴望在一个充满支持与启发的环境中学习、交流,那么“Deep Learning and IoT Workshop at GHC 18”这个项目标题…

2026/6/24 6:48:05阅读更多 →
AI Coding最佳实践:从RAG失效到OpenSpec可执行规范

AI Coding最佳实践:从RAG失效到OpenSpec可执行规范

1. 这不是“写代码更快”,而是重构整个软件交付链路的起点“AI Coding最佳实践”——这六个字最近在技术社区里被刷屏,但绝大多数人点进去看到的,是“用Cursor自动生成CRUD”“Copilot写测试用例提速70%”这类碎片化技巧。我带过三支不同规模…

2026/6/24 6:48:05阅读更多 →
Grok V9-Medium+Cursor:重构AI编程工作流的本地化实践

Grok V9-Medium+Cursor:重构AI编程工作流的本地化实践

1. 项目概述:当Grok遇上Cursor,不是简单“接入”,而是重构AI编程工作流最近刷到马斯克那条推文时,我正卡在一段Python数据清洗脚本的边界条件上——循环嵌套三层,pandas报错信息像天书,Stack Overflow翻了二…

2026/6/24 6:43:05阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/24 2:12:09阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理

TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler TaskJuggler是一款强大的开源项目管理工具&#…

2026/6/24 0:02:41阅读更多 →
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果

终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav angular-mobile-nav是一款专为…

2026/6/24 0:02:41阅读更多 →
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作

Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…

2026/6/24 0:02:41阅读更多 →