上一篇:WindowsAPI|每天了解几个winAPI接口之Iphlpapi.h网络配置相关文档详细分析二
如果有错误欢迎指正批评,在此只作为科普和参考。
文章目录
- GetTcpTable&GetExtendedTcpTable:获取TCP连接的信息
- GetOwnerModuleFromTcpEntry:获取与特定TCP连接关联的模块信息
- TcpipOwnerModuleInfoBasic&TcpipOwnerModuleInfoEnhanced是什么
- GetUdpTable&GetExtendedUdpTable:用于获取UDP监听器信息
- MIB_UDPTABLE 结构的指针都包含什么信息?
- GetOwnerModuleFromUdpEntry&GetTcpTable2:用于获取与 UDP 和 TCP 相关的网络信息
- MIB_UDPROW_OWNER_MODULE 结构都包含什么信息?
- MIB_TCPTABLE2 结构的指针都包含什么信息?
GetTcpTable&GetExtendedTcpTable:获取TCP连接的信息
//
// //
// Gets TCP Connection/UDP Listener Table //
// //
//#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion#pragma region Application Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)IPHLPAPI_DLL_LINKAGE
ULONG
WINAPI
GetTcpTable(_Out_writes_bytes_opt_(*SizePointer) PMIB_TCPTABLE TcpTable,_Inout_ PULONG SizePointer,_In_ BOOL Order);IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetExtendedTcpTable(_Out_writes_bytes_opt_(*pdwSize) PVOID pTcpTable,_Inout__When_(ulAf == AF_INET, _Deref_in_range_(>=, sizeof(MIB_TCPTABLE)))_When_((TableClass == TCP_TABLE_OWNER_PID_LISTENER ||TableClass == TCP_TABLE_OWNER_PID_CONNECTIONS ||TableClass == TCP_TABLE_OWNER_PID_ALL) && ulAf == AF_INET6,_Deref_in_range_(>=, sizeof(MIB_TCP6TABLE_OWNER_PID)))_When_((TableClass == TCP_TABLE_OWNER_MODULE_LISTENER ||TableClass == TCP_TABLE_OWNER_MODULE_CONNECTIONS ||TableClass == TCP_TABLE_OWNER_MODULE_ALL) && ulAf == AF_INET6,_Deref_in_range_(>=, sizeof(MIB_TCP6TABLE_OWNER_MODULE)))PDWORD pdwSize,_In_ BOOL bOrder,_In_ ULONG ulAf,_In_ TCP_TABLE_CLASS TableClass,_In_ ULONG Reserved);#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion
这段代码是Windows网络编程相关的API函数声明,它们定义在Windows的IP Helper API(iphlpapi.h头文件)中。GetTcpTable和GetExtendedTcpTable函数用于获取TCP连接的信息。下面是每个函数的简要说明:
-
GetTcpTable函数:- 功能:获取一个包含当前所有TCP连接、监听端口和其他TCP表条目的表。
- 参数:
TcpTable:指向一个MIB_TCPTABLE结构的指针,该结构将接收TCP表。SizePointer:一个指向变量的指针,该变量在输入时表示TcpTable的大小,在输出时表示填充TcpTable所需的实际大小。Order:如果为TRUE,则返回的TCP表将按连接状态排序;如果为FALSE,则不排序。
-
GetExtendedTcpTable函数:- 功能:获取一个扩展的TCP连接表,可以提供比
GetTcpTable更多的信息,比如每个连接的进程ID或模块信息。 - 参数:
pTcpTable:指向缓冲区的指针,该缓冲区将接收扩展的TCP表。pdwSize:指向变量的指针,该变量在输入时表示pTcpTable的大小,在输出时表示填充pTcpTable所需的实际大小。bOrder:与GetTcpTable中的Order参数相同。ulAf:指定地址族(AF_INET表示IPv4,AF_INET6表示IPv6)。TableClass:指定需要哪种类型的TCP表(例如,只包含监听端口的表,只包含连接的表,或者两者都包含)。Reserved:保留参数,必须设置为0。
- 功能:获取一个扩展的TCP连接表,可以提供比
这段代码还包含了预处理指令,这些指令用于确保只有在特定的Windows平台版本下才编译这些函数。WINAPI_FAMILY_PARTITION宏用于确定当前的Windows平台版本,以确保代码只在一个特定的应用程序家族(如桌面、系统、游戏或通用Windows平台)中编译。这有助于确保API的可用性与应用程序的目标平台相匹配。
GetOwnerModuleFromTcpEntry:获取与特定TCP连接关联的模块信息
#pragma region Desktop Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetOwnerModuleFromTcpEntry(_In_ PMIB_TCPROW_OWNER_MODULE pTcpEntry,_In_ TCPIP_OWNER_MODULE_INFO_CLASS Class,_Out_writes_bytes_(*pdwSize) PVOID pBuffer,_Inout_ PDWORD pdwSize);#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion
这段代码是Windows网络编程中用于获取与特定TCP连接相关的拥有者模块信息的API函数声明。这个函数声明位于Windows的IP Helper API(iphlpapi.h头文件)中。以下是函数的详细说明:
函数:GetOwnerModuleFromTcpEntry
功能:
- 此函数用于获取与指定TCP连接条目相关的拥有者模块信息。拥有者模块信息可以用来确定哪个进程或哪个网络模块拥有特定的TCP连接。
参数:
pTcpEntry:指向MIB_TCPROW_OWNER_MODULE结构的指针,该结构包含要查询的TCP连接的索引信息。Class:指定要检索的信息类型。TCPIP_OWNER_MODULE_INFO_CLASS是一个枚举类型,可以是以下几种值之一:TcpipOwnerModuleInfoBasicTcpipOwnerModuleInfoEnhanced
pBuffer:指向一个缓冲区,该缓冲区将接收请求的信息。缓冲区的内容取决于Class参数的值。pdwSize:指向一个变量的指针,该变量在输入时表示pBuffer的大小,在输出时表示填充pBuffer所需的实际大小。
返回值:
- 函数返回一个
DWORD值,表示操作的结果。常见的返回值包括:NO_ERROR:成功完成操作。ERROR_INSUFFICIENT_BUFFER:提供的缓冲区大小不足以存储请求的信息。ERROR_INVALID_PARAMETER:一个或多个参数无效。
使用场景:
- 当需要确定哪个网络模块或进程拥有特定的TCP连接时,可以使用此函数。这对于调试网络应用、安全审计或网络监控等场景非常有用。
这段代码还包含了预处理指令,这些指令用于确保只有在特定的Windows平台版本下才编译这个函数。WINAPI_FAMILY_PARTITION宏用于确定当前的Windows平台版本,以确保代码只在一个特定的应用程序家族(如桌面、系统、游戏)中编译。这有助于确保API的可用性与应用程序的目标平台相匹配。
TcpipOwnerModuleInfoBasic&TcpipOwnerModuleInfoEnhanced是什么
TcpipOwnerModuleInfoBasic 和 TcpipOwnerModuleInfoEnhanced 是 TCPIP_OWNER_MODULE_INFO_CLASS 枚举的成员,用于指定在调用 GetOwnerModuleFromTcpEntry 函数时希望检索的模块信息类型。这些枚举值决定了函数返回的信息详细程度。
-
TcpipOwnerModuleInfoBasic:这是一个基础的信息类,它返回与 TCP 连接相关联的模块的基本信息。根据搜索结果,TCPIP_OWNER_MODULE_BASIC_INFO结构体包含两个成员:pModuleName和pModulePath。这些成员分别指向模块的名称和包括模块名称的完整路径。如果模块所有者是系统内核,则这些成员指向包含“System”的宽字符串。TCPIP_OWNER_MODULE_BASIC_INFO结构在 Windows Vista 及更高版本中定义于iprtrmib.h头文件中。 -
TcpipOwnerModuleInfoEnhanced:这通常表示更详细的信息类,可能包括模块的所有者信息、模块路径以及其他可能与模块关联的额外数据。不过,根据搜索结果,TCPIP_OWNER_MODULE_INFO_CLASS枚举中只提到了TCPIP_OWNER_MODULE_INFO_BASIC作为一个常量,没有提及TcpipOwnerModuleInfoEnhanced。这可能意味着在当前的上下文中只有一个基础级别的信息类可用。
需要注意的是,这些信息类用于 GetOwnerModuleFromTcpEntry 函数,该函数可以查询给定 TCP 连接条目的模块所有者信息。这些信息对于诊断网络问题或进行网络安全分析非常有用。由于这是一个比较专业的API,使用时需要有一定的网络编程和Windows编程知识。
GetUdpTable&GetExtendedUdpTable:用于获取UDP监听器信息
#pragma region Application Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)IPHLPAPI_DLL_LINKAGE
ULONG
WINAPI
GetUdpTable(_Out_writes_bytes_opt_(*SizePointer) PMIB_UDPTABLE UdpTable,_Inout_ PULONG SizePointer,_In_ BOOL Order);IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetExtendedUdpTable(_Out_writes_bytes_opt_(*pdwSize) PVOID pUdpTable,_Inout_ PDWORD pdwSize,_In_ BOOL bOrder,_In_ ULONG ulAf,_In_ UDP_TABLE_CLASS TableClass,_In_ ULONG Reserved);#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion
这段代码是Windows IP Helper API中用于获取UDP监听器信息的函数声明。这些函数允许查询系统上的UDP端点信息,包括监听的端口和相关的统计数据。以下是每个函数的简要说明:
-
GetUdpTable函数:- 功能:获取一个包含所有UDP监听端口的表格。
- 参数:
UdpTable:指向一个MIB_UDPTABLE结构的指针,该结构将接收UDP表。SizePointer:一个指向变量的指针,该变量在输入时表示UdpTable的大小,在输出时表示填充UdpTable所需的实际大小。Order:如果为TRUE,则返回的UDP表将按端口号排序;如果为FALSE,则不排序。
-
GetExtendedUdpTable函数:- 功能:获取一个扩展的UDP表,可以提供比
GetUdpTable更多的信息,比如与每个UDP端口关联的进程ID或模块信息。 - 参数:
pUdpTable:指向缓冲区的指针,该缓冲区将接收扩展的UDP表。pdwSize:指向一个变量的指针,该变量在输入时表示pUdpTable的大小,在输出时表示填充pUdpTable所需的实际大小。bOrder:与GetUdpTable中的Order参数相同。ulAf:指定地址族(AF_INET表示IPv4,AF_INET6表示IPv6)。TableClass:指定需要哪种类型的UDP表(例如,只包含监听端口的表,或者包含更多详细信息的表)。Reserved:保留参数,必须设置为0。
- 功能:获取一个扩展的UDP表,可以提供比
这些函数对于网络编程、监控网络活动、调试网络应用或进行网络安全分析等场景非常有用。它们可以帮助开发者或系统管理员了解系统上的UDP端口使用情况。
代码中的预处理指令确保只有在特定的Windows平台版本下才编译这些函数。WINAPI_FAMILY_PARTITION宏用于确定当前的Windows平台版本,以确保代码只在一个特定的应用程序家族(如应用程序、系统、游戏)中编译。这有助于确保API的可用性与应用程序的目标平台相匹配。
MIB_UDPTABLE 结构的指针都包含什么信息?
MIB_UDPTABLE 结构的指针指向一个包含本地计算机上所有 UDP 侦听器信息的表。这个表由多个 MIB_UDPROW 结构组成,每个 MIB_UDPROW 结构代表一个 UDP 侦听器。以下是 MIB_UDPTABLE 结构包含的信息:
-
dwNumEntries:一个DWORD类型的变量,表示MIB_UDPTABLE结构中MIB_UDPROW元素的数量。这个值指示了表中有多少个 UDP 侦听器。 -
table:一个数组,其中的每个元素都是MIB_UDPROW结构。每个MIB_UDPROW结构包含以下信息:dwLocalAddr:一个DWORD类型的变量,表示侦听器的本地 IP 地址。这个地址以网络字节序(big-endian)存储。dwLocalPort:一个DWORD类型的变量,表示侦听器的本地端口号。这个端口号以网络字节序存储。dwRemoteAddr:一个DWORD类型的变量,表示远程 IP 地址。这个地址以网络字节序存储。对于侦听器来说,这个值通常是 0,因为侦听器等待来自任何远程地址的连接。dwRemotePort:一个DWORD类型的变量,表示远程端口号。这个端口号以网络字节序存储。对于侦听器来说,这个值通常是 0。
MIB_UDPTABLE 结构通常用于网络诊断和监控工具,以获取和显示本地计算机上的 UDP 侦听器信息。这些信息可以帮助识别正在运行的服务、检测潜在的安全问题以及优化网络性能。
需要注意的是,MIB_UDPTABLE 结构主要用于 IPv4 环境。对于 IPv6 环境,可以使用 GetExtendedUdpTable 函数和相应的结构来获取 UDP 表信息。
GetOwnerModuleFromUdpEntry&GetTcpTable2:用于获取与 UDP 和 TCP 相关的网络信息
#pragma region Desktop Family or OneCore Family or Games Family
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES)IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetOwnerModuleFromUdpEntry(_In_ PMIB_UDPROW_OWNER_MODULE pUdpEntry,_In_ TCPIP_OWNER_MODULE_INFO_CLASS Class,_Out_writes_bytes_(*pdwSize) PVOID pBuffer,_Inout_ PDWORD pdwSize);#if (NTDDI_VERSION >= NTDDI_VISTA)
IPHLPAPI_DLL_LINKAGE
ULONG
WINAPI
GetTcpTable2(_Out_writes_bytes_opt_(*SizePointer) PMIB_TCPTABLE2 TcpTable,_Inout_ PULONG SizePointer,_In_ BOOL Order);
#endif // (NTDDI_VERSION >= NTDDI_VISTA)#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM | WINAPI_PARTITION_GAMES) */
#pragma endregion
这段代码展示了两个 Windows API 函数的声明,它们用于获取与 UDP 和 TCP 相关的网络信息。这些函数被包裹在条件编译块中,这意味着它们只在指定的 Windows API 家族中可用,包括桌面(Desktop)、OneCore 和游戏(Games)家族。
-
GetOwnerModuleFromUdpEntry函数:- 功能:获取与特定 UDP 条目关联的模块的所有者信息。
- 参数:
pUdpEntry:指向MIB_UDPROW_OWNER_MODULE结构的指针,该结构包含了要查询的 UDP 条目的信息。Class:指定要检索的模块信息的类别,例如TCPIP_OWNER_MODULE_INFO_BASIC。pBuffer:指向一个缓冲区,该缓冲区将接收模块的所有者信息。pdwSize:指向一个DWORD类型的变量,该变量在输入时指定pBuffer可以接收的字节数,在输出时返回实际写入pBuffer的字节数。
- 返回值:返回
NO_ERROR(0)表示成功,否则返回错误代码。
-
GetTcpTable2函数(仅在 Windows Vista 及更高版本中可用):- 功能:获取本地计算机上的 IPv4 TCP 连接、侦听器和绑定的端点的扩展表。
- 参数:
TcpTable:指向MIB_TCPTABLE2结构的指针,该结构将接收 TCP 表信息。SizePointer:指向一个ULONG类型的变量,该变量在输入时指定TcpTable可以接收的字节数,在输出时返回实际写入TcpTable的字节数。Order:一个布尔值,指示是否按本地端口号排序返回的表。
- 返回值:返回
NO_ERROR(0)表示成功,否则返回错误代码。
这些函数提供了对网络连接和侦听器的详细信息,包括模块所有者信息,这对于网络诊断和安全分析非常有用。例如,GetOwnerModuleFromUdpEntry 函数可以帮助确定哪个应用程序或模块拥有特定的 UDP 端口,而 GetTcpTable2 函数可以提供关于 TCP 连接状态的详细信息,包括连接的本地和远程端点、状态和拥塞窗口等。
MIB_UDPROW_OWNER_MODULE 结构都包含什么信息?
MIB_UDPROW_OWNER_MODULE 结构包含以下信息:
-
dwLocalAddr:本地计算机上的 UDP 终结点的 IPv4 地址,以网络字节序存储。如果值为零,则表示 UDP 侦听器愿意接受与本地计算机关联的任何 IP 接口的数据报。 -
dwLocalPort:本地计算机上的 UDP 终结点的端口号,也以网络字节序存储。 -
dwOwningPid:对 UDP 终结点的绑定函数发出调用的进程的进程 ID (PID)。如果 PID 不可用,此成员设置为 0。 -
liCreateTimestamp:一个LARGE_INTEGER类型的变量,表示何时调用 UDP 终结点的绑定函数,以FILETIME格式存储。 -
SpecificPortBind:一个标志,指示是否在上一个绑定操作中为该终结点指定了特定端口。 -
dwFlags:一组标志,当前未使用此成员。 -
OwningModuleInfo:一个ULONGLONG类型的数组,包含所有权信息的不透明数据。这个数组的大小由TCPIP_OWNING_MODULE_SIZE定义。
这些信息可以通过调用 GetExtendedUdpTable 函数获得,其中 TableClass 参数设置为 UDP_TABLE_OWNER_MODULE,ulAf 参数设置为 AF_INET。
MIB_TCPTABLE2 结构的指针都包含什么信息?
MIB_TCPTABLE2 结构包含以下信息:
-
dwNumEntries:一个DWORD类型的变量,表示MIB_TCPTABLE2结构中MIB_TCPROW2元素的数量。这个值指示了表中有多少个 TCP 连接。 -
table:一个数组,其中的每个元素都是MIB_TCPROW2结构。每个MIB_TCPROW2结构包含以下信息:dwState:TCP 连接的状态,可以是MIB_TCP_STATE枚举中的值之一,例如MIB_TCP_STATE_LISTEN、MIB_TCP_STATE_ESTAB等。dwLocalAddr:本地计算机上的 TCP 连接的 IPv4 地址,以网络字节序存储。如果值为零,则表示侦听器可以接受任何接口上的连接。dwLocalPort:本地计算机上的 TCP 连接的端口号,以网络字节序存储。dwRemoteAddr:远程计算机上的 TCP 连接的 IPv4 地址。如果连接状态是MIB_TCP_STATE_LISTEN,则此值没有意义。dwRemotePort:远程计算机上的 TCP 连接的端口号。如果连接状态是MIB_TCP_STATE_LISTEN,则此成员没有意义。dwOwningPid:拥有该 TCP 连接的进程的进程 ID (PID)。dwOffloadState:TCP 连接的卸载状态,指示该连接是否被卸载到网络接口卡或其他硬件以提高性能。
MIB_TCPTABLE2 结构通常由 GetTcpTable2 函数填充,该函数检索本地计算机上的 IPv4 TCP 连接表,并返回这些信息。这个结构提供了一种方式来枚举和检查系统上当前的 TCP 连接状态。