前段时间我决定学习如何编写驱动程序。不幸的是,我并没有走得太远,因为对于驱动程序的测试而言,能够在不需要重新启动机器的情况下卸载驱动程序是非常重要的。现在我回到了它,但我无法独自完成它。
现在我想只是为了让问题更直接,你肯定想看到这个:
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 ON启动并且不需要任何签名。有点奇怪的是,除非我在入口函数中创建设备,否则加载不起作用。只有这样我才能在\ Driver目录中找到带有winobj的驱动程序。我也在另一台安装了Win7的机器上尝试过,但事实证明本地设置不是问题。如果您认识到这种内核行为,我真的很想听,谢谢。
实际上,如果知道一些可以加载.sys然后能够卸载它的程序,请删除一个链接或名称。源代码不是必需的,可执行文件应该做..反之亦然..谢谢。
答案 0 :(得分:1)
驱动程序开发 - 使用OSR Driver Loader
答案 1 :(得分:0)
好的问题是我与/ driver:wdm链接,因为我读了一个较旧的教程。现在这是错误的,你只能在传统驱动程序中的DriverEntry中使用IoCreateDevice,这意味着正确的选项只是/驱动程序。对不起,我不明白I / O管理器的行为,但如果你遇到同样的问题,只需摆脱那个wdm标志,它就会卸载。