You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cl.exe/link.exe编译.sys驱动后无法停止的问题排查

命令行编译x64驱动后标记为NOT_STOPPABLE的排查方向

我正在研究MSVS构建按钮背后的编译流程,用MSVS的「KMDF Driver, Empty」预设创建项目,搭配以下最简x86_64驱动源码:

#define _AMD64_ //仅命令行编译时需定义,MSVS编译时需注释
#include <wdm.h>

void DriverUnload(IN PDRIVER_OBJECT DriverObj) {
    DbgPrint("Unloaded...");
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObj, IN PUNICODE_STRING RegPath) {
    DriverObj->DriverUnload = DriverUnload;
    DbgPrint("Loaded!");
    return STATUS_SUCCESS;
}

出现以下差异问题:

  • MSVS编译:构建无错误,加载驱动并通过sc create创建服务后,驱动标记为STOPPABLE,可正常停止(符合预期)。
  • 命令行编译:使用命令cl driver.c "D:\\Windows kits\\D:\\Windows Kits\\10\\Lib\\10.0.22621.0\\km\\x64\\NtosKrnl.lib" /I"D:\\Windows Kits\\10\\Include\\10.0.22621.0\\km" /link /SUBSYSTEM:NATIVE /DRIVER /KERNEL /ENTRY:DriverEntry编译成功,将输出的driver.exe改名为driver.sys后可正常加载,但创建服务后驱动标记为NOT_STOPPABLE,无法停止。

源码仅存在_AMD64_定义的差异,问题应出在编译/链接流程,以下是具体排查方向:

  • 补全KMDF相关依赖库链接:MSVS编译KMDF驱动时会自动链接KMDF框架的 stub 库(如WdfDriverStub.lib、WdfLdr.lib,对应你的Windows SDK版本),而当前命令行仅链接了NtosKrnl.lib。KMDF驱动需要通过这些库告知系统它支持动态卸载,缺少链接会导致系统识别不到卸载能力。
  • 核对_AMD64_定义的一致性:MSVS编译x64目标时会自动通过项目配置定义_AMD64_,手动在源码中定义可能导致头文件(如wdm.h)中与卸载相关的宏展开异常。可以查看wdm.h中关于DriverUnload的条件编译逻辑,确认手动定义和MSVS自动定义的效果是否一致。
  • 对比MSVS的完整编译/链接参数:打开MSVS项目的「生成日志」(项目属性→生成事件→生成日志文件),复制完整的cl和link命令,逐行对比自己的命令行参数,重点关注:
    • 是否遗漏了目标平台版本参数(如/VERSION:10.0.22621.0)
    • 是否存在影响服务属性的链接选项(如/MANIFESTUAC:NO)
    • 是否包含了KMDF相关的附加依赖库
  • 分析PE头与导入表差异:用dumpbin工具分别分析两个版本的driver.sys,对比以下内容:
    • Optional Header中的Subsystem、Characteristics字段
    • 导入表中的函数列表(MSVS编译版本应包含KMDF框架的初始化函数)
      系统会通过这些PE信息判断驱动是否支持卸载能力。
  • 确认服务创建命令一致性:核对两次使用的sc create命令是否完全一致,虽然驱动加载正常,但服务参数的细微差异也可能影响停止标记(此可能性较低,但可排除)。

内容的提问来源于stack exchange,提问作者Vlad Ponomarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:43:11