上一篇: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
是一个枚举类型,可以是以下几种值之一:TcpipOwnerModuleInfoBasic
TcpipOwnerModuleInfoEnhanced
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 连接状态。