文章摘录自《Windows内核原理与实现》一书。
我们植到,Winsock以网络协议为基础来访问网络,比如TCP/IP和IPX/SPX等,其相应的内核驱动程序为afd.sys。那么,像 afd.sys这样的网络 API 驱动程序在接收到针对特定协议的网络请求时,如何将请求转交给相应的协议驱动程序呢?它如何适应不同网络协议的实现差异呢? Windows 在网络 API驱动程序与协议驱动程序之间规定了一个接口标准,称为传输驱动程序接口(TDI,Transport Driver Interface),从而使网络 API 驱动程序可以按照 TDI 接口来调用更低层的协议驱动程序。
定义 TDI 带来的好处是显而易见的,它消除了网络 API 与底层的传输协议之间的紧耦合关系。按照TDI接口来实现的传输协议可以被多个 TDI 客户使用。例如, TCP/IP 协议驱动程序为 tcpip.sys, 即可以被 Winsock 的驱动程序 afd.sys使用,也可以被 netbt.sys驱动程序( NetBT 代表 NetBIOS over TCP/IP)使用。符合 TDI接口的传输协议驱动程序被称为 TDI 传输器 (TDI Transport)。
在TDI层上,网络API的内核驱动程序是 TDI 客户,而协议驱动程序则是 TDI 传输器。网络 API 驱动程序接收各种形式的网络请求,例如, 名称解析、建立连接、发送或接收数据等, TDI 使得这些网络请求被统一描述,因而各种传输协议只要按照TDI的规范实现,就可以被网络 API 使用。另外,由于 TDI传输器也是内核驱动程序,它接收的请求一定是IRP数据结构,所以,本质上,TDI是将各种网络请求转变成一种规范的IRP描述。
在Windows中,内核模块tdi.sys 提供了一组支