Преодоление устаревшего драйвера 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, когда драйвер может быть выгружен, и наоборот.