本文轉自http://eslxf.blog.51cto.com/918801/198043
1.4 NPF的DriverUnload函數
驅動程式的 DriverUnload例程主要負責删除裝置與取消符号連接配接,同時也可釋放在DriverEntry中所配置設定的資源。 當資料包捕獲驅動程式解除安裝時,作業系統調用 NPF_Unload 函數。調用 IoDeleteSymbolicLink 函數删除符号連接配接,調用 IoDeleteDevice 函數删除裝置對象,并調用 NdisDeregisterProtocol 函數從 NDIS 中取消注冊,并釋放各相關資源。 NPF中的 NPF_Unload 的具體實作 如下: packetNtx/driver/packet.c 620~670 VOID NPF_Unload(IN PDRIVER_OBJECT DriverObject) { PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT OldDeviceObject; PDEVICE_EXTENSION DeviceExtension; NDIS_STATUS Status; NDIS_STRING SymLink; DeviceObject = DriverObject->DeviceObject; while (DeviceObject != NULL) { OldDeviceObject = DeviceObject; DeviceObject = DeviceObject->NextDevice; DeviceExtension = OldDeviceObject->DeviceExtension; if (DeviceExtension->ExportString) { RtlInitUnicodeString(&SymLink, DeviceExtension->ExportString); //删除符号連接配接,并釋放相關資源 IoDeleteSymbolicLink(&SymLink); ExFreePool(DeviceExtension->ExportString); } //删除裝置對象 IoDeleteDevice(OldDeviceObject); } //從NDIS中取消注冊 NdisDeregisterProtocol(&Status,g_NdisProtocolHandle); // 釋放儲存擴充卡名稱的記憶體 ExFreePool( bindP ); } 其中 IoDeleteSymbolicLink 、 IoDeleteDevice 與 NdisDeregisterProtocol 系統接口函數的說明分别如下: 函數 IoDeleteSymbolicLink 從系統中删除一個符号連接配接。 NTSTATUS IoDeleteSymbolicLink( IN PUNICODE_STRING SymbolicLinkName ); 輸入參數 SymbolicLinkName 指向一個 Unicode 字元串,該字元串是使用者可見的符号連接配接。 如果符号連接配接删除成功函數傳回 STATUS_SUCCESS 。 函數 IoDeleteDevice 從系統中删除一個裝置對象 ,例如,當一個底層的裝置從系統中被删除時。 VOID IoDeleteDevice( IN PDEVICE_OBJECT DeviceObject ); 輸入參數 DeviceObject 指向被删除的裝置對象。 函數 NdisDeregisterProtocol 釋放驅動程式調用 NdisRegisterProtocol 函數所配置設定的資源。 VOID NdisDeregisterProtocol( OUT PNDIS_STATUS Status, IN NDIS_HANDLE NdisProtocolHandle ); 輸出參數 Status 指向調用者提供的一個變量,函數傳回時被設定為 NDIS_STATUS_SUCCESS 。輸入參數 NdisProtocolHandle 指定驅動程式初始化時調用 NdisRegisterProtocol 所傳回的句柄。