【问题标题】:Is it possible to unload a kernel driver without a reboot?是否可以在不重新启动的情况下卸载内核驱动程序?
【发布时间】:2011-06-18 04:19:52
【问题描述】:

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

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

【问题讨论】:

  • 一般来说,是的,这是可能的,至少当您通过 API 函数安装驱动程序时。不确定是否可以使用 INF 文件安装驱动程序。

标签: windows-7 service kernel driver reboot


【解决方案1】:

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

【讨论】:

  • @Larry:它没有关联,但也没有——它只是一组简单的 IOTCRL。
  • 愚蠢的问题:您是否在驱动程序的调度中设置了驱动程序卸载入口点?
【解决方案2】:

查看 Setup API 日志可能是一个不错的起点:http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

如果 devcon 提示重新启动,您可以查看 DDK 中的代码,调试它询问的原因并以这种方式深入研究问题。

【讨论】:

    【解决方案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; 
    }
    

    【讨论】:

      【解决方案4】:

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

      #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 Driver loader 中,“Stop Service”并观察 Unload 消息。希望这能让你继续前进。

      【讨论】:

        猜你喜欢
        • 2015-04-30
        • 1970-01-01
        • 2020-02-15
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 2016-10-28
        相关资源
        最近更新 更多