一段时间之前,我决定学习如何编写驱动程序。不幸的是,由于测试驱动程序需要能够卸载而无需重新启动机器,我并没有走得太远。现在我回来了,但我自己就是无法解决这个问题。
现在,为了更直接地提出问题,您肯定想看到这个:
VOID Unload(PDRIVER_Object DriverObject)
{
DbgPrint("Unload\r\n");
}
并且
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
DbgPrint("Entry\r\n");
pDriverObject->DriverUnload = Unload;
return STATUS_SUCCESS;
}
在 DbgView 中,它打印了“Entry”消息,但卸载驱动程序时并没有打印“Unload”消息。实际上,尝试停止驱动程序服务会将其状态更改为 NOT_STOPPABLE。然后,如果我想再试一次,我就必须重新启动。我使用的是 Windows 7,并且在打开 TESTSIGNING 并且不需要签名的情况下,我尝试过相同的结果。一个有点奇怪的事情是,除非我在 entry 函数中创建设备,否则加载也不起作用。只有这样,我才能在 \Driver 目录中使用 winobj 找到我的驱动程序。我还在另一台安装了 Win7 的机器上尝试过,但结果表明本地设置不是问题的原因。如果您认识这种内核行为,请告诉我,谢谢。
实际上,如果知道某些可以加载 .sys 然后能够卸载它的程序,请提供链接或名称。不需要源代码,可执行文件即可。反之亦然。谢谢。