我正在更深入地了解编译过程的内部工作原理,换句话说,当我按下 MSVS 中的构建按钮时,幕后发生了什么。
#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 中编译:
使用命令行工具编译:
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++ -> 命令行选项),对于链接器也是如此,但这不起作用,因为有大量选项并且它们都需要不同类型的库、定义的环境变量等...
这就是我来这里的原因 - 向经验丰富的低级程序员寻求帮助:)也许有人可以给我指出正确的方向,这样我至少可以缩小问题的范围。
我认为“KMDF Driver,Empty”会创建一个匹配的.inf文件,默认安装将是可卸载的,用于开发和调试。
您如何“加载”您的版本?您有 .inf 文件吗?它包含什么?