通过编程使Windows旧版驱动程序不可停止

时间:2018-11-19 17:10:33

标签: windows kernel driver drbd

我正在使用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标志?谢谢,祝你好运,约翰内斯

1 个答案:

答案 0 :(得分:1)

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

因此,要防止驱动程序被卸载,请执行

theDriverObject->DriverExtension->AddDevice = theAddDeviceFunction;

要使其再次卸载,请执行

theDriverObject->DriverExtension->AddDevice = NULL;

(其中AddDeviceFunction可能是一个仅返回错误值的函数,如下所示:

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

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