WEB开发网
开发学院操作系统windows 2008 深度剖析WinPcap之(六)——驱动程序的初始化与清除... 阅读

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示:1.4 NPF的DriverUnload函数驱动程序的DriverUnload例程主要负责删除设备与取消符号连接,同时也可释放在DriverEntry中所分配的资源,深度剖析WinPcap之(六)——驱动程序的初始化与清除 (4),当数据包捕获驱动程序卸载时,操作系统调用NPF_Unload函数,VOID NdisDe

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所返回的句柄。

出处:http://eslxf.blog.51cto.com/918801/198043

Tags:深度 剖析 WinPcap

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接