当前位置: 首页 > news >正文

WindowsAPI|每天了解几个winAPI接口之Iphlpapi.h网络配置相关文档详细分析二

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

文章目录

  • GetIfTable:获取MIB-II的接口表(IfTable)这个表包含了系统中所有网络接口的信息
    • MIB_IFROW 包含了网络接口的详细信息都有什么?
  • GetIpAddrTable:获取系统中所有网络接口的IP地址映射表
    • MIB_IPADDRROW 结构体
  • GetIpNetTable:获取当前的IP地址到物理地址(即ARP表)的映射信息
    • MIB_IPNETTABLE 结构体
  • GetIpForwardTable:获取当前的IP路由表
    • MIB_IPFORWARDTABLE 结构体

GetIfTable:获取MIB-II的接口表(IfTable)这个表包含了系统中所有网络接口的信息

//
//                                                                          //
// Gets the MIB-II IfTable                                                  //
//                                                                          //
//IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIfTable(_Out_writes_bytes_opt_(*pdwSize) PMIB_IFTABLE pIfTable,_Inout_                    PULONG       pdwSize,_In_                       BOOL         bOrder);

这段代码是Windows网络管理API的一部分,它定义了如何获取MIB-II IfTable的函数声明。下面是对这段代码的解释:

  1. 注释部分

    • 描述了 GetIfTable 函数的作用,即获取MIB-II的接口表(IfTable)。这个表包含了系统中所有网络接口的信息。
  2. 函数声明

    • GetIfTableiphlpapi.dll 库中的一个导出函数,用于检索系统中所有网络接口的列表。
  3. 函数参数

    • _Out_writes_bytes_opt_(*pdwSize) PMIB_IFTABLE pIfTable:这是一个输出参数,指向 MIB_IFTABLE 结构的指针。MIB_IFTABLE 结构包含了一个 MIB_IFROW 结构的数组,每个 MIB_IFROW 包含了一个接口的信息。_Out_writes_bytes_opt_(*pdwSize) 表示这个参数的大小由 pdwSize 参数指定,并且如果 pdwSize 为0,则这个参数可以是 NULL
    • _Inout_ PULONG pdwSize:这是一个输入输出参数,指向一个 ULONG 值的指针。在调用函数之前,这个值应该设置为 pIfTable 缓冲区的大小。如果缓冲区不够大,函数会设置这个值为所需的大小,并返回 ERROR_INSUFFICIENT_BUFFER 错误。
    • _In BOOL bOrder:这是一个输入参数,布尔值。如果设置为 TRUE,则返回的接口表将按照MIB-II标准排序。
  4. 返回值

    • 函数返回一个 DWORD 类型的值,表示操作的状态。如果调用成功,返回 ERROR_SUCCESS(值为0)。如果调用失败,返回其他错误代码。

使用这个函数时,你需要提供一个足够大的缓冲区来存储接口表,或者先传入一个空的缓冲区(NULL),并设置 pdwSize 为0,以获取所需的缓冲区大小。然后根据返回的大小分配缓冲区,并再次调用函数以获取接口表。

MIB_IFROW 包含了网络接口的详细信息都有什么?

MIB_IFROW 是一个结构体,它包含了单个网络接口的详细信息。在Windows的网络管理API中,它用于通过 GetIfEntry 函数获取特定网络接口的状态和统计信息。以下是 MIB_IFROW 结构体通常包含的成员:

  1. dwIndex: 一个 DWORD 类型的值,表示接口的索引号。这个索引号是唯一的,用于标识系统中的每个网络接口。

  2. wszName: 一个宽字符串(WCHAR 数组),包含接口的名称。例如,它可能是 “本地连接” 或 “无线网络连接”。

  3. dwType: 一个 DWORD 类型的值,表示接口的类型,定义了接口的物理和网络层,例如以太网、令牌环、FDDI等。

  4. dwMtu: 一个 DWORD 类型的值,表示最大传输单元(MTU),即接口可以处理的最大数据包大小。

  5. dwSpeed: 一个 DWORD 类型的值,表示接口的传输速率,单位通常是bps(比特每秒)。

  6. dwPhysAddrLen: 一个 DWORD 类型的值,表示物理地址(如MAC地址)的长度。

  7. bPhysAddr: 一个字节数组,包含接口的物理地址,如Ethernet的MAC地址。

  8. dwAdminStatus: 一个 DWORD 类型的值,表示接口的管理员状态,表示是否启用。

  9. dwOperStatus / dwOperationalStatus: 一个 DWORD 类型的值,表示接口的操作状态,例如运行中、停止或正在初始化。

  10. dwLastChange: 一个 DWORD 类型的值,表示自上次状态改变以来的时间,接口状态最后一次变化的时间,单位是秒。

  11. dwInOctets: 一个 DWORD 类型的值,表示接收到的字节总数。

  12. dwInUcastPkts: 一个 DWORD 类型的值,表示接收到的单播数据包总数。

  13. dwInNUcastPkts: 一个 DWORD 类型的值,表示接收到的非单播(多播或广播)数据包总数。

  14. dwInDiscards: 一个 DWORD 类型的值,表示因各种错误而被丢弃的数据包总数。

  15. dwInErrors: 一个 DWORD 类型的值,表示接收到的错误数据包总数。

  16. dwInUnknownProtos: 一个 DWORD 类型的值,表示接收到的未知协议数据包总数。

  17. dwOutOctets: 一个 DWORD 类型的值,表示发送的字节总数。

  18. dwOutUcastPkts: 一个 DWORD 类型的值,表示发送的单播数据包总数。

  19. dwOutNUcastPkts: 一个 DWORD 类型的值,表示发送的非单播数据包总数。

  20. dwOutDiscards: 一个 DWORD 类型的值,表示因各种错误而被丢弃的发送数据包总数。

  21. dwOutErrors: 一个 DWORD 类型的值,表示发送时出现错误的数据包总数。

  22. dwOutQLen: 一个 DWORD 类型的值,表示输出队列的长度。

  23. dwDescrLen: 接口描述的长度(如果有)。

  24. bDescr: 接口的描述信息,如果有。

这些成员提供了网络接口的全面视图,包括其名称、类型、状态、速率、地址、统计信息等。这些信息对于网络管理和故障排除非常重要。
请注意,不同的Windows版本和编译环境可能会有细微差别,上述字段是标准的 MIB_IFROW 结构体中常见的成员。使用这个结构体的应用程序可以查询网络接口的当前状态和统计数据,用于诊断和监控网络功能。

GetIpAddrTable:获取系统中所有网络接口的IP地址映射表

//
//                                                                          //
// Gets the Interface to IP Address mapping                                 //
//                                                                          //
//IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIpAddrTable(_Out_writes_bytes_opt_(*pdwSize)    PMIB_IPADDRTABLE pIpAddrTable,_Inout_                       PULONG           pdwSize,_In_                          BOOL             bOrder);

这段代码是一个函数声明,它属于Windows网络管理API,用于获取系统中所有网络接口的IP地址映射表。下面是对这段代码的详细解释:

  1. 注释部分

    • 描述了 GetIpAddrTable 函数的作用,即获取网络接口到IP地址的映射信息。
  2. 函数声明

    • GetIpAddrTableiphlpapi.dll 库中的一个导出函数,用于检索系统中所有网络接口的IP地址信息。
  3. 参数说明

    • pIpAddrTable: 这是一个指向 MIB_IPADDRTABLE 结构的指针,该结构将被函数填充,包含每个接口的IP地址信息。使用 _Out_writes_bytes_opt_(*pdwSize) 属性,表示这个参数是输出缓冲区,其大小由 *pdwSize 确定。如果缓冲区太小,函数将返回所需的缓冲区大小。
    • pdwSize: 一个 ULONG 类型的指针,代表 pIpAddrTable 缓冲区的大小。在调用函数之前,应设置为缓冲区的大小。如果调用返回 ERROR_INSUFFICIENT_BUFFER*pdwSize 将被更新为所需的缓冲区大小。
    • bOrder: 一个布尔值参数。如果设置为 TRUE,IP地址表将按照某种顺序排序;如果为 FALSE,IP地址表将按照接口的索引顺序排列。
  4. 返回值

    • 函数返回一个 DWORD 类型的值,表示调用的结果。如果返回值为 ERROR_SUCCESS(通常是0),则表示调用成功,并且 pIpAddrTable 被成功填充。如果返回其他错误代码,表示调用失败。
  5. 使用场景

    • 此函数通常用于网络管理应用程序,用以获取系统中所有网络接口的IP地址列表,例如进行网络配置、诊断或监控。
  6. 注意事项

    • 在第一次调用 GetIpAddrTable 之前,你需要分配一个足够大的缓冲区来存储IP地址表,并设置 *pdwSize 为该缓冲区的大小。如果函数返回 ERROR_INSUFFICIENT_BUFFER,你需要根据 *pdwSize 更新的值重新分配一个更大的缓冲区,并再次调用函数。

MIB_IPADDRTABLE 结构体通常包含一个或多个 MIB_IPADDRROW 结构体的数组,每个 MIB_IPADDRROW 结构体代表一个接口的IP地址信息,包括IP地址、子网掩码、相关接口的索引等。

MIB_IPADDRROW 结构体

MIB_IPADDRROW 结构体用于存储Windows系统中特定IPv4地址的详细信息,其定义在 Windows 平台的网络管理API中。以下是该结构体的一些主要成员:

  • dwAddr: 以网络字节顺序排列的IPv4地址。
  • dwIndex: 与此IPv4地址关联的接口索引。这个索引是唯一的,用于标识一个网络接口。在Windows XP及更高版本上,这个成员的数据类型是 IF_INDEX
  • dwMask: 以网络字节顺序排列的IPv4地址的子网掩码。
  • dwBCastAddr: 以网络字节顺序排列的广播地址。广播地址通常是将IP地址的主机部分全部置为1的地址。但请注意,GetIpAddrTable 函数并不返回此成员的正确值。
  • dwReasmSize: 表示在该实体上重组IP数据报分片的最大长度。
  • unused1: 在Windows XP及更高版本上,这个成员是未使用的。
  • wType: 此字段在Windows XP及更高版本上可用,用于指定IP地址的类型。

MIB_IPADDRROW 结构体通常用于与 GetIpAddrTable 函数一起工作,该函数检索本地计算机上的接口到IPv4地址映射表,并在 MIB_IPADDRTABLE 结构中返回此信息。MIB_IPADDRTABLE 结构中的 table 成员是一个 MIB_IPADDRROW 项数组。

在Windows 2000及更早的版本中,dwIndex 成员的类型可能不是 IF_INDEX,并且 wType 成员可能被定义为“未使用2”。此外,在Windows Vista及更高版本的SDK中,MIB_IPADDRROW 结构在 Ipmib.h 头文件中定义,而不是 Iprtrmib.h 头文件中定义。但是,Ipmib.h 头文件会自动包含在 Iphlpapi.h 头文件中的 Iprtrmib.h 中,因此开发人员不应直接使用 Ipmib.hIprtrmib.h 头文件。

这些信息是直接从 Microsoft Learn 文档和博客文章中提取的,提供了对 MIB_IPADDRROW 结构体的详细描述及其在网络编程中的使用情况。

GetIpNetTable:获取当前的IP地址到物理地址(即ARP表)的映射信息

//
//                                                                          //
// Gets the current IP Address to Physical Address (ARP) mapping            //
//                                                                          //
//IPHLPAPI_DLL_LINKAGE
ULONG
WINAPI
GetIpNetTable(_Out_writes_bytes_opt_(*SizePointer) PMIB_IPNETTABLE IpNetTable,_Inout_                        PULONG          SizePointer,_In_                           BOOL            Order);

这段代码是一个Windows网络管理API函数 GetIpNetTable 的声明,它用于获取当前的IP地址到物理地址(即ARP表)的映射信息。以下是对代码的解释:

  • 注释说明

  • 注释部分说明了 GetIpNetTable 函数的作用:获取当前的IP地址到物理地址(ARP表)的映射。

  • 函数声明

  • GetIpNetTableiphlpapi.dll 库中的一个导出函数,用于检索本地计算机上的IP网络表,即ARP表,其中包括IP地址到物理(MAC)地址的映射。

  • 参数描述

  • IpNetTable: 这是一个 PMIB_IPNETTABLE 类型的指针,指向一个结构体,该结构将被函数填充,包含IP地址到物理地址的映射信息。使用 _Out_writes_bytes_opt_(*SizePointer) 属性,表示这个参数是输出参数,其大小由 *SizePointer 字段确定。

  • SizePointer: 指向 ULONG 类型的指针,表示 IpNetTable 缓冲区的大小。调用函数之前,它应该被初始化为缓冲区的大小,如果函数返回 ERROR_INSUFFICIENT_BUFFER,它将被设置为所需的缓冲区大小。

  • Order: 布尔值参数,指定是否需要对返回的表进行排序。这个参数在 GetIpNetTable 函数中的作用可能与其它函数中的排序参数有所不同,具体作用可能依赖于实现和文档。

  • 返回值

  • 函数返回 ULONG 类型值,表示函数调用的结果。如果返回 NO_ERROR(通常是0),表示调用成功,并且 IpNetTable 被填充了有效的数据。其他任何非零值表示调用失败。

  • 使用场景

  • 此函数常用于网络诊断工具或网络管理应用程序,用以获取本机的ARP表信息,了解IP地址与物理地址的映射关系。

  • 注意事项

  • 与其它缓冲区相关的API一样,在使用 GetIpNetTable 之前,你需要分配一个足够大的缓冲区,并在调用前设置 SizePointer。如果缓冲区太小,API会返回 ERROR_INSUFFICIENT_BUFFER,此时需要根据 *SizePointer 指定的新大小重新分配缓冲区,并再次调用函数。
    请注意,实际的 GetIpNetTable 函数原型可能与这里提供的注释有所不同,具体实现和行为应参考最新的Windows SDK文档。

MIB_IPNETTABLE 结构体

MIB_IPNETTABLE 结构体是 Windows 网络管理 API 的一部分,用于存储 IP 地址到物理(MAC)地址的映射信息,也就是通常所说的 ARP 表。以下是 MIB_IPNETTABLE 结构体的一般定义和成员:

typedef struct _MIB_IPNETTABLE {DWORD dwNumEntries;MIB_IPNETROW table[ANY_SIZE]; // 一个指向MIB_IPNETROW结构数组的指针
} MIB_IPNETTABLE, *PMIB_IPNETTABLE;

成员说明:

  • dwNumEntries: 一个 DWORD 类型的值,表示 table 数组中的条目数量,即系统中有多少个IP到物理地址的映射。

  • table: 一个 MIB_IPNETROW 结构体数组,每个数组元素包含了一个特定的 IP 地址到物理地址的映射信息。ANY_SIZE 是一个宏,表示数组可以有任意大小,实际大小由 dwNumEntries 成员指定。

MIB_IPNETROW 结构体是 MIB_IPNETTABLE 结构体数组中的元素类型,它通常包含以下字段:

typedef struct _MIB_IPNETROW {DWORD dwIndex;           // 接口索引DWORD dwPhysAddrLen;    // 物理地址长度,通常为MAC地址长度BYTE  bPhysAddr[8];     // 物理地址,即MAC地址DWORD dwAddr;           // IP地址DWORD dwType;           // 行类型,例如动态、静态等
} MIB_IPNETROW, *PMIB_IPNETROW;

成员说明:

  • dwIndex: 一个 DWORD 类型的值,表示与此物理地址关联的网络接口的索引。
  • dwPhysAddrLen: 一个 DWORD 类型的值,表示 bPhysAddr 数组的长度,通常是6,对应于标准的MAC地址长度。
  • bPhysAddr: 一个8字节的字节数组,存储了物理地址(例如,以太网的MAC地址)。
  • dwAddr: 一个 DWORD 类型的值,表示与物理地址关联的IP地址。
  • dwType: 一个 DWORD 类型的值,表示映射的类型,例如静态ARP条目或动态ARP条目。

使用 GetIpNetTable 函数可以填充 MIB_IPNETTABLE 结构体,从而获取当前的 ARP 表信息。这在网络诊断和配置中非常有用。

每个 MIB_IPNETROW 结构包含了接口索引、IP地址、物理(MAC)地址等信息。具体的字段可能会根据 Windows 版本的不同而有所变化。

GetIpForwardTable:获取当前的IP路由表

//
//                                                                          //
// Gets the IP Routing Table  (RFX XXXX)                                    //
//                                                                          //
//IPHLPAPI_DLL_LINKAGE
DWORD
WINAPI
GetIpForwardTable(_Out_writes_bytes_opt_(*pdwSize)    PMIB_IPFORWARDTABLE pIpForwardTable,_Inout_                       PULONG              pdwSize,_In_                          BOOL                bOrder);

这段代码是Windows网络管理API中的GetIpForwardTable函数的函数原型,用于获取当前的IP路由表。以下是对这段代码和函数的解释:

  1. 注释部分

    • 注释说明了GetIpForwardTable函数的作用:获取IP路由表信息。
  2. 函数声明

    • GetIpForwardTableiphlpapi.dll库中的导出函数,用于检索本机的IP路由表。
  3. 参数描述

    • pIpForwardTable: 这是一个指向MIB_IPFORWARDTABLE结构的指针,该结构将被函数填充,包含IP路由表的信息。使用_Out_writes_bytes_opt_(*pdwSize)属性,表示这个参数是输出缓冲区,其大小由*pdwSize字段确定。
    • pdwSize: 指向ULONG类型的指针,表示pIpForwardTable缓冲区的大小。在调用函数之前,它应该被初始化为缓冲区的大小,如果函数返回ERROR_INSUFFICIENT_BUFFER,它将被设置为所需的缓冲区大小。
    • bOrder: 布尔值参数,用于指定函数返回的路由表是否按目的网络地址排序。如果 bOrder 为 TRUE,则路由表将被排序。
  4. 返回值

    • 函数返回DWORD类型的值,表示函数调用的结果。如果返回值为NO_ERROR(通常是0),表示调用成功,并且pIpForwardTable被填充了有效的数据。其他任何值表示调用失败。
  5. 使用场景

    • 此函数通常用于需要获取IP路由表信息的情况,如网络监控、故障排除或路由策略分析。
  6. 注意事项

    • 在调用GetIpForwardTable之前,你需要分配一个足够大的缓冲区来存储路由表,并在调用前设置pdwSize。如果缓冲区太小,API会返回ERROR_INSUFFICIENT_BUFFER,此时需要根据*pdwSize指定的新大小重新分配缓冲区,并再次调用函数。

MIB_IPFORWARDTABLE结构体通常包含以下字段:

  • dwNumEntries: 表中的条目数。
  • table: 包含MIB_IPFORWARDROW结构的数组,每个数组元素代表一个特定的路由。

每个MIB_IPFORWARDROW结构包含了目的网络、网关、子网掩码、接口索引等信息。具体的字段可能会根据Windows版本的不同而有所变化。使用这个函数可以帮助了解数据包是如何在你的网络或通过你的网络路由的。

MIB_IPFORWARDTABLE 结构体

MIB_IPFORWARDTABLE 结构体在 Windows 网络管理 API 中用于表示 IP 路由表。这个结构体包含了一系列的路由项,每个路由项定义了如何到达特定的网络目的地。路由表中的每一条记录通常包含了目的网络、掩码、下一跳地址、接口指标等信息。以下是 MIB_IPFORWARDTABLE 结构体的一般定义和成员:

typedef struct _MIB_IPFORWARDTABLE {DWORD                          dwNumEntries;MIB_IPFORWARDROW               table[ANY_SIZE];
} MIB_IPFORWARDTABLE, *PMIB_IPFORWARDTABLE;

成员说明:

  • dwNumEntries: 一个 DWORD 类型的值,表示路由表中 MIB_IPFORWARDROW 结构的数量,即表中的路由条目总数。

  • table: 一个可变大小的数组, MIB_IPFORWARDROW 结构体数组,每个元素包含单个路由项的详细信息。ANY_SIZE 是一个宏,表示数组可以有任意大小,实际大小由 dwNumEntries 成员指定。

MIB_IPFORWARDROW 结构体是 MIB_IPFORWARDTABLE 结构体数组中的元素类型,它通常包含以下字段:

typedef struct _MIB_IPFORWARDROW {DWORD          dwForwardDest;     // 目的IP地址DWORD          dwForwardMask;     // 目的网络的子网掩码DWORD          dwForwardPolicy;   // 路由策略(Windows XP 及以后版本中使用)DWORD          dwForwardNextHop;  // 下一跳IP地址DWORD          dwForwardIfIndex;  // 此路由使用的接口索引DWORD          dwForwardType;     // 路由类型(如常规、特殊等)DWORD          dwForwardProto;    // 路由协议(如自动、手动、OSPF、RIP等)DWORD          dwForwardAge;      // 自从此条目最后一次更新以来的时间(秒)DWORD          dwForwardNextHopAS; // 下一跳的自治系统号(Windows XP 及以后版本中使用)DWORD          dwForwardMetric1;  // 路由的度量值1DWORD          dwForwardMetric2;  // 路由的度量值2DWORD          dwForwardMetric3;  // 路由的度量值3DWORD          dwForwardMetric4;  // 路由的度量值4DWORD          dwForwardMetric5;  // 路由的度量值5
} MIB_IPFORWARDROW, *PMIB_IPFORWARDROW;

成员说明:

  • dwForwardDest: 目的IP地址,表示路由项所对应的目标网络或主机地址。
  • dwForwardMask: 目的网络的子网掩码,用来确定目的地址的哪些部分用于匹配目的网络。
  • dwForwardPolicy: 路由策略字段,通常未使用。
  • dwForwardNextHop: 下一跳IP地址,数据包将被发送到这个地址以到达目的地。
  • dwForwardIfIndex: 此路由使用的接口索引,用于标识数据包将通过的网络接口。
  • dwForwardType: 路由类型,例如 MIB_IPROUTE_TYPE_INDIRECT(间接路由)或 MIB_IPROUTE_TYPE_DIRECT(直接路由)。
  • dwForwardProto: 定义此路由的协议,例如 MIB_IPPROTO_OTHERMIB_IPPROTO_LOCALMIB_IPPROTO_NETMGMT 等。
  • dwForwardAge: 自从此条目最后一次更新以来的时间,以秒为单位。
  • dwForwardNextHopAS: 下一跳的自治系统号,如果适用。
  • dwForwardMetric1dwForwardMetric5: 路由的度量值,这些值用于路由选择过程,具体含义取决于所使用的路由协议。

使用 GetIpForwardTable 函数可以填充 MIB_IPFORWARDTABLE 结构体,从而获取当前的 IP 路由表信息。这对于网络管理和故障排除非常有用。


http://www.mrgr.cn/news/49523.html

相关文章:

  • finebi面试题精选
  • 芋道快速开发平台学习笔记
  • AD9248驱动的简易示波器设计——FPGA学习笔记21
  • 三、ElementPlus下拉搜索加弹窗组件的封装
  • text2sql: multi-agent实现思路MAC-SQL
  • 动力电池SOC估算方法
  • AI 能否替代程序员?且听我来一唠!
  • 【MySQL】数据库基础指令(一)
  • QT开发--串口通信
  • 短视频为什么让人上瘾
  • 第十六周学习周报
  • QML6 项目生成缓存文件取消办法
  • 【前端】Bootstrap:响应式布局与工具类
  • python库下载镜像
  • jenkins知识整理
  • Python基础常见面试题总结
  • c++面向对象三大特性——多态详解与虚函数,虚函数底层
  • spring task的使用场景
  • WorkFlow GO-Task 源码分析
  • BUUCTF-greatescape1