Делаем устаревший драйвер Windows неостанавливаемым программно

Я работаю над 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? Спасибо и наилучшие пожелания, Йоханнес


person Johannes Thoma    schedule 19.11.2018    source источник


Ответы (1)


После некоторых экспериментов я обнаружил, что установка для члена AddDevice DriverExtension объекта драйвера (который является параметром функции 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;
}

)

Обратите внимание, что при этом значение флага STOPPABLE, напечатанное запросом sc, становится бессмысленным. Он может сказать NOT STOPPABLE, когда драйвер может быть выгружен, и наоборот.

person Johannes Thoma    schedule 22.11.2018