Кто видел драйвер с AddDevice загружаемый через SCM ?
после выхода из DriverEntry вызывается _IopIsLegacyDriver в ее основе лежит проверка DriverObject->DeviceExtension->AddDevice, в случае если там окажется адрес процедуры то после возрата следует цепочка из недокументированных подпрограмм часть из них вроде рыщет в реестре , и в итоге у меня выгружается драйвер =>
Что нужно добавить в DriverObject до выхода ?
Загрузка драйвера вроде бы осуществляется системным потоком поэтому я пока не могу понять что он вызывает может кто это знает ? =>
что происходит перед вызавом DriverEntry ?
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDeviceIoControl;
DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverClose;
Устанавливается процедура, вызываемая при выгрузке:
DriverObject->DriverUnload = DriverUnload;
Если драйвер поддерживает pnp, то функция, вызываемая при обнаружениии устройства:
DriverObject->DeviceExtension->AddDevice = DriverAddDevice;
Ваш драйвер выгружается возможно из-за того, что DriverEntry возвращает код, отличный от STATUS_SUCCESS
Также возможно, не хватает диспетчера IRP_MJ_PNP
Также возможно, не хватает диспетчера IRP_MJ_PNP
нет несмотря на возврат DriverEntry StatusSuccess система его дальше подменяееит и выгружает драйвер иммено из-за того что в DriverObject->DriverExtension->AddDevice расположен не 0
Цитата:
из-за того что в DriverObject->DriverExtension->AddDevice расположен не 0
А как Вы узнаете, что драйвер выгружен. Unload вызывается? Может драйвер не выгружается? В принципе, система не обязана вызывать AddDevice в любом случае. В этом случае драйвер будет просто висеть без дела. AddDevice будет вызвана при обнаружении определенного физического устройства (например, для ЮСБ - с заданными VID и PID). Далее сканируется реестр на предмет обнаружения сервиса с подходящим Enum (CurrentControlSet/Services)