本文深入探讨了Windows网络编程中的关键组件:WFP(Windows Filtering Platform)与TDI(Transport Driver Interface)。从Windows XP的老版本开始,驱动程序如afd.sys、NetBt.sys、tdi.sys、tlnp.sys、tcpip.sys、ndis.sys等,构成了OSI模型的四层结构,包括物理层、数据链路层、网络层和传输层。Ndis驱动主要分为三层,本文不对此深入展开。
随着操作系统的发展,Win7引入了新的驱动TDX.sys,以保持对老版本TDI.sys的兼容性,同时确保了与附加网络设备栈的一致性,如/device/upd、/device/tcp等。而WFP在Win7之后成为微软推出的新一代微型框架,旨在提供更好的系统兼容性、稳定性,并简化上层过滤驱动的开发流程。这在一定程度上是为了应对可能存在的系统不稳定性和安全风险,Minifilter的诞生或许正是出于这一目的。
简而言之,TDI作为传输驱动接口,连接着socket与协议驱动,它提供了一种访问传输层功能的途径,与NDIS相比更为接近应用层。在XP等较老的Windows系统中,TDI是实现内核态网络栈接口的重要组件,可用于访问传输层功能。尽管Vista之后不再推荐使用TDI接口,但考虑到系统兼容性与全平台支持,TDI接口在现代Windows系统中仍然普遍存在。
TDI在Windows系统中扮演着关键角色,它涉及三种类型:TDI Client、TDI Filter与TDI Transport。TDI Filter提供可选的过滤功能,类似于键盘串口的过滤机制,但具有更丰富的客户端、过滤与传输功能。TDI Client驱动,如Afd.sys、NetBt.sys与Http.sys,与协议驱动一起工作,负责处理客户端请求。TDI Transport驱动则负责实现传输层与网络层功能,如TCP/IP、NWLink等,通过NDIS接口与网络适配器交互。
在TDI体系中,客户与传输之间通过IRP(IO Request Packet)与回调函数进行交互。IRP作为客户端驱动与传输驱动之间的主要通信手段,用于发送请求与接收响应。TDI事件通知则涉及到主动注册与事件等待两种模式,前者用于响应客户端请求,后者用于处理特定事件触发的操作。
TDI IRP的使用是实现网络请求与响应的关键,它允许客户端驱动通过特定功能码(如IRP_MJ_INTERNAL_DEVICE_CONTROL)向传输驱动发送请求,并使用格式化结构(如TDI_REQUEST_KERNEL_XXX)指定请求的具体参数。TDI Callback机制则用于优化内存使用,允许传输驱动直接从底层网络驱动接收数据缓冲,从而提高效率。
客户端与服务器在使用TDI进行通信时,遵循一系列步骤。客户端通过创建传输对象与连接对象(使用ZwCreateFile函数)并关联地址(TDI_ASSOCIATE_ADDRESS),发送连接请求(TDI_CONNECT),进行断开连接(TDI_DISCONNECT),解绑关联(TDI_DISASSOCIATE_ADDRESS),最终关闭对象(ZwClose)。服务器则通过创建传输地址对象、注册事件、创建连接端点对象与响应客户端请求(TDI_ACCEPT)来完成交互过程。
本文重点介绍了TDI的基本概念与使用方式,以及WFP作为新一代网络过滤平台在Windows系统中的作用。通过理解TDI与WFP的内部工作原理,开发者可以更高效地进行网络驱动编程,实现更加复杂且安全的网络功能。
本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。