是否可以在不重启的情况下卸载内核驱动程序?

时间:2011-01-30 17:36:58

标签: windows-7 service kernel driver reboot

我正在玩Win7 DDK中的一个内核驱动程序示例。我可以修改编译并构建我的* .sys文件。我也可以使用INF(使用设备管理器或devcon)或直接使用服务控制管理器来安装它。当我进行下一次更改并生成更新的* .sys文件时,我似乎在这个新文件和我现在停止的驱动程序之间发生冲突(我尝试过使用Servcie控制管理器'停止'和'删除服务'等)。如果我重新启动,我可以安装新驱动程序并运行正常。同样,如果我在“设备管理器”中选择“卸载”,Windows会提示我重新启动。

那么,如何轻松地轻松测试对内核驱动程序的增量修改? 谢谢

4 个答案:

答案 0 :(得分:4)

查看安装程序API日志可能是一个很好的起点:http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

如果devcon提示重新启动,你可以查看DDK中的代码,调试它为什么要问这个问题并以这种方式深入研究。

答案 1 :(得分:3)

是。 sc stop <driver name>应该阻止你的司机。如果您的驱动程序与特定的PnP devnode相关联,则应该在删除devnode后卸载它。

答案 2 :(得分:3)

如果您希望能够卸载驱动程序,则必须设置一个基本上每次卸载驱动程序时执行的功能 - 很可能您将放置释放已分配缓冲区的代码以及可能“活动”的任何其他资源在驱动程序的生命周期中。这是一个示例代码:

VOID  Unload(IN  PDRIVER_OBJECT  pDriverObject) { 
                 //do whatever you like here
                //this deletes the device
        IoDeleteDevice( pDriverObject->DeviceObject);


    return;
}

NTSTATUS  DriverEntry(IN  PDRIVER_OBJECT  pDriverObject,  IN  PUNICODE_STRING  regPath) { 


    //initialize your driver and the major function array 

//set the unload function 
    pDriverObject->DriverUnload  =  &Unload; 
}

答案 3 :(得分:1)

尝试编译,签名和加载此代码:

#include <ntddk.h>     
VOID OnUnload( IN PDRIVER_OBJECT driverObjectA ) {
    DbgPrint("Unload\n");
}
NTSTATUS DriverEntry( PDRIVER_OBJECT driverObjectA, PUNICODE_STRING RegistryPath ){
    DbgPrint("DriverEntry\n"); 
    driverObjectA->DriverUnload = OnUnload;
return STATUS_SUCCESS;
}  

然后下载DebugView,解压缩,以管理员身份运行,然后在“Capture”菜单项下“Capture Kernel”。下载,解压缩并运行OSR Driver Loader,注册驱动程序,“启动服务”。您将在DbgView中观察到“DriverEntry”日志消息。现在在OSR驱动程序加载程序中,“停止服务”并观察卸载消息。希望这能让你前进。