没有合适的资源?快使用搜索试试~ 我知道了~
NDIS协议驱动开发.pdf
需积分: 10 9 下载量 27 浏览量
2012-03-27
20:54:49
上传
评论 1
收藏 147KB PDF 举报
温馨提示
试读
18页
协议驱动直接建立同下层微端口数据接口通信,可以直接处理底层网卡 数据。下层的中间层驱动主要提供一个数据过滤功能,对上层协议驱动提 供微端口接口,对下层NIC 微端口驱动提供协议驱动接口。下层的微端口 驱动是网卡厂家提供的网卡驱动(基于NDIS 框架,非标准Windows 驱动), 具体的细节参考NDIS 框架资料。
资源推荐
资源详情
资源评论
NDIS 协议驱动开发
协议驱动开发协议驱动开发
协议驱动开发
By boywhp
Email:boywhp@126.com
一
一一
一、
、、
、Windows 网络
网络网络
网络 NDIS 接口模型
接口模型接口模型
接口模型
协议驱动直接建立同下层微端口数据接口通信,可以直接处理底层网卡
数据。下层的中间层驱动主要提供一个数据过滤功能,对上层协议驱动提
供微端口接口,对下层 NIC 微端口驱动提供协议驱动接口。下层的微端口
驱动是网卡厂家提供的网卡驱动(基于 NDIS 框架,非标准 Windows 驱动),
具体的细节参考 NDIS 框架资料。
开发虚拟网卡以及防火墙推荐 NDIS 中间层,只是收发数据推荐在协
议层驱动,下面是协议层驱动数据收发模型。
NDIS 协议驱动
NDIS 中间层驱动
NDIS 微端口驱动
TDI 传输驱动接口
TCPIP TCPWAN my protocol
NIC1
NIC2
NIC3
其中的 NIC1、NIC2、NIC3 就是你机器上的网卡,可以是微端口驱动
也可能是中间层虚拟的一个 NIC,通常就是你在 IPConfig /ALL 下看到的网
络适配器。一个协议驱动可以和几个网卡建立绑定。具体和哪个网卡绑定
决定于协议驱动的需要。我们的协议驱动和底层的 NIC 直接交互,通常系
统已经自带了 TCPIP、TCPWAN 等协议驱动,我们的驱动和这些是平行的
关系。一个 NIC 接受到数据后会查询其所有绑定的协议驱动链,依次调用
协议驱动注册的收包函数。因此使用协议驱动来做防火墙并不合适,因为
你并不能阻止 TCPIP 的收发数据,但是嗅探数据是可以的,实际上 winpcap
就是基于标准的 NDIS 协议驱动写的。
另外还有一点就是尽管上层的 socket 接口以及应用如何变化,协议层
看到的只是一个个的 NDIS Pakcet 收发请求,每个 NDIS Packet 对应一个网
络数据包。具体的数据包格式参考 TcpIp 详解。数据包的组包、校验以及重
传等功能在上层处理。协议层驱动只是把收的网络数据包缓冲起来等待上
层读取,并将上层的数据包写入到下层的网卡,因此写协议驱动真是很轻
松的事情。
二
二二
二、
、、
、协议驱动编程
协议驱动编程协议驱动编程
协议驱动编程
在没有熟悉协议驱动编程前可以很多人会很茫然,不知道如何下手真正
开发一个协议驱动,这里我强烈推荐 DDK2000 里面的 packet 实例,使用
Source Insight 来看(强烈不推荐 VC6),我就是这样入门的,当然我悟性也
许比你低那么一点点。另外参考文章就不要找了,找也找不到的,尤其是
中文的,我这个就是目前最好的文档了,自己看 DDK 会有点收获的,另外
我假定你对内核编程有一个基本了解,入门请参考楚狂人的文件过滤驱动
文档。
(
((
(一
一一
一)
))
)初始化
初始化初始化
初始化 DriverEntry
Windows NDIS 内部维护了一个协议数据结构的双向链表,我们当然得
把我们的协议驱动挂上去先,同时该数据结构包含了一系列函数指针需要
我们指定,代码在 packet.c 里。
//填写 NDIS_PROTOCOL_CHARACTERISTICS 数据结构
NdisZeroMemory(&protocolChar,sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
protocolChar.MajorNdisVersion = 5;
protocolChar.MinorNdisVersion = 0;
protocolChar.Name = protoName;
protocolChar.OpenAdapterCompleteHandler = PacketOpenAdapterComplete;
protocolChar.CloseAdapterCompleteHandler = PacketCloseAdapterComplete;
protocolChar.SendCompleteHandler = PacketSendComplete;
protocolChar.TransferDataCompleteHandler = PacketTransferDataComplete;
protocolChar.ResetCompleteHandler = PacketResetComplete;
protocolChar.RequestCompleteHandler = PacketRequestComplete;
protocolChar.ReceiveHandler = PacketReceiveIndicate;
protocolChar.ReceiveCompleteHandler = PacketReceiveComplete;
protocolChar.StatusHandler = PacketStatus;
protocolChar.StatusCompleteHandler = PacketStatusComplete;
protocolChar.BindAdapterHandler = PacketBindAdapter;
protocolChar.UnbindAdapterHandler = PacketUnbindAdapter;
protocolChar.UnloadHandler = NULL;
protocolChar.ReceivePacketHandler = PacketReceivePacket;
protocolChar.PnPEventHandler = PacketPNPHandler;
我下面加载次序依次讲解各个函数,首先是
NdisRegisterProtocol
NdisRegisterProtocol(
&status,
&Globals.NdisProtocolHandle,
&protocolChar,
sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
如果调用成功会返回一个协议
NDIS50_PROTOCOL_BLOCK
的数据指针(微软称为
NdisProtocolHandle),实际上他是一个注册协议驱动单链表首指针。通过该
指针即可遍历所以系统安装的协议,实现一些邪恶的用途,鉴于其邪恶性,
故 不 给 出 代 码 ,微软也不推荐该做法。当然你还要 规 规 矩 矩 的 填写
DriverObject->MajorFunction 等回调函数,好在 Packet 代码帮我们做了。
正常情况下,如果你使用了标准的官方做法(使用标准的 inf 安装文件,
并 添 加 协 议 驱 动 到 网 卡 ), 系 统 会 在 你 注 册 协 议 驱 动 后 , 调 用
BindAdapterHandler,也就是你的 PacketBindAdapter 函数,但是很多不喜欢
驱动签名,且不喜欢 inf 安装并邪恶的人,发明了直接在 DriverEntry 里面
使用 NdisOpenAdpater 直接打开网卡的方法,DDK 对此的原文描述如下:
Comments
A protocol driver calls NdisOpenAdapter
NdisOpenAdapterNdisOpenAdapter
NdisOpenAdapter from its
ProtocolBindAdapter
function.
NDIS no longer supports calling NdisOpenAdapter
NdisOpenAdapterNdisOpenAdapter
NdisOpenAdapter from the DriverEntry
DriverEntryDriverEntry
DriverEntry function,
which was an option available to legacy (V3.0) protocols. NDIS no longer supports
V3.0 protocols. NDIS fails any attempt to call NdisOpenAdapter
NdisOpenAdapterNdisOpenAdapter
NdisOpenAdapter outside the
context of
ProtocolBindAdapter
.
下面公布我测试的结果:windows2000 可以正常打开,但是好像不怎
么稳定,有时能够正常截获数据有时不行,XP 和 Windows 2003 都不怎么
好用。
(
((
(二
二二
二)
))
)绑定网卡
绑定网卡绑定网卡
绑定网卡 PacketBindAdapter
PacketBindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE BindContext,
IN PNDIS_STRING DeviceName,
IN PVOID SystemSpecific1,
剩余17页未读,继续阅读
资源评论
jianghui3132749
- 粉丝: 2
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功