2013-10-30 166 views
1

我在寫一個Windows內核驅動程序,我試圖實現以下內容。如何從內部卸載Windows內核模式驅動程序?

假設驅動程序已經通過DeviceIoControl函數用戶模式調用了特定的IOCTL代碼。在這種情況下駕駛員如何卸載?換句話說,如何實現與運行net stop命令一樣的行爲?

更確切地說,實施DispatchDeviceControl callback

NTSTATUS IoctlDeviceControl(PDEVICE_OBJECT pDeviceObject, PIRP pIrp) { 
    // some code... 

    switch (ioctlCode) { 
     case IOCTL_MY_UNLOAD: <--- 
     ... 
    } 

    return Status; 
} 
+0

嘗試使用'IoDeleteDevice()',但此功能高度依賴於您的驅動程序的類型。如果您有一個用戶模式應用程序,則可以使用WIN32 API來停止類似於「net stop」的服務,但以編程方式完成。 – Rohan

回答

3

時,您可以使用ZwUnloadDriver內核函數,我應該寫什麼!

文檔:

的ZwUnloadDriver程序卸載來自系統的驅動程序。極其謹慎地使用這個 例程。 (參見下面的註釋部分。)

C/C++定義:

NTSTATUS ZwUnloadDriver(
    _In_ PUNICODE_STRING DriverServiceName 
); 

MSDN來源:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff567117(v=vs.85).aspx

+2

驅動程序可以使用此調用來卸載自己嗎?這看起來有問題,因爲線程當前正在該驅動程序中執行代碼。當ZwUnloadDriver返回時,線程仍然存在,但驅動程序映像不再加載。這是如何工作的? –

相關問題