深度剖析WinPcap之(六)——驱动程序的初始化与清除(4)

本文转自http://eslxf.blog.51cto.com/918801/198043

 

1.4        NPFDriverUnload函数

驱动程序的 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 );
}
 
其中 IoDeleteSymbolicLinkIoDeleteDeviceNdisDeregisterProtocol 系统接口函数的说明分别如下:
 
函数 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 所返回的句柄。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值