0

我正在研究 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 标志?谢谢和最美好的祝愿,约翰内斯

4

1 回答 1

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 标志的值变得毫无意义.. 当驱动程序可以卸载时,它可能会显示 NOT STOPPABLE,反之亦然。

于 2018-11-22T16:04:02.517 回答