include <winsock2.h>
include <iphlpapi.h>
include <stdio.h>
include <stdlib.h>
pragma comment(lib, "IPHLPAPI.lib")
define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int __cdecl main()
{
/* Declare and initialize variables */
// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers
// assigned to the adapter.
//
// Note that this sample code only prints out the
// first entry for the IP address/mask, and gateway, and
// the primary and secondary WINS server for each adapter.
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter = NULL;
DWORD dwRetVal = 0;
UINT i;
/* variables used to print DHCP time info */
struct tm newtime;
char buffer[32];
errno_t error;
ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
if (pAdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo
");
return 1;
}
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
FREE(pAdapterInfo);
pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
if (pAdapterInfo == NULL) {
printf("Error allocating memory needed to call GetAdaptersinfo
");
return 1;
}
}
if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
pAdapter = pAdapterInfo;
while (pAdapter) {
printf(" ComboIndex: %d
", pAdapter->ComboIndex);
printf(" Adapter Name: %s
", pAdapter->AdapterName);
printf(" Adapter Desc: %s
", pAdapter->Description);
printf(" Adapter Addr: ");
for (i = 0; i < pAdapter->AddressLength; i++) {
if (i == (pAdapter->AddressLength - 1))
printf("%.2X
", (int) pAdapter->Address[i]);
else
printf("%.2X-", (int) pAdapter->Address[i]);
}
printf(" Index: %d
", pAdapter->Index);
printf(" Type: ");
switch (pAdapter->Type) {
case MIB_IF_TYPE_OTHER:
printf("Other
");
break;
case MIB_IF_TYPE_ETHERNET:
printf("Ethernet
");
break;
case MIB_IF_TYPE_TOKENRING:
printf("Token Ring
");
break;
case MIB_IF_TYPE_FDDI:
printf("FDDI
");
break;
case MIB_IF_TYPE_PPP:
printf("PPP
");
break;
case MIB_IF_TYPE_LOOPBACK:
printf("Lookback
");
break;
case MIB_IF_TYPE_SLIP:
printf("Slip
");
break;
default:
printf("Unknown type %ld
", pAdapter->Type);
break;
}
printf(" IP Address: %s
",
pAdapter->IpAddressList.IpAddress.String);
printf(" IP Mask: %s
", pAdapter->IpAddressList.IpMask.String);
printf(" Gateway: %s
", pAdapter->GatewayList.IpAddress.String);
printf(" ***
");
if (pAdapter->DhcpEnabled) {
printf(" DHCP Enabled: Yes
");
printf(" DHCP Server: %s
",
pAdapter->DhcpServer.IpAddress.String);
printf(" Lease Obtained: ");
/* Display local time */
error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseObtained);
if (error)
printf("Invalid Argument to _localtime32_s
");
else {
// Convert to an ASCII representation
error = asctime_s(buffer, 32, &newtime);
if (error)
printf("Invalid Argument to asctime_s
");
else
/* asctime_s returns the string terminated by
*/
printf("%s", buffer);
}
printf(" Lease Expires: ");
error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseExpires);
if (error)
printf("Invalid Argument to _localtime32_s
");
else {
// Convert to an ASCII representation
error = asctime_s(buffer, 32, &newtime);
if (error)
printf("Invalid Argument to asctime_s
");
else
/* asctime_s returns the string terminated by
*/
printf("%s", buffer);
}
} else
printf(" DHCP Enabled: No
");
if (pAdapter->HaveWins) {
printf(" Have Wins: Yes
");
printf(" Primary Wins Server: %s
",
pAdapter->PrimaryWinsServer.IpAddress.String);
printf(" Secondary Wins Server: %s
",
pAdapter->SecondaryWinsServer.IpAddress.String);
} else
printf(" Have Wins: No
");
pAdapter = pAdapter->Next;
printf("
");
}
} else {
printf("GetAdaptersInfo failed with error: %d
", dwRetVal);
}
if (pAdapterInfo)
FREE(pAdapterInfo);
return 0;
}