天天看點

深度剖析WinPcap之(六)——驅動程式的初始化與清除(4)

本文轉自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 所傳回的句柄。

繼續閱讀