GetIfTable 関数 (iphlpapi.h)
GetIfTable 関数は、MIB-II インターフェイス テーブルを取得します。
構文
IPHLPAPI_DLL_LINKAGE DWORD GetIfTable(
[out] PMIB_IFTABLE pIfTable,
[in, out] PULONG pdwSize,
[in] BOOL bOrder
);
パラメーター
[out] pIfTable
インターフェイス テーブルを MIB_IFTABLE 構造体として受け取るバッファーへのポインター。
[in, out] pdwSize
入力時に、 pIfTable パラメーターによって指されるバッファーのサイズをバイト単位で指定します。
出力時に、バッファーが返されるインターフェイス テーブルを保持するのに十分な大きさでない場合、関数は、このパラメーターを必要なバッファー サイズ (バイト単位) に設定します。
[in] bOrder
返されるインターフェイス テーブルをインターフェイス インデックスで昇順に並べ替えるかどうかを指定するブール値。 このパラメーターが TRUE の場合、テーブルは並べ替えられます。
戻り値
関数が成功した場合、戻り値はNO_ERROR。
関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。
リターン コード | 説明 |
---|---|
|
pIfTable パラメーターが指すバッファーの大きさが不十分です。 必要なサイズは、pdwSize パラメーターが指す DWORD 変数で返されます。 |
|
pdwSize パラメーターが NULL であるか、または GetIfTable が pdwSize パラメーターによって指すメモリに書き込むことができません。 |
|
この関数は、ローカル システムで使用されているオペレーティング システムではサポートされていません。 |
|
FormatMessage 関数を使用して、返されたエラーのメッセージ文字列を取得します。 |
解説
次に、
GetIfTable 関数は、ローカル システム上の物理インターフェイスを列挙し、この情報を MIB_IFTABLE 構造体で返します。 物理インターフェイスには、ソフトウェア ループバック インターフェイスが含まれます。
Windows Vista 以降で使用できる GetIfTable2 および GetIfTable2Ex 関数は、ローカル システム上の物理インターフェイスと論理インターフェイスの両方を列挙する GetIfTable 関数の拡張バージョンです。 論理インターフェイスには、L2TP、PPTP、PPOE、およびその他のトンネル カプセル化に使用されるさまざまな WAN ミニポート インターフェイスが含まれます。
インターフェイスは、pIfTable パラメーターによって指されるバッファー内のMIB_IFTABLE構造体で返されます。 MIB_IFTABLE構造体には、インターフェイス数と、各インターフェイスのMIB_IFROW構造体の配列が含まれています。
pIfTable パラメーターによって参照される返されるMIB_IFTABLE構造体には、dwNumEntries メンバーと、MIB_IFTABLE 構造体のテーブル メンバー内の最初のMIB_IFROW配列エントリとの間の配置のためのパディングが含まれていることに注意してください。 配置のためのパディングは、 MIB_IFROW 配列エントリ間に存在する場合もあります。 MIB_IFROW配列エントリへのアクセスは、パディングが存在する可能性があることを前提とする必要があります。
例
次の例では、インターフェイス テーブルを取得し、テーブル内のエントリの数と各エントリのデータを出力します。
#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;
}
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | iphlpapi.h |
Library | Iphlpapi.lib |
[DLL] | Iphlpapi.dll |