驱动程序的初始化与清除
来源:互联网 发布:linux cp出某个文件 编辑:程序博客网 时间:2024/06/08 15:34
驱动程序的DriverUnload例程主要负责删除设备与取消符号连接,同时也可释放在DriverEntry中所分配的资源。当数据包捕获驱动程序卸载时,操作系统调用NPF_Unload函数。调用IoDeleteSymbolicLink函数删除符号连接,调用IoDeleteDevice函数删除设备对象,并调用NdisDeregisterProtocol函数从NDIS中取消注册,并释放各相关资源。
NPF中的NPF_Unload的具体实现如下:packetNtxdriverpacket.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所返回的句柄。
NPF中的NPF_Unload的具体实现如下:packetNtxdriverpacket.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所返回的句柄。
0 0
- 驱动程序的初始化与清除
- 深度剖析WinPcap之(六)——驱动程序的初始化与清除(1)
- 深度剖析WinPcap之(六)——驱动程序的初始化与清除(2)
- 深度剖析WinPcap之(六)——驱动程序的初始化与清除(3)
- 深度剖析WinPcap之(六)——驱动程序的初始化与清除(4)
- c++的初始化与清除
- arx .net api 的初始化与清除
- 初始化与清除
- 对象初始化与清除
- 初始化与清除
- 第四章 初始化与清除
- 第六章 初始化与清除
- C++的初始化与清除(补充1)
- 第4章:初始化与清除
- 第4章 初始化与清除
- 第6章 初始化与清除
- C++编程思想--初始化与清除
- 第4章 初始化与清除
- Eclipse使用技巧
- JAVA MemCache 史无前例的详细讲解!看完包精通MEMCACHE!
- Abap-Smartforms中如何去掉开头的中文文本
- android项目中如何加载已有so库
- 第二章、SpringMVC学习-入门
- 驱动程序的初始化与清除
- fireFox插件Selenium IDE
- Android如何获取Wifi名称即SSID
- Cscope的使用(领略Vim + Cscope的强大魅力)
- memcached简介及java使用方法
- 解释在维基百科
- C#2005中使用控件DataGridView实现对数据库增删改查操作
- Linux 多核编程
- node.js基础主要参考阿里巴巴国际站前端技术部推出的文档