Можно ли выгрузить драйвер ядра без перезагрузки? - PullRequest
7 голосов
/ 30 января 2011

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

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

Ответы [ 4 ]

4 голосов
/ 31 января 2011

Глядя на журналы программы установки API, можно начать: http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

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

3 голосов
/ 14 февраля 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; 
}
3 голосов
/ 30 января 2011

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

1 голос
/ 06 января 2014

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

#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 Driver Loader , зарегистрируйте драйвер, «Запустите службу». Вы увидите сообщение журнала «DriverEntry» в DbgView. Теперь в загрузчике драйверов OSR, «Остановите службу» и наблюдайте сообщение Unload. Надеюсь, это поможет вам.

...