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

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示: 1.2.2 设置卸载例程和IRP的派遣函数在DriverEntry函数中,一般设置卸载例程和IRP的派遣函数,深度剖析WinPcap之(六)——驱动程序的初始化与清除(8),设置卸载例程和设置派遣函数都是对驱动对象的设置,设备对象中的MajorFunction是一个函数指针数组,NPF驱动程序也

1.2.2        设置卸载例程和IRP的派遣函数

在DriverEntry函数中,一般设置卸载例程和IRP的派遣函数。设置卸载例程和设置派遣函数都是对驱动对象的设置。设备对象中的MajorFunction是一个函数指针数组,IRP_MJ_CREATE、IRP_MJ_ CLOSE、IRP_MJ_WR'lTE等代表数组的第几个元素。下列为NPF的DriverEntry函数中的设置:

DriverObject->MajorFunction[IRP_MJ_CREATE] = NPF_Open;
DriverObject->MajorFunction[IRP_MJ_CLOSE]  = NPF_Close;
DriverObject->MajorFunction[IRP_MJ_CLEANUP]= NPF_Cleanup;
DriverObject->MajorFunction[IRP_MJ_READ]   = NPF_Read;
DriverObject->MajorFunction[IRP_MJ_WRITE]  = NPF_Write;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = NPF_IoControl;
DriverObject->DriverUnload = NPF_Unload;// 卸载例程

1.2.3        获取系统中可用网络适配器的信息

函数getAdaptersList 获取系统中可用的网络适配器信息,返回一个包含系统中可用网络适配器列表的字符串。如果getAdaptersList失败了,NPF试图通过调用 getTcpBindings函数获得绑定了TCP/IP的网络适配器信息。函数getTcpBindings返回指向包含绑定了TCP/IP适配器的注册表键值的指针。

下面为DriverEntry函数中相关的代码。

bindP = getAdaptersList();
if (bindP == NULL)
{
              //在注册表中没找到适配器,试图复制TCP-IP绑定的适配器
              tcpBindingsP = getTcpBindings();
                   
              if (tcpBindingsP == NULL)
              {
                     //没有找到绑定了TCP/IP的适配器,程序执行错误处理
                     goto RegistryError;
              }
                   
              bindP = (WCHAR*)tcpBindingsP;
              bindT = (WCHAR*)(tcpBindingsP->Data);
}
else {
              bindT = bindP;
}
 
for (; *bindT != UNICODE_NULL;
bindT += (macName.Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR))
{
              RtlInitUnicodeString(&macName, bindT);
NPF_CreateDevice(DriverObject, &macName);//给网络适配器创建一个设备
}

1.2.4        对可用的网络适配器创建一个设备

函数NPF_CreateDevice对一个给定的网络适配器创建一个设备。NPF驱动程序也调用NPF_CreateDevice函数,通过IoCreateDevice系统接口把Open/close,read/write与IOCTL请求的句柄地址传递给操作系统。

上一页  3 4 5 6 7 8 

Tags:深度 剖析 WinPcap

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