卸载Windows驱动程序

5

一段时间之前,我决定学习如何编写驱动程序。不幸的是,由于测试驱动程序需要能够卸载而无需重新启动机器,我并没有走得太远。现在我回来了,但我自己就是无法解决这个问题。

现在,为了更直接地提出问题,您肯定想看到这个:

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 然后能够卸载它的程序,请提供链接或名称。不需要源代码,可执行文件即可。反之亦然。谢谢。

使用VisualDDK在虚拟机中进行调试? - Alex K.
它可以在没有VS的IDE的情况下工作吗? - Pyjong
@gbjbaanb:好的,这确实是一些进展,驱动程序不会停留太久,但是我至少可以看到“卸载”消息,非常感谢。 - Pyjong
@stupid_idiot ta。已为您添加答案。请查看此答案,了解在您的驱动程序中设置断点的详细信息。这里是相关说明。 - gbjbaanb
2个回答

1

0

好的,问题在于我使用了/driver:wdm链接,因为我看了一篇较旧的教程。这是错误的,现在你只能在遗留驱动程序的DriverEntry中使用IoCreateDevice,这意味着正确的选项只是/driver。抱歉我不理解I/O管理器的行为,但如果你遇到了同样的问题,只需摆脱那个wdm标志就可以卸载它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接