以编程方式使 Windows 遗留驱动程序不可停止

Making Windows legacy driver non-stoppable programmatically

我正在开发 WinDRBD:https://github.com/LINBIT/windrbd

此驱动程序是可停止的(因此 sc stop windrbd 有效)。但是在某些时候(当配置了 DRBD 设备时)我想阻止用户停止驱动程序。

驱动程序链接到

/DRIVER /SUBSYSTEM:WINDOWS /NODEFAULTLIB /ENTRY:DriverEntry

并且未设置 AddDevice(而已设置 DriverUnload 并执行正确的操作 (TM))。

我正在寻找的是一些内核 API 调用,它设置和重置驱动程序的 STOPPABLE 标志。我试图引用根设备/驱动程序对象(通过 ObReferenceObjectByPointer()),这不会阻止驱动程序停止。我还尝试打开根设备对象的文件句柄(这会阻止驱动程序被卸载,它会卡在 STOP_PENDING 中),但是根设备对象无法再打开(这是需要的将剩余的资源调低)。

有没有办法以编程方式控制 STOPPABLE 标志?谢谢并祝你好运,约翰内斯

经过一些实验,我发现设置驱动对象的DriverExtension的AddDevice成员(它是DriverEntry的一个参数) 函数)设置为非 NULL 值可防止驱动程序被卸载。环境 此成员返回 NULL 允许用户再次通过 sc stop 卸载驱动程序。

所以为了防止驱动程序被卸载,

theDriverObject->DriverExtension->AddDevice = theAddDeviceFunction;

要使其再次可卸载,请执行

theDriverObject->DriverExtension->AddDevice = NULL;

(其中 AddDeviceFunction 可能是一个 returns 错误值的函数,如:

NTSTATUS theAddDeviceFunction(
         PDRIVER_OBJECT DriverObject,
         PDEVICE_OBJECT PhysicalDeviceObject)
{
    return STATUS_NO_SUCH_DEVICE;
}

)

请注意,通过这样做,由 sc 查询打印的 STOPPABLE 标志的值变得毫无意义。当 可以卸载驱动程序,反之亦然。