使用命令行工具(cl.exe | link.exe)编译.sys驱动程序

问题描述 投票:0回答:1

我正在更深入地了解编译过程的内部工作原理,换句话说,当我按下 MSVS 中的构建按钮时,幕后发生了什么。

  • 我已经使用 MSVS 中预设的“KMDF 驱动程序,空”构建了解决方案和项目
  • 我有一个最简单的驱动程序(x86_64)的源代码,只有入口和卸载例程:
#define _AMD64_ // required only when I compile via command line tools, MSVS does not like it, and I comment it out when I compile with 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 中编译:

  • 按下构建按钮(在后台运行 MSBuild.exe)后,编译顺利进行,没有任何错误。
  • 然后,在加载 driver.sys 并通过 sc create ... 创建关联服务后,它被视为 STOPPABLE,我可以停止它。
  • 这是预期的行为

使用命令行工具编译:

  • cl driver.c "D:\Windows 套件\D:\Windows 套件\Lib .0.22621.0\km\x64\NtosKrnl.lib" /I"D:\Windows 套件\包括 .0.22621。 0\km" /link /SUBSYSTEM:NATIVE /DRIVER /KERNEL /ENTRY:DriverEntry

  • 当我使用上面的命令通过命令行工具编译相同的源代码时 - 编译正确执行,然后我将输出的 driver.exe 重命名为 driver.sys - 它也正确加载。

  • 但是,在这种情况下,创建关联服务后,驱动程序被视为NOT_STOPPABLE,我无法停止它。

为什么会这样?什么会影响驾驶员的“可停车性”?源代码完全相同(除了#define AMD64),所以问题一定出在编译过程中的某个地方。

我尝试直接从 MSVS 复制 cl.exe 编译器的所有选项(项目配置 -> C/C++ -> 命令行选项),对于链接器也是如此,但这不起作用,因为有大量选项并且它们都需要不同类型的库、定义的环境变量等...

这就是我来这里的原因 - 向经验丰富的低级程序员寻求帮助:)也许有人可以给我指出正确的方向,这样我至少可以缩小问题的范围。

c windows compilation kernel driver
1个回答
0
投票

我认为“KMDF Driver,Empty”会创建一个匹配的.inf文件,默认安装将是可卸载的,用于开发和调试。

您如何“加载”您的版本?您有 .inf 文件吗?它包含什么?

© www.soinside.com 2019 - 2024. All rights reserved.