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
- ndis协议驱动总结---发文于2013-12-30
- ndis小端口驱动总结---发文于2014.1.1
- ndis中间层驱动总结---发文于2014.1.21
- npapi总结--发文于2013-12-13
- tdi总结 -- 发文于2013-12-14
- RPC总结 ---发文于2013-12-20
- chrome代码总结 --- 发文于2013-12-11
- ie插件的简单总结 --- 发文于2013-12-13
- ie 5.5代码总结 --- 发文于2013-12-13
- 读驱动ARK之A盾代码的总结-- 发文于2013-9-5
- ndis协议驱动开发
- Ndis 协议驱动-Packet源码
- 自己的半年学习总结--发文于2012-3-30
- 游戏保护资料总结--发文于2013-11-3
- NDIS驱动(一)协议驱动
- direct UI总结---发文于2013.11.17
- wfp网络过滤框架总结(一)-主要翻译msdn ---发文于2013-11-24
- 读gh0st代码---发文于2015.8.30
- [AOJ 2170]Marked Ancestor[并查集][离线][路径压缩]or[线段树]
- 遇到一个把.o文件strip后出现的奇怪问题
- leetcode165---Compare Version Numbers
- [乡土民间故事_徐苟三传奇]第四回_张员外受骗摔新锅
- Android开源框架Universal-Image-Loader基本介绍和使用
- ndis协议驱动总结---发文于2013-12-30
- httpclient 4.3.x 版本 post 中文乱码问题
- java代码创建文件和文件夹
- ndis小端口驱动总结---发文于2014.1.1
- Mybatis学习(2)以接口的方式编程
- OSGI系列 服务注册
- linux学习
- 对360沙盒的驱动的一点逆向分析---发文于2014-1-19
- Bitmap 究竟占多大内存?