如何检查TDI过滤器驱动程序是否提供TCP端口?

时间:2014-03-17 13:35:43

标签: windows sockets windows-kernel

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

我在分配此端口之前调查了发送TDI_QUERY_INFORMATION请求的选项,但我没有看到查询任何地址的选项 - 我只能查询开放地址对象,但不能查询一般地址

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

1 个答案:

答案 0 :(得分:2)

必须有理由不传递或处理通知。我会先关注那里。然而,如果没有来源,那很难确定。

否则,与TDI_QUERY_INFORMATION有关:

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

TDI_ADDRESS_INFO包含一个TRANSPORT_ADDRESS,其中包含一个或多个TA_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 Kernel

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

希望这有帮助。