【问题标题】:How to unload Windows Kernel Mode Driver from the inside?如何从内部卸载 Windows 内核模式驱动程序?
【发布时间】:2013-11-10 18:34:34
【问题描述】:

我正在编写一个 Windows 内核驱动程序,我正在尝试实现以下内容。

假设驱动程序已通过具有特定 IOCTL 代码的 DeviceIoControl 函数从用户模式调用。在这种情况下,驱动程序如何自行卸载?也就是说,如何实现与运行net stop 命令相同的行为?

更准确地说,实现DispatchDeviceControl callback时应该写什么

NTSTATUS IoctlDeviceControl(PDEVICE_OBJECT pDeviceObject, PIRP pIrp) {
    // some code...

    switch (ioctlCode) {
        case IOCTL_MY_UNLOAD:  <---
        ...
    }

    return Status;
}

【问题讨论】:

  • 尝试使用IoDeleteDevice(),但此功能很大程度上取决于驱动程序的类型。如果你有一个用户模式应用程序,你可以使用 WIN32 api 来停止类似于net stop 的服务,但以编程方式完成。

标签: windows kernel driver windows-kernel


【解决方案1】:

你可以使用ZwUnloadDriver内核函数!

文档:

ZwUnloadDriver 例程从系统中卸载驱动程序。用这个 例行公事,极其谨慎。 (请参阅以下备注部分。)

C/C++ 定义:

NTSTATUS ZwUnloadDriver(
  _In_  PUNICODE_STRING DriverServiceName
);

MSDN 来源:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff567117(v=vs.85).aspx

【讨论】:

  • 驱动程序能否通过此调用自行卸载?这似乎有问题,因为一个线程当前正在该驱动程序中执行代码。当 ZwUnloadDriver 返回时,线程仍然存在,但不再加载驱动程序映像。这怎么能行?
猜你喜欢
  • 2021-06-22
  • 2011-03-24
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多