Fonction GetIfTable (iphlpapi.h)
La fonction GetIfTable récupère la table d’interface MIB-II.
Syntaxe
IPHLPAPI_DLL_LINKAGE DWORD GetIfTable(
[out] PMIB_IFTABLE pIfTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
Paramètres
[out] pIfTable
Pointeur vers une mémoire tampon qui reçoit la table d’interface en tant que structure MIB_IFTABLE .
[in, out] pdwSize
Lors de l’entrée, spécifie la taille en octets de la mémoire tampon pointée vers le paramètre pIfTable .
En sortie, si la mémoire tampon n’est pas assez grande pour contenir la table d’interface retournée, la fonction définit ce paramètre comme étant la taille de mémoire tampon requise en octets.
[in] bOrder
Valeur booléenne qui spécifie si la table d’interface retournée doit être triée dans l’ordre croissant par index d’interface. Si ce paramètre a la valeur TRUE, la table est triée.
Valeur retournée
Si la fonction réussit, la valeur de retour est NO_ERROR.
Si la fonction échoue, la valeur de retour est l’un des codes d’erreur suivants.
Code de retour | Description |
---|---|
|
La mémoire tampon pointée vers le paramètre pIfTable n’est pas assez grande. La taille requise est retournée dans la variable DWORD pointée vers le paramètre pdwSize . |
|
Le paramètre pdwSize a la valeur NULL ou GetIfTable ne peut pas écrire dans la mémoire pointée par le paramètre pdwSize . |
|
Cette fonction n’est pas prise en charge sur le système d’exploitation utilisé sur le système local. |
|
Utilisez la fonction FormatMessage pour obtenir la chaîne de message pour l’erreur retournée. |
Notes
The
La fonction GetIfTable énumère les interfaces physiques sur un système local et retourne ces informations dans une structure MIB_IFTABLE . Les interfaces physiques incluent l’interface de bouclage logiciel.
Les fonctions GetIfTable2 et GetIfTable2Ex disponibles sur Windows Vista et versions ultérieures sont une version améliorée de la fonction GetIfTable qui énumère à la fois les interfaces physiques et logiques sur un système local. Les interfaces logiques incluent différentes interfaces WAN Miniport utilisées pour L2TP, PPTP, PPOE et d’autres encapsulations de tunnel.
Les interfaces sont retournées dans une structure MIB_IFTABLE dans la mémoire tampon vers laquelle pointe le paramètre pIfTable . La structure MIB_IFTABLE contient un nombre d’interfaces et un tableau de structures MIB_IFROW pour chaque interface.
Notez que la structure de MIB_IFTABLE retournée pointée vers le paramètre pIfTable peut contenir un remplissage pour l’alignement entre le membre dwNumEntries et la première entrée de tableau MIB_IFROW dans le membre de table de la structure MIB_IFTABLE . Le remplissage pour l’alignement peut également être présent entre les entrées de tableau MIB_IFROW . Tout accès à une entrée de tableau MIB_IFROW doit supposer que le remplissage peut exister.
Exemples
L’exemple suivant récupère la table d’interface et imprime le nombre d’entrées dans la table et certaines données sur chaque entrée.
#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;
}
Spécifications
Client minimal pris en charge | Windows 2000 Professionnel [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows 2000 Server [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | iphlpapi.h |
Bibliothèque | Iphlpapi.lib |
DLL | Iphlpapi.dll |