Función GetIfTable (iphlpapi.h)
La función GetIfTable recupera la tabla de interfaz MIB-II.
Sintaxis
IPHLPAPI_DLL_LINKAGE DWORD GetIfTable(
[out] PMIB_IFTABLE pIfTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
Parámetros
[out] pIfTable
Puntero a un búfer que recibe la tabla de interfaz como una estructura MIB_IFTABLE .
[in, out] pdwSize
En la entrada, especifica el tamaño en bytes del búfer al que apunta el parámetro pIfTable .
En la salida, si el búfer no es lo suficientemente grande como para contener la tabla de interfaz devuelta, la función establece este parámetro igual al tamaño de búfer necesario en bytes.
[in] bOrder
Valor booleano que especifica si la tabla de interfaz devuelta debe ordenarse en orden ascendente por índice de interfaz. Si este parámetro es TRUE, la tabla se ordena.
Valor devuelto
Si la función se realiza correctamente, el valor devuelto es NO_ERROR.
Si se produce un error en la función, el valor devuelto es uno de los siguientes códigos de error.
Código devuelto | Descripción |
---|---|
|
El búfer al que apunta el parámetro pIfTable no es lo suficientemente grande. El tamaño necesario se devuelve en la variable DWORD a la que apunta el parámetro pdwSize . |
|
El parámetro pdwSize es NULL o GetIfTable no puede escribir en la memoria a la que apunta el parámetro pdwSize . |
|
Esta función no se admite en el sistema operativo en uso en el sistema local. |
|
Use la función FormatMessage para obtener la cadena de mensaje del error devuelto. |
Comentarios
The
La función GetIfTable enumera interfaces físicas en un sistema local y devuelve esta información en una estructura de MIB_IFTABLE . Las interfaces físicas incluyen la interfaz de bucle invertido de software.
Las funciones GetIfTable2 y GetIfTable2Ex disponibles en Windows Vista y versiones posteriores son una versión mejorada de la función GetIfTable que enumera las interfaces físicas y lógicas en un sistema local. Entre las interfaces lógicas se incluyen varias interfaces WAN Miniport usadas para las encapsulaciones de túnel L2TP, PPTP, PPOE y otras.
Las interfaces se devuelven en una estructura de MIB_IFTABLE en el búfer al que apunta el parámetro pIfTable . La estructura MIB_IFTABLE contiene un recuento de interfaces y una matriz de estructuras de MIB_IFROW para cada interfaz.
Tenga en cuenta que la estructura de MIB_IFTABLE devuelta a la que apunta el parámetro pIfTable puede contener relleno para la alineación entre el miembro dwNumEntries y la primera entrada de matriz MIB_IFROW en el miembro de tabla de la estructura MIB_IFTABLE . El relleno para la alineación también puede estar presente entre las entradas de matriz de MIB_IFROW . Cualquier acceso a una entrada de matriz MIB_IFROW debe suponer que puede existir relleno.
Ejemplos
En el ejemplo siguiente se recupera la tabla de interfaz y se imprime el número de entradas de la tabla y algunos datos de cada entrada.
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "IPHLPAPI.lib")
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int main()
{
// Declare and initialize variables.
DWORD dwSize = 0;
DWORD dwRetVal = 0;
unsigned int i, j;
/* variables used for GetIfTable and GetIfEntry */
MIB_IFTABLE *pIfTable;
MIB_IFROW *pIfRow;
// Allocate memory for our pointers.
pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
if (pIfTable == NULL) {
printf("Error allocating memory needed to call GetIfTable\n");
return 1;
}
// Make an initial call to GetIfTable to get the
// necessary size into dwSize
dwSize = sizeof (MIB_IFTABLE);
if (GetIfTable(pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) {
FREE(pIfTable);
pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
if (pIfTable == NULL) {
printf("Error allocating memory needed to call GetIfTable\n");
return 1;
}
}
// Make a second call to GetIfTable to get the actual
// data we want.
if ((dwRetVal = GetIfTable(pIfTable, &dwSize, FALSE)) == NO_ERROR) {
printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries);
for (i = 0; i < pIfTable->dwNumEntries; i++) {
pIfRow = (MIB_IFROW *) & pIfTable->table[i];
printf("\tIndex[%d]:\t %ld\n", i, pIfRow->dwIndex);
printf("\tInterfaceName[%d]:\t %ws", i, pIfRow->wszName);
printf("\n");
printf("\tDescription[%d]:\t ", i);
for (j = 0; j < pIfRow->dwDescrLen; j++)
printf("%c", pIfRow->bDescr[j]);
printf("\n");
printf("\tType[%d]:\t ", i);
switch (pIfRow->dwType) {
case IF_TYPE_OTHER:
printf("Other\n");
break;
case IF_TYPE_ETHERNET_CSMACD:
printf("Ethernet\n");
break;
case IF_TYPE_ISO88025_TOKENRING:
printf("Token Ring\n");
break;
case IF_TYPE_PPP:
printf("PPP\n");
break;
case IF_TYPE_SOFTWARE_LOOPBACK:
printf("Software Lookback\n");
break;
case IF_TYPE_ATM:
printf("ATM\n");
break;
case IF_TYPE_IEEE80211:
printf("IEEE 802.11 Wireless\n");
break;
case IF_TYPE_TUNNEL:
printf("Tunnel type encapsulation\n");
break;
case IF_TYPE_IEEE1394:
printf("IEEE 1394 Firewire\n");
break;
default:
printf("Unknown type %ld\n", pIfRow->dwType);
break;
}
printf("\tMtu[%d]:\t\t %ld\n", i, pIfRow->dwMtu);
printf("\tSpeed[%d]:\t %ld\n", i, pIfRow->dwSpeed);
printf("\tPhysical Addr:\t ");
if (pIfRow->dwPhysAddrLen == 0)
printf("\n");
for (j = 0; j < pIfRow->dwPhysAddrLen; j++) {
if (j == (pIfRow->dwPhysAddrLen - 1))
printf("%.2X\n", (int) pIfRow->bPhysAddr[j]);
else
printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
}
printf("\tAdmin Status[%d]:\t %ld\n", i, pIfRow->dwAdminStatus);
printf("\tOper Status[%d]:\t ", i);
switch (pIfRow->dwOperStatus) {
case IF_OPER_STATUS_NON_OPERATIONAL:
printf("Non Operational\n");
break;
case IF_OPER_STATUS_UNREACHABLE:
printf("Unreachable\n");
break;
case IF_OPER_STATUS_DISCONNECTED:
printf("Disconnected\n");
break;
case IF_OPER_STATUS_CONNECTING:
printf("Connecting\n");
break;
case IF_OPER_STATUS_CONNECTED:
printf("Connected\n");
break;
case IF_OPER_STATUS_OPERATIONAL:
printf("Operational\n");
break;
default:
printf("Unknown status %ld\n", pIfRow->dwAdminStatus);
break;
}
printf("\n");
}
} else {
printf("GetIfTable failed with error: \n", dwRetVal);
if (pIfTable != NULL) {
FREE(pIfTable);
pIfTable = NULL;
}
return 1;
// Here you can use FormatMessage to find out why
// it failed.
}
if (pIfTable != NULL) {
FREE(pIfTable);
pIfTable = NULL;
}
return 0;
}
Requisitos
Cliente mínimo compatible | Windows 2000 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows 2000 Server [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | iphlpapi.h |
Library | Iphlpapi.lib |
Archivo DLL | Iphlpapi.dll |