use*_*991 7 sockets windows windows-kernel
我的TDI过滤器驱动程序正在拦截IRP_MJ_CREATE请求,并根据我的需要分配每个打开的TCP/UDP连接的源端口.驱动程序在内部维护一个包含连接的表(包括套接字打开/关闭和TCP宽限期),但我仍然看到驱动程序没有收到特定事件通知的极少数情况,导致错误地假设特定的TCP源端口是免费,而它正在使用中.
我正在研究在分配此端口之前发送TDI_QUERY_INFORMATION请求的选项,但我没有看到查询任何地址的选项 - 我只能查询开放地址对象,但不能查询一般地址.
是否有任何(有效的)选项来查询特定的源端口并查看它是否正在使用?
未发送或处理通知必定有原因。我会首先关注那里。但由于没有来源,很难确定。
否则,与 TDI_QUERY_INFORMATION 有关:
使用传入 QType TDI_QUERY_ADDRESS_INFO 的 TdiBuildQueryInformation 宏。TDI_ADDRESS_INFO 定义传输返回所请求信息的格式。
TDI_ADDRESS_INFO 包含 TRANSPORT_ADDRESS,其中包含 1 个或多个 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.
Run Code Online (Sandbox Code Playgroud)
在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;
Run Code Online (Sandbox Code Playgroud)
看起来大多数 TDI 功能已被弃用,并将在 Windows 的未来版本中删除。因此,它们会将您指向 Winsock 内核 (WSK) 或 Windows 筛选平台 (WFP)。
温索克内核
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
希望这可以帮助。