以编程方式使 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 标志的值变得毫无意义。当
可以卸载驱动程序,反之亦然。
我正在开发 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 标志的值变得毫无意义。当 可以卸载驱动程序,反之亦然。