【问题标题】:Making Windows legacy driver non-stoppable programmatically以编程方式使 Windows 旧版驱动程序不可停止
【发布时间】:2019-04-22 02:30:45
【问题描述】:

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

【问题讨论】:

    标签: windows kernel driver drbd


    【解决方案1】:

    经过一些实验,我发现设置驱动对象的DriverExtension的AddDevice成员(这是DriverEntry的一个参数) function) 设置为非 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 当 驱动程序可以卸载,反之亦然。

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2014-11-17
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多