无聊看看网络驱动,资料来源于 NT4 ROS 毛德操 以及网络上搜到的乱七八糟。。。没玩过win7不涉及WFP..
数据结构名称都来自NT4和DDK,流程主要参考NT4,只是围观一下设计思路,顺便记录点要点,与现在的xp版本肯定有不少细节上的出入~
ROS的网络部分只是实现到将就能用的程度,很多不健全,各种BUKOP,比如UDP丢包率很大。。
应用程序调用winsock函数实现于Msafd.dll ,由afd.sys对socket对象的数据进行整合和存储,然后将相应的操作向传输层下发。Winsock函数和afd.sys的函数功能基本是有对应关系的。。
看过应用层部分基本可以围观传说中的TDI过滤了。。。
Socket是设备对象\device\afd\endpoint 的一个文件对象的对应句柄,SOCKET就是文件对象的句柄
其EA信息中记录了属性,EA包含一个AFD_OPEN_PACKET 和传输协议名,由NtCreateFile带入内核.
进入了AfdCreate,其重要工作就是权限检查、初始化ENDPOINT结构、将EA等信息整合于文件对象的FsContext中(AFD_ENDPOINT)。
并且将endpoint记录于AfdEndpointListHead。
二、操作
endpoint->Context是一个上下文,存储着socket对象的一些状态信息,结构如下
SOCKET_INFORMATION structure
Helper DLL Context Length
Local Address
Remote Address
数据结构名称都来自NT4和DDK,流程主要参考NT4,只是围观一下设计思路,顺便记录点要点,与现在的xp版本肯定有不少细节上的出入~
ROS的网络部分只是实现到将就能用的程度,很多不健全,各种BUKOP,比如UDP丢包率很大。。
应用程序调用winsock函数实现于Msafd.dll ,由afd.sys对socket对象的数据进行整合和存储,然后将相应的操作向传输层下发。Winsock函数和afd.sys的函数功能基本是有对应关系的。。
看过应用层部分基本可以围观传说中的TDI过滤了。。。
一、初始化
建立一个socket
SOCKET WSASocket(
__in int af, //地址族 AF_INET是IPV4
__in int type, //传输类型 SOCK_STREAM 是传输协议方式
__in int protocol, //传输规程。。IPPROTO_TCP 用于 TCP IPv4 & 6
__in LPWSAPROTOCOL_INFO lpProtocolInfo,
__in GROUP g,
__in DWORD dwFlags
);
据af type protocol 找到相对应的协议驱动(SockGetTdiName),例如TCPIP.sys
Socket是设备对象\device\afd\endpoint 的一个文件对象的对应句柄,SOCKET就是文件对象的句柄
其EA信息中记录了属性,EA包含一个AFD_OPEN_PACKET 和传输协议名,由NtCreateFile带入内核.
进入了AfdCreate,其重要工作就是权限检查、初始化ENDPOINT结构、将EA等信息整合于文件对象的FsContext中(AFD_ENDPOINT)。
并且将endpoint记录于AfdEndpointListHead。
二、操作
endpoint->Context是一个上下文,存储着socket对象的一些状态信息,结构如下
SOCKET_INFORMATION structure
Helper DLL Context Length
Local Address
Remote Address