如何从内部卸载Windows内核模式驱动程序?

ElT*_*hor 6 windows kernel driver windows-kernel

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

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

更准确地说,在实现DispatchDeviceControl 回调时我应该写什么

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

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

    return Status;
}
Run Code Online (Sandbox Code Playgroud)

小智 6

您可以使用ZwUnloadDriver内核函数!

文档:

ZwUnloadDriver 例程从系统中卸载驱动程序。使用此例程时要格外小心。(请参阅以下备注部分。)

C/C++ 定义:

NTSTATUS ZwUnloadDriver(
  _In_  PUNICODE_STRING DriverServiceName
);
Run Code Online (Sandbox Code Playgroud)

MSDN 来源:

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

  • 驱动程序可以通过此调用卸载自身吗?考虑到线程当前正在该驱动程序中执行代码,这似乎是有问题的。当ZwUnloadDriver返回时,线程仍然存在,但不再加载驱动程序映像。那怎么行得通呢? (3认同)