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的函数声明。下面是对这段代码的解释:
-
注释部分:
- 描述了
GetIfTable
函数的作用,即获取MIB-II的接口表(IfTable)。这个表包含了系统中所有网络接口的信息。
- 描述了
-
函数声明:
GetIfTable
是iphlpapi.dll
库中的一个导出函数,用于检索系统中所有网络接口的列表。
-
函数参数:
_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标准排序。
-
返回值:
- 函数返回一个
DWORD
类型的值,表示操作的状态。如果调用成功,返回ERROR_SUCCESS
(值为0)。如果调用失败,返回其他错误代码。
- 函数返回一个
使用这个函数时,你需要提供一个足够大的缓冲区来存储接口表,或者先传入一个空的缓冲区(NULL
),并设置 pdwSize
为0,以获取所需的缓冲区大小。然后根据返回的大小分配缓冲区,并再次调用函数以获取接口表。
MIB_IFROW 包含了网络接口的详细信息都有什么?
MIB_IFROW
是一个结构体,它包含了单个网络接口的详细信息。在Windows的网络管理API中,它用于通过 GetIfEntry
函数获取特定网络接口的状态和统计信息。以下是 MIB_IFROW
结构体通常包含的成员:
-
dwIndex
: 一个DWORD
类型的值,表示接口的索引号。这个索引号是唯一的,用于标识系统中的每个网络接口。 -
wszName
: 一个宽字符串(WCHAR
数组),包含接口的名称。例如,它可能是 “本地连接” 或 “无线网络连接”。 -
dwType
: 一个DWORD
类型的值,表示接口的类型,定义了接口的物理和网络层,例如以太网、令牌环、FDDI等。 -
dwMtu
: 一个DWORD
类型的值,表示最大传输单元(MTU),即接口可以处理的最大数据包大小。 -
dwSpeed
: 一个DWORD
类型的值,表示接口的传输速率,单位通常是bps(比特每秒)。 -
dwPhysAddrLen
: 一个DWORD
类型的值,表示物理地址(如MAC地址)的长度。 -
bPhysAddr
: 一个字节数组,包含接口的物理地址,如Ethernet的MAC地址。 -
dwAdminStatus
: 一个DWORD
类型的值,表示接口的管理员状态,表示是否启用。 -
dwOperStatus
/dwOperationalStatus
: 一个DWORD
类型的值,表示接口的操作状态,例如运行中、停止或正在初始化。 -
dwLastChange
: 一个DWORD
类型的值,表示自上次状态改变以来的时间,接口状态最后一次变化的时间,单位是秒。 -
dwInOctets
: 一个DWORD
类型的值,表示接收到的字节总数。 -
dwInUcastPkts
: 一个DWORD
类型的值,表示接收到的单播数据包总数。 -
dwInNUcastPkts
: 一个DWORD
类型的值,表示接收到的非单播(多播或广播)数据包总数。 -
dwInDiscards
: 一个DWORD
类型的值,表示因各种错误而被丢弃的数据包总数。 -
dwInErrors
: 一个DWORD
类型的值,表示接收到的错误数据包总数。 -
dwInUnknownProtos
: 一个DWORD
类型的值,表示接收到的未知协议数据包总数。 -
dwOutOctets
: 一个DWORD
类型的值,表示发送的字节总数。 -
dwOutUcastPkts
: 一个DWORD
类型的值,表示发送的单播数据包总数。 -
dwOutNUcastPkts
: 一个DWORD
类型的值,表示发送的非单播数据包总数。 -
dwOutDiscards
: 一个DWORD
类型的值,表示因各种错误而被丢弃的发送数据包总数。 -
dwOutErrors
: 一个DWORD
类型的值,表示发送时出现错误的数据包总数。 -
dwOutQLen
: 一个DWORD
类型的值,表示输出队列的长度。 -
dwDescrLen
: 接口描述的长度(如果有)。 -
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地址映射表。下面是对这段代码的详细解释:
-
注释部分:
- 描述了
GetIpAddrTable
函数的作用,即获取网络接口到IP地址的映射信息。
- 描述了
-
函数声明:
GetIpAddrTable
是iphlpapi.dll
库中的一个导出函数,用于检索系统中所有网络接口的IP地址信息。
-
参数说明:
pIpAddrTable
: 这是一个指向MIB_IPADDRTABLE
结构的指针,该结构将被函数填充,包含每个接口的IP地址信息。使用_Out_writes_bytes_opt_(*pdwSize)
属性,表示这个参数是输出缓冲区,其大小由*pdwSize
确定。如果缓冲区太小,函数将返回所需的缓冲区大小。pdwSize
: 一个ULONG
类型的指针,代表pIpAddrTable
缓冲区的大小。在调用函数之前,应设置为缓冲区的大小。如果调用返回ERROR_INSUFFICIENT_BUFFER
,*pdwSize
将被更新为所需的缓冲区大小。bOrder
: 一个布尔值参数。如果设置为TRUE
,IP地址表将按照某种顺序排序;如果为FALSE
,IP地址表将按照接口的索引顺序排列。
-
返回值:
- 函数返回一个
DWORD
类型的值,表示调用的结果。如果返回值为ERROR_SUCCESS
(通常是0),则表示调用成功,并且pIpAddrTable
被成功填充。如果返回其他错误代码,表示调用失败。
- 函数返回一个
-
使用场景:
- 此函数通常用于网络管理应用程序,用以获取系统中所有网络接口的IP地址列表,例如进行网络配置、诊断或监控。
-
注意事项:
- 在第一次调用
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.h 和 Iprtrmib.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表)的映射。 -
函数声明:
-
GetIpNetTable
是iphlpapi.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路由表。以下是对这段代码和函数的解释:
-
注释部分:
- 注释说明了
GetIpForwardTable
函数的作用:获取IP路由表信息。
- 注释说明了
-
函数声明:
GetIpForwardTable
是iphlpapi.dll
库中的导出函数,用于检索本机的IP路由表。
-
参数描述:
pIpForwardTable
: 这是一个指向MIB_IPFORWARDTABLE
结构的指针,该结构将被函数填充,包含IP路由表的信息。使用_Out_writes_bytes_opt_(*pdwSize)
属性,表示这个参数是输出缓冲区,其大小由*pdwSize
字段确定。pdwSize
: 指向ULONG
类型的指针,表示pIpForwardTable
缓冲区的大小。在调用函数之前,它应该被初始化为缓冲区的大小,如果函数返回ERROR_INSUFFICIENT_BUFFER
,它将被设置为所需的缓冲区大小。bOrder
: 布尔值参数,用于指定函数返回的路由表是否按目的网络地址排序。如果 bOrder 为 TRUE,则路由表将被排序。
-
返回值:
- 函数返回
DWORD
类型的值,表示函数调用的结果。如果返回值为NO_ERROR
(通常是0),表示调用成功,并且pIpForwardTable
被填充了有效的数据。其他任何值表示调用失败。
- 函数返回
-
使用场景:
- 此函数通常用于需要获取IP路由表信息的情况,如网络监控、故障排除或路由策略分析。
-
注意事项:
- 在调用
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_OTHER
、MIB_IPPROTO_LOCAL
、MIB_IPPROTO_NETMGMT
等。dwForwardAge
: 自从此条目最后一次更新以来的时间,以秒为单位。dwForwardNextHopAS
: 下一跳的自治系统号,如果适用。dwForwardMetric1
到dwForwardMetric5
: 路由的度量值,这些值用于路由选择过程,具体含义取决于所使用的路由协议。
使用 GetIpForwardTable
函数可以填充 MIB_IPFORWARDTABLE
结构体,从而获取当前的 IP 路由表信息。这对于网络管理和故障排除非常有用。