- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从socketapi到TDI驱动-看雪学院
从Socket Api到Tdi驱动
当我想写一个基于进程的流量防火墙(仅显示流量,暂不做限流),我翻开了寒江。阅读上面的TDI驱动一节,然后我就懵了,地址对象和连接对象到底是个啥?为啥IRP_MJ_CREATE会被调用两次?跟我在上层的socket api调用有啥联系?为啥要记录地址对象和连接对象的对应关系呢?于是,我想从Socket Api到TDI驱动顺一遍。到底它们的联系是啥?
下面的分析基于ReactOS-0.3.1,源码分析思路结构来源于毛德操老师的《Windows内核情景分析》
建立socket
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
该api调用了WSPSocket,该函数由ws2_32.dll提供。
dll\win32\msafd\misc\Dllmain.c
可以看到,注意ZwCreateFile的各个参数。
其中Object参数中指定了要打开的对象名为DevName即\\Device\\Afd\\Endpoint。
而EABuffer中,则写入了通过SockGetTdiName获得的TransportName。其实呢,这个TransportName就是\\Device\\Tcp \\Device\\Udp \\Device\\RawIp
\\Device\\Afd\\Endpoint 是Afd驱动创建的设备。
我想你应该明白了,ws2_32.dll是通过操作Afd驱动完成各个操作的。
为了更好的了解该Socket对象中对我们有益的细节,我们会继续查看Afd驱动中的相关内容。Afd驱动中AfdDispatch()中调用了AfdCreateSocket()
drivers\network\afd\afd\Main.c
可以看到,该FileObject的FCB中TdiDeviceName被初始化成了通过EaBuffer传入的TransportName。这里需要注意下。因为分析下面的时候还会出现。
到此Socket的创建完成,并没有创建传说中的地址对象、连接对象,并没有牵涉到\\Device\\Tcp \\Device\\Udp \\Device\\RawIp
二、绑定socket
bind(flexSocket, (sockaddr *)sockAddr, sizeof(sockAddr))
该api调用WSPBind()
dll\win32\msafd\msafd\Dllmain.c
此处同样的,将调用到Afd驱动中的DeviceIoControl接口。
Drivers\network\afd\afd\Main.c
AfdDispatch--( AfdBindSocket
可以很清楚的看到AfdBindSocket调用了WarmSocketForBind,并将FCB作为参数传入。检查该函数。
Drivers\network\afd\afd\bind.c
我相信,你肯定激动了,看到没?我们要的地址对象似乎要出现了,起码名字很像。
这边调用TdiOpenAddressFile,传入了FCB的TdiDeviceName,而TdiDeviceName我们上面看过了,就是\\Device\\Tcp \\Device\\Udp \\Device\\RawIp 之类的。
Drivers\network\afd\afd\Tdi.c
这边我们看到了调用了TdiOpenDevice,其中DeviceName就是\\Device\\Tcp \\Device\\Udp 之类的,并且把一个TRANSPORT_ADDRESS结构体作为EaInfo传入了。
进入TdiOpenDevice
Drivers\network\afd\afd\Tdi.c
相信看到这里你应该明白了,Afd驱动通过ZwCreateFile调用了\\Device\\Tcp \\Device\\Udp
这些设备的驱动,他们的驱动就是tcpip.sys。
查看该驱动的代码,弄清楚ZwCreateFile做了啥。
Drivers\network\tcpip\tcpip\Main.c
进入TiCreateFileObject。
Drivers\network\tcpip\tcpip\Main.c
在TiCreateFileObject中调用了FileOpenAddress(),然后将获得的相关信息作为FsContext2写入到了FileObject中。这里恕我只写出TiCreateFileObject的部分,更完整的分析参见第三部分。
这应该就是所谓的创建了地址对象。也就是说
WSPBind中通过调用Afd驱动提供的接口创建了所谓的地址对象。
而Afd驱动则是通过ZwCreateFile调用了tcpip
原创力文档


文档评论(0)