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
从系统中删除一个符号连接。
IoDeleteSymbolicLink(
IN PUNICODE_STRING SymbolicLinkName
输入参数
SymbolicLinkName
指向一个
Unicode
字符串,该字符串是用户可见的符号连接。
如果符号连接删除成功函数返回
STATUS_SUCCESS
。
函数
IoDeleteDevice
从系统中删除一个设备对象
,例如,当一个底层的设备从系统中被删除时。
IoDeleteDevice(
IN PDEVICE_OBJECT DeviceObject
输入参数
DeviceObject
指向被删除的设备对象。
函数
NdisDeregisterProtocol
释放驱动程序调用
NdisRegisterProtocol
函数所分配的资源。
NdisDeregisterProtocol(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisProtocolHandle
输出参数
Status
指向调用者提供的一个变量,函数返回时被设置为
NDIS_STATUS_SUCCESS
。输入参数
NdisProtocolHandle
指定驱动程序初始化时调用
NdisRegisterProtocol
所返回的句柄。