上一篇:WindowsAPI|每天了解几个winAPI接口之Iphlpapi.h网络配置相关文档详细分析2
下一篇:WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析4
如果有错误欢迎指正批评,在此只作为科普和参考。

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连接的信息。下面是每个函数的简要说明:

  1. GetTcpTable 函数:

    • 功能:获取一个包含当前所有TCP连接、监听端口和其他TCP表条目的表。
    • 参数:
      • TcpTable:指向一个MIB_TCPTABLE结构的指针,该结构将接收TCP表。
      • SizePointer:一个指向变量的指针,该变量在输入时表示TcpTable的大小,在输出时表示填充TcpTable所需的实际大小。
      • Order:如果为TRUE,则返回的TCP表将按连接状态排序;如果为FALSE,则不排序。
  2. GetExtendedTcpTable 函数:

    • 功能:获取一个扩展的TCP连接表,可以提供比GetTcpTable更多的信息,比如每个连接的进程ID或模块信息。
    • 参数:
      • pTcpTable:指向缓冲区的指针,该缓冲区将接收扩展的TCP表。
      • pdwSize:指向变量的指针,该变量在输入时表示pTcpTable的大小,在输出时表示填充pTcpTable所需的实际大小。
      • bOrder:与GetTcpTable中的Order参数相同。
      • ulAf:指定地址族(AF_INET表示IPv4,AF_INET6表示IPv6)。
      • TableClass:指定需要哪种类型的TCP表(例如,只包含监听端口的表,只包含连接的表,或者两者都包含)。
      • Reserved:保留参数,必须设置为0。

这段代码还包含了预处理指令,这些指令用于确保只有在特定的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连接。

参数

  1. pTcpEntry:指向MIB_TCPROW_OWNER_MODULE结构的指针,该结构包含要查询的TCP连接的索引信息。
  2. Class:指定要检索的信息类型。TCPIP_OWNER_MODULE_INFO_CLASS是一个枚举类型,可以是以下几种值之一:
    • TcpipOwnerModuleInfoBasic
    • TcpipOwnerModuleInfoEnhanced
  3. pBuffer:指向一个缓冲区,该缓冲区将接收请求的信息。缓冲区的内容取决于Class参数的值。
  4. pdwSize:指向一个变量的指针,该变量在输入时表示pBuffer的大小,在输出时表示填充pBuffer所需的实际大小。

返回值

  • 函数返回一个DWORD值,表示操作的结果。常见的返回值包括:
    • NO_ERROR:成功完成操作。
    • ERROR_INSUFFICIENT_BUFFER:提供的缓冲区大小不足以存储请求的信息。
    • ERROR_INVALID_PARAMETER:一个或多个参数无效。

使用场景

  • 当需要确定哪个网络模块或进程拥有特定的TCP连接时,可以使用此函数。这对于调试网络应用、安全审计或网络监控等场景非常有用。

这段代码还包含了预处理指令,这些指令用于确保只有在特定的Windows平台版本下才编译这个函数。WINAPI_FAMILY_PARTITION宏用于确定当前的Windows平台版本,以确保代码只在一个特定的应用程序家族(如桌面、系统、游戏)中编译。这有助于确保API的可用性与应用程序的目标平台相匹配。

TcpipOwnerModuleInfoBasic&TcpipOwnerModuleInfoEnhanced是什么

TcpipOwnerModuleInfoBasicTcpipOwnerModuleInfoEnhancedTCPIP_OWNER_MODULE_INFO_CLASS 枚举的成员,用于指定在调用 GetOwnerModuleFromTcpEntry 函数时希望检索的模块信息类型。这些枚举值决定了函数返回的信息详细程度。

  1. TcpipOwnerModuleInfoBasic:这是一个基础的信息类,它返回与 TCP 连接相关联的模块的基本信息。根据搜索结果,TCPIP_OWNER_MODULE_BASIC_INFO 结构体包含两个成员:pModuleNamepModulePath。这些成员分别指向模块的名称和包括模块名称的完整路径。如果模块所有者是系统内核,则这些成员指向包含“System”的宽字符串。TCPIP_OWNER_MODULE_BASIC_INFO 结构在 Windows Vista 及更高版本中定义于 iprtrmib.h 头文件中。

  2. 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端点信息,包括监听的端口和相关的统计数据。以下是每个函数的简要说明:

  1. GetUdpTable 函数:

    • 功能:获取一个包含所有UDP监听端口的表格。
    • 参数:
      • UdpTable:指向一个MIB_UDPTABLE结构的指针,该结构将接收UDP表。
      • SizePointer:一个指向变量的指针,该变量在输入时表示UdpTable的大小,在输出时表示填充UdpTable所需的实际大小。
      • Order:如果为TRUE,则返回的UDP表将按端口号排序;如果为FALSE,则不排序。
  2. 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端口使用情况。

代码中的预处理指令确保只有在特定的Windows平台版本下才编译这些函数。WINAPI_FAMILY_PARTITION宏用于确定当前的Windows平台版本,以确保代码只在一个特定的应用程序家族(如应用程序、系统、游戏)中编译。这有助于确保API的可用性与应用程序的目标平台相匹配。

MIB_UDPTABLE 结构的指针都包含什么信息?

MIB_UDPTABLE 结构的指针指向一个包含本地计算机上所有 UDP 侦听器信息的表。这个表由多个 MIB_UDPROW 结构组成,每个 MIB_UDPROW 结构代表一个 UDP 侦听器。以下是 MIB_UDPTABLE 结构包含的信息:

  1. dwNumEntries:一个 DWORD 类型的变量,表示 MIB_UDPTABLE 结构中 MIB_UDPROW 元素的数量。这个值指示了表中有多少个 UDP 侦听器。

  2. 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)家族。

  1. GetOwnerModuleFromUdpEntry 函数:

    • 功能:获取与特定 UDP 条目关联的模块的所有者信息。
    • 参数:
      • pUdpEntry:指向 MIB_UDPROW_OWNER_MODULE 结构的指针,该结构包含了要查询的 UDP 条目的信息。
      • Class:指定要检索的模块信息的类别,例如 TCPIP_OWNER_MODULE_INFO_BASIC
      • pBuffer:指向一个缓冲区,该缓冲区将接收模块的所有者信息。
      • pdwSize:指向一个 DWORD 类型的变量,该变量在输入时指定 pBuffer 可以接收的字节数,在输出时返回实际写入 pBuffer 的字节数。
    • 返回值:返回 NO_ERROR(0)表示成功,否则返回错误代码。
  2. 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 结构包含以下信息:

  1. dwLocalAddr:本地计算机上的 UDP 终结点的 IPv4 地址,以网络字节序存储。如果值为零,则表示 UDP 侦听器愿意接受与本地计算机关联的任何 IP 接口的数据报。

  2. dwLocalPort:本地计算机上的 UDP 终结点的端口号,也以网络字节序存储。

  3. dwOwningPid:对 UDP 终结点的绑定函数发出调用的进程的进程 ID (PID)。如果 PID 不可用,此成员设置为 0。

  4. liCreateTimestamp:一个 LARGE_INTEGER 类型的变量,表示何时调用 UDP 终结点的绑定函数,以 FILETIME 格式存储。

  5. SpecificPortBind:一个标志,指示是否在上一个绑定操作中为该终结点指定了特定端口。

  6. dwFlags:一组标志,当前未使用此成员。

  7. OwningModuleInfo:一个 ULONGLONG 类型的数组,包含所有权信息的不透明数据。这个数组的大小由 TCPIP_OWNING_MODULE_SIZE 定义。

这些信息可以通过调用 GetExtendedUdpTable 函数获得,其中 TableClass 参数设置为 UDP_TABLE_OWNER_MODULEulAf 参数设置为 AF_INET

MIB_TCPTABLE2 结构的指针都包含什么信息?

MIB_TCPTABLE2 结构包含以下信息:

  1. dwNumEntries:一个 DWORD 类型的变量,表示 MIB_TCPTABLE2 结构中 MIB_TCPROW2 元素的数量。这个值指示了表中有多少个 TCP 连接。

  2. table:一个数组,其中的每个元素都是 MIB_TCPROW2 结构。每个 MIB_TCPROW2 结构包含以下信息:

    • dwState:TCP 连接的状态,可以是 MIB_TCP_STATE 枚举中的值之一,例如 MIB_TCP_STATE_LISTENMIB_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 连接状态。

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐