IPCONFIG.EXE程序展示了两天信息:IPv4配置信息和IPv4配置参数。

要获得这些配置信息,利用GetNetworkParams函数即可

  1. DWORD GetNetworkParams( 
  2.   __out         PFIXED_INFO pFixedInfo, 
  3.   __in          PULONG pOutBufLen 
  4. ); 

 

 

pFixedInfo取得一个缓冲区指针,该缓冲区接收PFIXED_INFO结构,应用程序必须提供这个结构,以便获得IPv4配置信息。

pOutBufLen是一个变量指针,指定传递到pFixedInfo中那个缓冲区的长度。如果提供的缓冲区不够大,函数就会返回ERROR_BUFFER_OVERFLOW错误,并将pOutBufLen设为正确的缓冲区长度。

  1. typedef struct {   
  2.     char HostName[MAX_HOSTNAME_LEN + 4];   
  3.     char DomainName[MAX_DOMAIN_NAME_LEN + 4];   
  4.     PIP_ADDR_STRING CurrentDnsServer;   
  5.     IP_ADDR_STRING DnsServerList;   
  6.     UINT NodeType;   
  7.     char ScopeId[MAX_SCOPE_ID_LEN + 4];   
  8.     UINT EnableRouting;   
  9.     UINT EnableProxy;   
  10.     UINT EnableDns; 
  11. } FIXED_INFO, *PFIXED_INFO; 

 

 

获得网络接口特有的IP配置信息可以用GetAdaptersInfo函数:

  1. DWORD GetAdaptersInfo( 
  2.   __out         PIP_ADAPTER_INFO pAdapterInfo, 
  3.   __in_out      PULONG pOutBufLen 
  4. ); 

 

pAdapterInfo参数来把一个指针投递给应用程序提供的缓冲区,这个缓冲区接收一个ADAPTER_INFO数据结构,这个结构中包含这个适配器的配置信息。

pOutBufLen参数是一个指针变量,指定传到pAdapterInfo参数中缓冲区的长度,如果提供的缓冲区不够大,函数返回ERROR_BUFFER_OVERFLOW,并把pOutBufLen设为需要的缓冲区长度。

  1. typedef struct _IP_ADAPTER_INFO {   
  2.     struct _IP_ADAPTER_INFO* Next;   
  3.     DWORD ComboIndex;   
  4.     char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];   
  5.     char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];   
  6.     UINT AddressLength;   
  7.     BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];   
  8.     DWORD Index;   
  9.     UINT Type;   
  10.     UINT DhcpEnabled;   
  11.     PIP_ADDR_STRING CurrentIpAddress;   
  12.     IP_ADDR_STRING IpAddressList;   
  13.     IP_ADDR_STRING GatewayList;   
  14.     IP_ADDR_STRING DhcpServer;   
  15.     BOOL HaveWins;   
  16.     IP_ADDR_STRING PrimaryWinsServer;   
  17.     IP_ADDR_STRING SecondaryWinsServer;   
  18.     time_t LeaseObtained;   
  19.     time_t LeaseExpires; 
  20. } IP_ADAPTER_INFO,  *PIP_ADAPTER_INFO; 

 

 

GetAdaptersInfo返回关于物理适配器及分配给它的IPv4地址的大量信息,但不返回IPv6的信息,GetAdaptersAddresses函数返回IPv4和IPv6地址信息:

  1. ULONG WINAPI GetAdaptersAddresses( 
  2.   __in          ULONG Family, 
  3.   __in          ULONG Flags, 
  4.   __in          PVOID Reserved, 
  5.   __in_out      PIP_ADAPTER_ADDRESSES AdapterAddresses, 
  6.   __in_out      PULONG SizePointer 
  7. ); 

 

Family参数指明应该被列举的地址族

Flags控制返回地址的类型

最后两个参数是缓冲区及缓冲区长度

 

释放和更新IPv4地址:

  1. DWORD IpReleaseAddress(//释放 
  2.   __in          PIP_ADAPTER_INDEX_MAP AdapterInfo 
  3. ); 
  4. DWORD IpRenewAddress(//更新 
  5.   __in          PIP_ADAPTER_INDEX_MAP AdapterInfo 
  6. ); 

 

  1. typedef struct _IP_ADAPTER_INDEX_MAP {   
  2.     ULONG Index;  //适配器分配的内部网络接口索引 
  3.     WCHAR Name[MAX_ADAPTER_NAME];//适配器名 
  4. }IP_ADAPTER_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP; 

 

调用GetInterfaceInfo可获得某一特定适配器的IP_ADAPTER_INDEX_MAP结构:

  1. DWORD GetInterfaceInfo( 
  2.   __out         PIP_INTERFACE_INFO pIfTable, 
  3.   __in_out      PULONG dwOutBufLen 
  4. ); 

 

pIfTable是一个指针,指向一个IP_INTERFACE_INFO应用程序缓冲区,该缓冲区将接收接口信息

dwOutBufLen是一个指针,指定传到pIfTable中的缓冲区长度,如果大小有错误,则函数返回ERROR_INSUFFICIENT_BUFFER错误,并把dwOutBufLen设为合适的长度

  1. typedef struct _IP_INTERFACE_INFO { 
  2.   LONG NumAdapters; 
  3.   IP_ADAPTER_INDEX_MAP Adapter[1]; 
  4. } IP_INTERFACE_INFO,  *PIP_INTERFACE_INFO; 

 

增加或删除特定适配器的IP地址

AddIpAddress,DeleteIpAddress

  1. DWORD AddIPAddress( 
  2.   __in          IPAddr Address, 
  3.   __in          IPMask IpMask, 
  4.   __in          DWORD IfIndex, 
  5.   __out         PULONG NTEContext, 
  6.   __out         PULONG NTEInstance 
  7. ); 
  1. DWORD DeleteIPAddress( 
  2.   __in          ULONG NTEContext 
  3. );