您的位置:首页 > 理论基础 > 计算机网络

ndis小端口驱动总结---发文于2014.1.1

2016-01-15 22:54 771 查看
安全软件中,小端口驱动主要用于虚拟网卡。

1.DriverEntry

 检查系统版本,创建驱动对象,注册Wrapper Handler包装巨柄,填写特征回调函数。

协议驱动有两个接收回调,但是小端口驱动没有接收回调,有发送回调。注册小端口驱动。初始化全局变量。

一个小端口驱动可以驱动同一类型芯片的n个网卡,每一个网卡,可能是虚拟的,被称为一个实例(Instance).

需要一个链表保存实例信息。

AdapterContext适配器上下文可以用来做为参数传入,比如MPSendPackets中用哪个网卡发包。可以用函数

NdisMSetAttributeEx来设置适配器上下文。

2.MPInitialize

在发现每个实例时被windows内核调用,用于分配内存实现对适配器初始化,生成小端口设备对象。设置适配器上下文。

然后启动网卡。

3.MPHalt

在网卡被拔出或者停止工作时被调用,释放所有资源。释放并解除所有映射过的io端口,取消注册的所有中断。取消

注册的关机回调。释放队列中的发送包。

4.打开ndisprot设备

要通过ndisprot发送和接收包,需要打开ndisprot的设备对象,通过ZwCreateFile,ZwReadFile,ZwWriteFile是可以的。

wdf下一般用IO target。WdfIoTargetCreate函数创建设备,WdfIoTargetOpen指定目标设备。有了句柄之后使用WdfIoTargetSendIoctlSynchronously发送控制请求。打开设备后,想ndisprot的控制设备发送IOCTL_NDISPROT_BIND_WAIT

的控制请求等待绑定完成。不断发送IOCTL_NDISPROT_QUERY_BINDING查询绑定,直到找到第一个名字与ndisedge生成实例不同的绑定,

或者遍历完都没找到。如果找到,就发送IOCTL_NDISPROT_OPEN_DEVICE指定使用设备绑定发送接收数据包。这个在InitializeHandler处理

函数调用NICInitAdapterWorker中完成。

5. 使用ndisprot发送包

上层应用程序请求发包时,windows内核调用SendPacketsHandler处理函数发包。包描述符合发包个数都在参数中给出。在发包函数中,

把PacketArray中的包逐个拷贝出,每个包的数据都拷贝到一个连续的缓冲区中,应为ndisprot只能接收连续的数据缓冲区。向Adapter->IoTarget发送写请求,最终通过WdfRequestSend实现,在该函数中设置完成回调。每个包发完后需要调用NdisMSendComplete,让上层协议驱动收到SendCompelteHandler判断包的完成状态。ndisedge的开发者自己定义了一个结构TCB用来保存发送一个包所需要的各种资源,便于发送时调用方便。在SendPacketsHandler处理函数MPSendPackets中先把一个包的数据拷贝到一个TCB的pData中.MPSendPackets提供的是一个包描述符数组,后面发送的是TCB链,所以需要从TCB空闲链表中拿出TCB容纳数组中的一个个包。wdf使用WdfIoTargetFormatRequestForWrite构建写请求。

6. 接收包

小端口驱动接收包由硬件中断通知,没有回调接口专门处理接包。编写物理网卡驱动时需要使用小端口的中断服务回调接口。当下层是

ndisprot协议驱动时,是创建工作任务workitem死循环不断的读取协议设备,一旦读请求完成函数中被调用,则提交包。小端口驱动收包后调用NdisMIndicateReceivePacket向上层协议驱动提交包。RCB用来保存发送包相关信息。在读请求完成函数中填充RCB结构。在函数

NICInitializeAdapter调用NICInitAdapterWorker,NICAllocRecvResources创建了提交包的工作任务。不断的从空闲RCB链表中取出RCB,

每个RCB都发送一次读请求。在工作任务的工作函数中,准备WDF读请求,向ndisprot设备io目标发送。在读请求完成函数中,调用NdisMIndicatePacket提交包,使协议驱动的接收包回调函数被调用。

7. 包的归还

上层协议引用包结束后,会调用NdisReturnPacket来通知小端口驱动减少引用计数,减少到0时,这个包就可以释放了。这个成为归还。小端口的ReturnHandler来处理这个计数。

8. oid查询,设置

查询在QueryInformationHandler中完成。设置在MPSetInformation中完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息