我正在使用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标志?谢谢,祝你好运,约翰内斯
答案 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标志的值变得没有意义了。 可以卸载驱动程序,反之亦然。