Можно ли выгрузить драйвер ядра без перезагрузки?

Я играю с одним из примеров драйвера ядра в Win7 DDK. Я могу изменить компиляцию и собрать свой файл *.sys. Я также могу установить его с помощью его INF (с помощью диспетчера устройств или devcon) или напрямую с помощью диспетчера управления службами. Однако, когда я делаю следующее изменение и создаю обновленный файл *.sys, у меня возникает конфликт между этим новым файлом и моим теперь остановленным драйвером (я пытался использовать «остановку» и «удаление службы» диспетчера Servcie Control Manager и т. д.). Если я перезагружусь, я могу установить новый драйвер и запустить его нормально. Точно так же, если я выберу удаление в диспетчере устройств, Windows предложит мне перезагрузиться.

Итак, как можно легко протестировать инкрементные модификации драйвера ядра? Спасибо


person Brian Frost    schedule 30.01.2011    source источник
comment
В целом да, это возможно, по крайней мере, при установке драйвера через API-функции. Не уверен, что это возможно с драйверами, установленными с помощью файла INF.   -  person Eugene Mayevski 'Callback    schedule 30.01.2011


Ответы (4)


Для начала неплохо было бы просмотреть журналы Setup API: http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

Если devcon запрашивает перезагрузку, вы можете посмотреть код в DDK, отладить, почему он запрашивает, и таким же образом разобраться в проблеме.

person Joshua Strouse    schedule 30.01.2011

да. sc stop <driver name> должен остановить вашего водителя. Если ваш драйвер связан с определенным узлом разработки PnP, его следует выгрузить после удаления узла разработки.

person ReinstateMonica Larry Osterman    schedule 30.01.2011
comment
@Larry: Это не связано, и все же это не так - это просто простой набор IOTCRL. - person Brian Frost; 31.01.2011
comment
Глупый вопрос: вы установили точку входа для выгрузки драйвера в диспетчере вашего драйвера? - person ReinstateMonica Larry Osterman; 05.02.2011

Если вы хотите иметь возможность выгружать свой драйвер, вам нужно настроить функцию, которая в основном выполняется каждый раз, когда драйвер выгружается - скорее всего, вы поместите код, который освобождает выделенные буферы и любой другой ресурс, который может быть «живым» в течение жизненного цикла. водителя. Вот пример кода:

VOID  Unload(IN  PDRIVER_OBJECT  pDriverObject) { 
                 //do whatever you like here
                //this deletes the device
        IoDeleteDevice( pDriverObject->DeviceObject);


    return;
}

NTSTATUS  DriverEntry(IN  PDRIVER_OBJECT  pDriverObject,  IN  PUNICODE_STRING  regPath) { 


    //initialize your driver and the major function array 

//set the unload function 
    pDriverObject->DriverUnload  =  &Unload; 
}
person LordDoskias    schedule 14.02.2011

Попробуйте скомпилировать, подписать и загрузить этот код:

#include <ntddk.h>     
VOID OnUnload( IN PDRIVER_OBJECT driverObjectA ) {
    DbgPrint("Unload\n");
}
NTSTATUS DriverEntry( PDRIVER_OBJECT driverObjectA, PUNICODE_STRING RegistryPath ){
    DbgPrint("DriverEntry\n"); 
    driverObjectA->DriverUnload = OnUnload;
return STATUS_SUCCESS;
}  

Затем загрузите DebugView, распакуйте его, запустите от имени администратора, а затем " Захват ядра» в пункте меню «Захват». Загрузите, разархивируйте и запустите загрузчик драйверов OSR, зарегистрируйте драйвер, " Запустить службу". Вы увидите сообщение журнала «DriverEntry» в DbgView. Теперь в загрузчике драйвера OSR нажмите «Остановить службу» и наблюдайте сообщение «Выгрузить». Надеюсь, это вас заводит.

person bowlofstew    schedule 06.01.2014