0

特定のネットワークインターフェイスに関するさまざまな情報を取得するために必要なAHKスクリプトがあります。これを行うには、GetAdaptersAddresses関数のIPHlpAPIライブラリへのdll呼び出しを実行します。これにより、指定したアドレスにIP_ADAPTER_ADDRESSES構造体が返されます。次に、そのアドレスでメモリの読み取りを開始し、構造体の各メンバーをデコードします。

たとえば、IP_ADAPTER_INFO構造体の場合、最初の4バイトを読み取ると、次の構造体が開始するアドレスを取得します。次に、次の4バイトを読み取ると、ComboIndex値が取得されます。次に、次の260バイトを読み取り、それをANSI文字列として変換すると、アダプターの名前が取得されます。等々。これはこれまでのところうまくいきました。

ただし、IP_ADAPTER_ADDRESSES構造の場合は、機能していないようです。私はこれを試しました:最初の8バイトをスキップして配置し、次の4バイトをスキップして構造の長さを指定し、次にアダプターのインデックスであるはずの次の4バイトを読み取りました。ただし、この数はランダムに大きい数であり、どのアダプターにも対応していません。メモリの各バイトをANSI文字として変換する場合を除いて、残りのデータも同様です。AdapterName、Description、FriendlyNameが表示されます。

実際に必要なのはFriendlyNameだけです。これは、IP_ADAPTER_INFO構造体からの残りの情報がすでにあるためです。では、IP_ADAPTER_ADDRESSES構造でFriendlyNameを見つけることができるアドレスはどこですか?

私はまた、私が得たメモリコンテンツをペーストビンに投稿しました:
IP_ADAPTER_ADDRESSES構造-HEXIP_ADAPTER_ADDRESSES構造
-ANSI

4

2 に答える 2

2

最初の8バイトはユニオンであり、構造体ではありません。これは、AlignmentフィールドとLength/IfIndexフィールドがメモリ内の同じ場所に格納されることを意味します。構造体の最初の4バイトが長さになり、次の4バイトがIfIndexになります。

IPTypes.hで定義された構造を使用できない理由はありますか?つまり、whereisを使用して名前を取得myAddrPtr->FriendlyNamemyAddrPtrますIP_ADAPTER_ADDRESSES *

于 2013-03-26T16:25:06.100 に答える
1

たぶん私はあなたの問題を完全には理解していません、私は単に構造自体を使ってわかりやすい名前を取得します-以下は非Unicodeプログラムからの省略されたコードスニペットです:

PIP_ADAPTER_ADDRESSES pCurrAddresses;
ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
GetAdaptersAddresses(family, flags, NULL, NULL, &outBufLen);
pCurrAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen);
dwRetVal = GetAdaptersAddresses(family, flags, NULL, pCurrAddresses, &outBufLen);
if (dwRetVal == NO_ERROR)
{    while (pCurrAddresses != NULL)
    {   printf("Description: %wS\n", pCurrAddresses->Description);
        printf("Friendly Name: %wS\n", pCurrAddresses->FriendlyName);
        pCurrAddresses = pCurrAddresses->Next;
    }
}
FREE(pAddresses);

このようなものでうまくいくでしょうか?

于 2013-03-26T16:52:21.573 に答える