如何检查TDIfilter驱动程序是否有TCP端口?

我的TDI过滤驱动程序拦截IRP_MJ_CREATE请求,并根据我的需要分配每个打开的TCP / UDP连接的源端口。 驱动程序在内部维护一个包含连接(包括套接字打开/closures和TCP宽限期)的表,但是我仍然看到极less数情况下驱动程序没有收到特定事件的通知,导致错误地假定特定的TCP源端口是免费,而它正在使用。

我正在寻找在分配此端口之前发送TDI_QUERY_INFORMATION请求的选项,但是我没有看到用于查询任何地址的选项 – 我只能查询打开的地址对象,而不能查询通用地址。

是否有任何(有效)的选项来查询特定的源端口,看看它是否在使用?

必须有一个原因,为什么通知不被交付或处理。 我会先集中在那里。 然而,没有来源,这是很难确定的。

否则,属于TDI_QUERY_INFORMATION:

使用传递QType TDI_QUERY_ADDRESS_INFO的TdiBuildQueryInformation宏。 TDI_ADDRESS_INFO定义了传输返回请求信息的格式。

TDI_ADDRESS_INFO包含一个包含1个或多个TA_ADDRESS结构的TRANSPORT_ADDRESS。

每个TA_ADDRESS结构都指定一个特定的TDI_ADDRESS_TYPE_XXX的传输地址。 传入TA_IP_ADDRESS结构,并将类型指定为TDI_ADDRESS_TYPE_IP。

// From Tdi.h or TdiKrnl.h #define TDI_ADDRESS_TYPE_IP ((USHORT)2) // internetwork: UDP, TCP, etc. 

在TA_IP_ADDRESS结构中,有一个TDI_ADDRESS_IP,它包含端口。

 typedef struct _TA_ADDRESS_IP { LONG TAAddressCount; struct _AddrIp { USHORT AddressLength; USHORT AddressType; TDI_ADDRESS_IP Address[1]; } Address[1]; } TA_IP_ADDRESS, *PTA_IP_ADDRESS; // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= typedef struct _TDI_ADDRESS_IP { USHORT sin_port; ULONG in_addr; UCHAR sin_zero[8]; } TDI_ADDRESS_IP, *PTDI_ADDRESS_IP; 

它看起来像大多数TDI功能已被弃用,并将在未来的Windows版本中被删除。 因此,他们指向Winsock内核(WSK)或Windows过滤平台(WFP)。

Winsock内核

http://msdn.microsoft.com/en-us/library/windows/hardware/ff571083(v=vs.85).aspx

Windows过滤平台

http://msdn.microsoft.com/en-us/library/windows/hardware/ff571068(v=vs.85).aspx

希望这可以帮助。