
示例工程【免费下载链接】Windows-driver-samplesThis repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.项目地址https://gitcode.com/gh_mirrors/wi/Windows-driver-samples点击查看免费下载导读本文以 Windows-driver-samples 仓库中的 SDV-FailDriver-KMDF 示例 为核心系统讲解微软 Static Driver VerifierSDV静态驱动程序验证器在 KMDFKernel Mode Driver Framework驱动上的工作方式。该示例驱动被刻意注入了 8 处代码缺陷用于展示 SDV 如何通过 DDI 使用规则发现错误。读完本文你将掌握如何在 Visual Studio 中为驱动配置并运行 SDV、如何添加驱动依赖的库、如何选择规则集以及如何解读缺陷报告与代码路径追踪。示例背景SDV 是什么示例用来做什么SDV 是随 Windows Driver KitWDK一同发布的静态验证工具可从 Microsoft Visual Studio 中直接运行。它不执行代码而是系统性地分析 Windows 内核模式驱动的源码沿着所有可能的代码路径检查驱动是否违反一组DDI 使用规则DDI Compliance Rules。SDV-FailDriver-KMDF 示例的核心价值在于它是一个专为演示 SDV 能力而构造的坏驱动。源码中每一处缺陷都被注释明确标注为注入点例如fail_driver1.c中DriverEntry里的注释tools/sdv/samples/SDV-FailDriver-KMDF/driver/fail_driver1.c#L38-L42写道This defect is injected for the DriverCreate rule.。运行 SDV 后该示例可稳定报告8 个缺陷让初学者直观理解每条规则的含义与违规路径。[!CAUTION] 这些示例驱动包含刻意引入的代码错误不具功能性也不是真实驱动开发项目的参考范本。它们唯一的用途就是配合 SDV 演示静态验证的发现能力。示例工程结构在分析流程前先了解工程的组织方式源码均在 tools/sdv/samples/SDV-FailDriver-KMDF 目录下路径作用SDV-FailDriver-KMDF.sln解决方案文件包含 driver 与 library 两个项目并声明了驱动对库的项目依赖driver/fail_driver1.c/.h被注入缺陷的 KMDF 驱动主体包含DriverEntry、EvtDriverDeviceAdd及三个 I/O 事件回调driver/fail_driver1.vcxproj驱动工程文件DriverType为 KMDF目标平台为 Universal通用驱动工具集为WindowsKernelModeDriver10.0driver/sdv-user.sdvSDV 用户规则列表文件逐行列出本示例要验证的 8 条 KMDF 规则library/fail_library1.c/.h配套缺陷库提供SDVTest_wdf_*系列辅助函数用于演示 SDV 对驱动依赖库的处理library/fail_library1.vcxproj库工程文件解决方案文件SDV-FailDriver-KMDF.sln#L10-L15显示fail_driver1通过ProjectDependencies声明了对fail_library1的依赖这正是 README 中必须先添加库再运行 SDV这一步骤的工程基础。8 个注入缺陷与对应规则全解本示例的 8 个缺陷分布在驱动主体与辅助库中与 sdv-user.sdv 中列出的规则一一对应。下表汇总了每条规则、缺陷注入位置及违规实质#规则注入点源码位置违规实质1DriverCreatefail_driver1.c#L41DriverEntry中调用SDVTest_wdf_DriverCreate()在WdfDriverCreate之前/之后执行了不允许的 DDI 调用序列2DeviceInitAPIfail_driver1.c#L75EvtDriverDeviceAdd在WdfDeviceCreate之后仍使用DeviceInit库中 fail_library1.c#L34 调用WdfDeviceInitSetIoTypeWdfDeviceCreate返回后继续操作WDFDEVICE_INIT对象3CtlDeviceFinishInitDeviceAddfail_driver1.c#L77-L103 分配控制设备后未调用WdfControlDeviceFinishInitialization直接返回控制设备初始化流程未完成4MdlAfterReqCompletedIoctlfail_driver1.c#L149-L156WdfRequestComplete之后再取回 MDL请求完成后仍使用其关联的 MDL5MemAfterReqCompletedIntIoctlAfail_driver1.c#L177-L195 请求完成后使用memory构造WDF_MEMORY_DESCRIPTOR见 fail_library1.c#L65请求完成后仍使用其关联的 WDFMEMORY6MdlAfterReqCompletedIntIoctlAfail_driver1.c#L182-L200 请求完成后对pMdl调用MmGetMdlByteOffset见 fail_library1.c#L77请求完成后仍使用其关联的 MDL7MarkCancOnCancReqLocalfail_driver1.c#L117-L122 标记可取消后由不同回调再次调用WdfRequestMarkCancelable见 fail_library1.c#L87未由同一取消例程且在本函数内处理可取消标记8StopAckWithinEvtIoStopfail_driver1.c#L127 在EvtIoRead回调中调用WdfRequestStopAcknowledge(Request, FALSE)在非EvtIoStop上下文中确认请求停止缺陷注入的两种模式从源码结构看本示例采用了两种注入手法驱动内直接注入在事件回调中直接调用违规 API。例如EvtIoDeviceControl在 fail_driver1.c#L151 完成请求后仍于 L156 调用SDVTest_wdf_MdlAfterReqCompletionIoctl处理 MDL构成 MdlAfterReqCompletedIoctl 违规。通过库间接注入把违规操作封装进fail_library1的SDVTest_wdf_*函数中驱动调用这些函数即可触发规则。例如 fail_library1.c#L46 的WdfRequestRetrieveInputWdmMdl调用与 fail_library1.c#L77 的MmGetMdlByteOffset调用。这种方式同时验证了 SDV 的**库处理Library Processing**能力——SDV 会像分析驱动一样分析其依赖的库源码再联合驱动调用点做全路径检查。在 Visual Studio 中运行 SDV完整操作步骤以下是 README 给出的标准流程结合工程文件补充了关键前提说明。步骤 1启动 SDV在解决方案资源管理器中选中驱动项目fail_driver1从Driver菜单点击Launch Static Driver Verifier...。此时会打开 Static Driver Verifier 应用程序窗口可在此控制、配置并调度一次静态分析。前提说明fail_driver1.vcxprojtools/sdv/samples/SDV-FailDriver-KMDF/driver/fail_driver1.vcxproj中DriverType设为KMDF、DriverTargetPlatform设为UniversalSDV 正是依据这些工程属性自动识别驱动类型并匹配默认规则集。步骤 2添加驱动依赖的库fail_driver1示例驱动包含一个库。点击Libraries选项卡再点击Add Library浏览到示例库目录并选择库工程文件fail_library1.vcxproj。关键约束库必须在 SDV 分析驱动之前添加。SDV 需要先解析库的源码如fail_library1.c中的SDVTest_wdf_*函数才能在驱动调用点展开完整路径分析。这与解决方案文件中声明的项目依赖SDV-FailDriver-KMDF.sln#L13-L15一致但注意两者是不同层面的配置工程依赖保证编译顺序SDV 的 Libraries 配置则决定静态分析范围。步骤 3选择规则点击Rules选项卡选择要验证的 DDI 使用规则。SDV 会自动检测驱动类型WDF、WDM、NDIS 或 Storport并为该类型选择默认规则集。首次运行建议直接使用默认规则集若希望缩短分析时间可勾选Custom rule selection自定义规则选择。自定义规则选择操作勾选Custom rule selection点击Clear All然后仅勾选本 KMDF 示例对应的 8 条规则与sdv-user.sdv文件内容一致DriverCreateDeviceInitAPICtlDeviceFinishInitDeviceAddMdlAfterReqCompletedIoctlMemAfterReqCompletedIntIoctlAMdlAfterReqCompletedIntIoctlAMarkCancOnCancReqLocalStopAckWithinEvtIoStop这些规则属于 SDV 的 DDI 合规规则DDI Compliance Rules范畴其完整语义与背景可参考 WDK 文档中的对应规则页。步骤 4启动分析点击Main选项卡再点击Start。此时 SDV 会弹出提示告知静态分析已被调度、分析可能耗时较长点击OK继续。分析在后台进行期间可在Main选项卡观察状态与统计。查看与分析结果分析进行时SDV 实时报告状态分析完成后报告结果与统计信息。只要驱动违反任一 DDI 使用规则该结果即被记为缺陷defect。本示例共可发现 8 个缺陷——与 8 条注入规则一一对应。查看方式在Main选项卡的Results区域点击Rules选项卡其中列出上一次运行验证的每条规则及分析结果在Results列中点击Defect链接将打开 SDV 报告页Static Driver Verifier Report Page与缺陷查看器Trace Viewer。Trace Viewer 是理解缺陷的关键它以图形化方式展示从规则入口到违规代码路径的完整调用链帮助确认缺陷与源码中注入点的对应关系。例如 DriverCreate 规则的 Trace 会从DriverEntry进入路径上标示出 fail_driver1.c#L41 的违规调用。验证技巧修改缺陷观察 SDV 反应作为学习验证可以尝试注意仓库为只读请在本地副本中进行注释掉 fail_driver1.c 中某处SDVTest_wdf_*调用后重新运行 SDV对应规则的缺陷计数应减少。例如移除 L41 的SDVTest_wdf_DriverCreate()调用后DriverCreate 规则应不再报告缺陷——这直接验证了 SDV缺陷由注入代码触发的工作机制。同类示例速览其他驱动类型的 SDV 演示仓库在 tools/sdv/samples 下还提供了另外三个故障驱动示例结构与本文示例同构可用于对照不同驱动类型下的规则体系示例驱动类型注入缺陷数示例规则节选SDV-FailDriver-NDISNDIS5NdisAllocateMemoryWithTagPriority、Init_RegisterSG、Irql_Synch_FunctionSDV-FailDriver-STORPORTStorport7StorPortAllocatePool2、StorPortSpinLock、StorPortStartIoSDV-FailDriver-WDMWDM5CancelSpinLock、IrqlKeSetEvent、LowerDriverReturn其中 NDIS 示例同样要求先添加库其sdvmp.vcxproj与库工程的配合方式与 KMDF 示例一致而 WDM 示例的fail_driver1工程tools/sdv/samples/SDV-FailDriver-WDM/driver/fail_driver1.vcxproj则不依赖额外库可直接选择规则后运行适合作为最短上手路径。小结SDV-FailDriver-KMDF 是一个以缺陷注入为核心的 SDV 教学样本通过 8 处刻意构造的违规代码分布在驱动主体与辅助库中完整演示了从 Visual Studio 启动 SDV、添加依赖库、选择规则集、运行分析到解读 Trace Viewer 报告的全流程。它也是检验 SDV 配置是否正确、规则集是否生效的标准试纸——若 8 个缺陷不能全部被报告说明分析配置尤其是库处理环节存在问题。对刚接触驱动静态验证的开发者这是理解 DDI 合规规则与 SDV 工作机理最直接、可复现的入门素材。赞分享示例工程【免费下载链接】Windows-driver-samplesThis repo contains driver samples prepared for use with Microsoft Visual Studio and the Windows Driver Kit (WDK). It contains both Universal Windows Driver and desktop-only driver samples.项目地址https://gitcode.com/gh_mirrors/wi/Windows-driver-samples点击查看免费下载相关推荐Windows-driver-samples 实战用 DV-FailDriver-WDM 验证 Driver Verifier 与 Device Fundamentals 测试如何捕获注入缺陷Windows driver samples 实战用 DV FailDriver WDM 验证 Driver Verifier 与 Device Fundam示例工程终极指南如何使用SDV对Windows-driver-samples进行静态分析检测驱动缺陷终极指南如何使用SDV对Windows driver samples进行静态分析检测驱动缺陷 Windows驱动程序开发是系统编程中的关键技术领域而 Win示例工程XIL性能优化指南提升热更新效率的7个实用技巧XIL性能优化指南提升热更新效率的7个实用技巧 XIL是基于ILRuntime实现的Unity3D热修复解决方案能帮助开发者快速修复游戏BUG而无需重新发布上一篇AMD Ryzen终极调试指南如何用SMU Debug Tool释放处理器全部性能下一篇ThinkPad双风扇终极控制指南如何高效管理散热与性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考