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

1 ответ

Решение

После некоторых экспериментов я обнаружил, что установка элемента AddDevice DriverExtension объекта драйвера (который является параметром функции DriverEntry) в значение, отличное от NULL, предотвращает выгрузку драйвера. Установка этого элемента обратно в NULL позволяет пользователю снова выгружать драйвер с помощью sc stop.

Чтобы предотвратить выгрузку драйвера, сделайте

theDriverObject->DriverExtension->AddDevice = theAddDeviceFunction;

чтобы сделать его снова загружаемым, сделайте

theDriverObject->DriverExtension->AddDevice = NULL;

(где theAddDeviceFunction может быть функцией, которая просто возвращает значение ошибки, как в:

NTSTATUS theAddDeviceFunction(
         PDRIVER_OBJECT DriverObject,
         PDEVICE_OBJECT PhysicalDeviceObject)
{
    return STATUS_NO_SUCH_DEVICE;
}

)

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

Другие вопросы по тегам