ndis协议驱动总结---发文于2013-12-30

来源:互联网 发布:淘宝企业店铺开店资料 编辑:程序博客网 时间:2024/05/01 20:28
协议驱动用于嗅探器,比如wincap就是协议驱动,不用于防火墙。
1.DriverEntry中
 填写协议特征NDIS_PROTOCOL_CHARACTERISTICS,就是协议的回调函数列表。
 调用NdisRegisterProtocol注册为协议驱动。
 创建设备对象及符号链接。
 系统会对每个存在的网卡实例,调用本协议驱动在协议特征集中提供的一个回调函数。故协议驱动适用于监听收包,不适合监听发包。
 这个回调函数中决定是否绑定网卡,绑定后,网卡收到的包会提交给协议驱动。
 应用层可以打开这个协议驱动,使用deviceioControl或者readfile,writefile使用这个协议发包。故需要填写分发函数,用于控制设备。
 一般的协议驱动都是绑定所有网卡。一个网卡也绑定多个协议。一般来说,一个数据包只会被一个协议处理,协议会无视它收到的并非本协议处理的数据包,比如tcp/ip和ipx。
2.绑定网卡适配器的回调实现。
 每当有一个网卡被绑定,则分配内存空间保存和这次绑定相关的信息及所用的资源,比如锁和队列,这就是打开上下文。
 绑定回调函数NdisProtBindAdapter的工作:
 a.打开上下文的分配和初始化。b。读取配置,判断执行环境c。保存打开上下文到全局链表,调用ndisprotCreateBinding完成实际绑定。
 ndisprotCreateBinding工作:
 实际绑定只需要NdisOpenAdapter,这个打开适配器就是将一个协议绑定到一个网卡,返回绑定句柄。
 由于支持即插即用,网卡随时卸载,故需要解决绑定的同步竞争问题。ndisprotCreateBinding函数的工作有三个:
 a。防止多线程竞争“打开上下文”。b。分配和初始化绑定相关资源,比如输入,输出缓冲区的包池及缓冲池。c。获得网卡参数。
 每个以太网包用一个包描述符ndis_packet描述。用包池存储。包实际内容不在里面,用一个包缓冲区描述符ndis_buffer描述,用缓冲池存储。通过池减少动态分配内存的消耗。
 OIDs是ndis的上层驱动调用NdisRequest给下层驱动发送的请求类型号,下层驱动返回约定的结果。比如获得一个网卡的物理地址或最大帧长.请求的的pending完成函数在协议特征集
 的RequestCompleteHandler设置 
3.绑定的解除
 当有一个网卡被拔出时,windows内核会调用协议特征集中的解除绑定回调来解除协议和网卡的绑定。解除绑定用NdisCloseAdapter.解除绑定过程中可能会接收到新包或者有新包发送,
 必须向网卡发送oid请求停止提交新的数据包。
4.应用层和驱动交互接收收到的包
 应用层可以作为包嗅探器的展示界面。
 a.使用createfile打开协议的控制设备对象符号链接,得到句柄。b. 使用deviceiocontrol等待绑定结束。c. 使用writefile发包,readfile接收数据包.d.使用closefile关闭句柄 
5. 内核层完成分发函数,提供应用层接口
 a.读请求就是从缓冲队列里检测数据包,有则拷贝到读请求的输出缓冲区。
 b.写请求就是发包请求,可以任意发出以太网包,具有网络攻击能力。在NdisProtSendComplete包发送完成函数中完成请求。
6. 接收回调
 ReceiveHandler和ReceivePacketHandler在被绑定的网卡收到数据包时都可能会被调用.参数中的前视区LookaheadBuffer包数据部分开始的前几个字节,用于快速检测是否提交包。
参数中只有包头和数据前几个字节。在ReceiveHandler中,检查包头,分配包描述符和缓冲描述符,拷贝包头。完整的数据应该调用NdisTransferData,但不包括包头.传输完整数据后会调用TransferDataCompleteHandler.在完成函数中将包保存到接收队列。用NidsGetNextBuffer可以从一个节点得到它下面一个节点,包的数据保存在一个缓冲区描述符链表里。
0 0
原创粉丝点击