过滤驱动开发笔记(2)

来源:互联网 发布:blk黑水 淘宝 编辑:程序博客网 时间:2024/06/12 04:34

NDIS确实挺复杂,找到了一篇比较完整的资料,也收集了别人的一些心得。虽然算是有些了解,但该怎么做,还是一头雾水。后来终于知道,原来Windows 2003 DDK有一套源代码叫Passthru,已经把框架搭好了。

刚开始有个概念一直搞不清楚:底层面向连接和面向无连接。但是很多实际经验的文章都没提到这个差别,Passthru中也没有实现DDK帮助中提到的面向连接的函数。现在明白了,以太网、FDDI、令牌网都是面向无连接的,而ATM是面向连接的网络。我只关心以太网,所以面向连接的部分与我无关了。

Passthru有几个关键函数,做个简短说明:

1DriverEntry,在文件passthru.c中,所有驱动程序都有这么个入口,在这里注册各种接口函数。如果需要自行编写接口函数,可在这里修改。一些全局变量的初始化也可以在这里进行。

2PtDispatch,在文件passthru.c中,在这里跟应用层沟通信息,通常是接收来自应用层的指令,也可以传回一些信息。

3ProtocolBindAdapter,该函数在DriverEntry中注册为PtBindAdapter,在文件protocol.c中,功能为绑定网卡,每个网卡被启用时,系统自动调用该函数进行绑定。

4ProtocolUnbindAdapter,该函数在DriverEntry中注册为PtUnbindAdapter,在文件protocol.c中,功能为网卡的解除绑定,与ProtocolBindAdapter相对。

5ProtocolReceive,该函数在DriverEntry中注册为PtReceive,在文件protocol.c中,实现数据包的接收功能,它接收到的可能不是完整的包,但是一个基础函数,必须实现。

6ProtocolReceivePacket,该函数在DriverEntry中注册为PtReceivePacket,在文件protocol.c中,实现完整数据包的接收,推荐实现,可提高效率。

7MiniportSend,该函数在DriverEntry中注册为MPSend,在文件miniport.c中,实现单数据包发送功能。

8MiniportSendPackets,该函数在DriverEntry中注册为MPSendPackets,在文件miniport.c中,实现多数据包发送功能。调用MiniportSendPackets还是MiniportSend取决于注册了哪一个函数。默认情况下,DriverEntry注册的是MiniportSendPackets

还有其他的一些函数,比如ProtocolSendComplete等,也是开发中间层驱动经常关注的,但在我的需求中,只要求过滤数据包,不做缓存、修改等操作,无须考虑。

原创粉丝点击