Преодоление устаревшего драйвера Windows программным способом - PullRequest
0 голосов
/ 19 ноября 2018

Я работаю над 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 Ответ

0 голосов
/ 22 ноября 2018

После некоторых экспериментов я обнаружил, что установка члена AddDevice DriverExtension объекта драйвера (который является параметром для DriverEntry функция) к ненулевому значению предотвращает выгрузку драйвера. настройка этот элемент обратно в 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, когда драйвер может быть выгружен и наоборот.

...