zoukankan      html  css  js  c++  java
  • 浅浅研究了下WIN7 TDX 重定向的判断

    前置知识:http://www.codemachine.com/article_tdi.html

    创建socket的过程从ring3到AFD,基本是老样子。

    在到达AfdCreate后,会有不同的分支

    根据RING3传下来的EA,里面不同的变量判断,就跳转不同的分支。

    1。默认分支

    默认里面会调用

    AfdCheckTDIFilter()

    该函数检测 tcp/udp/rawip/tcp6/udp6/rawip6这6个设备是否有attached的设备

    如果有则返回1,返回0的话,AfdCreate函数就接着调用AfdAllocateEndpoint创建ENDPOINT

    2。第二个分支

    上面AfdCheckTDIFilter函数返回1后,AfdCreate会返回一个错误码STATUS_MEDIA_CHANGED,回到应用层后,mssocket模块重新调用WsaSocket()创建socket。但这回EA不同,会跳转到第二个分支。

    这个分支里面就是直接调用AfdAllocateEndpoint创建ENDPOINT

    2个分支都调用了AfdAllocateEndpoint,那有什么不同?

    不同是在AfdAllocateEndpoint这个函数里面。

    AfdAllocateEndpoint函数有一个参数是传进TransportDeviceName的

    在第一个分支里面TransportDeviceName参数为空

    这样初始化_AFd_Endpoint结构的时候,就根据不同的情况初始化不同的字段值了。

    如TransportDeviceName为这空,说明是没有tdi过滤驱动attach的情况,这时候是直接afd到tcpip路线(尼玛的,性感路线)

    稍微看了下这里是怎么直接关联tcpip的。

    在TransportDeviceName为空情况下的初始化是直接把tcpip驱动提供的一些回调函数设置到afd_endpoint结构里面,以后就可以直接调用了。

    那这个回调函数怎么设置过来给afd驱动的呢?大致看了下,好像是

    afd驱动调用netio!NmrRegisterProvider的注册函数,把自己的一外链表头注册进去。

    估计是netio模块会tcpip的回调函数设置到这个链表里面(没空看了)

    afd!AfdAllocateEndpoint()函数创建endpoint的时候,调用AfdTlFindAndReferenceTransport根据socket的地址,协议等属性找到特定的数据来填充endpoint结构

    tcpip的回调函数所在的结构就是AfdTlFindAndReferenceTransport函数返回的。

    完。

    PS:上面提到afdcreate中判断变量是EA的 afd_open_packet->TransportDeviceNameLength

    AfdAllocateEndpoint中判断的名字来源就是afd_open_packet->TransportDeviceName;

    这个名字是device\udp这个格式

    另外发现有个强大的字段IgnoreTDI。大家自己搜索吧

  • 相关阅读:
    nginx实现请求的负载均衡 + Keep Alive实现nginx的高可用
    理解什么是JWT(Json web token)及Python实现
    TCP/UDP协议到底是什么
    Redis实现分布式单点登录
    Python面试题---给定一个字符串 {xxx[xxx{xxx}]xx{x[xxx]xxx{xxx}xx}x} 判断其中的 {}[]() 是否成对出现
    Typora里面如何快捷改变字体颜色?
    基于Docker安装关系型数据库PostgrelSQL替代Mysql
    PEP8-Python编码规范
    欢迎来到我的友链小屋
    windows下lib和dll区别
  • 原文地址:https://www.cnblogs.com/kkindof/p/2635289.html
Copyright © 2011-2022 走看看