Декодировать структуру IP_ADAPTER_ADDRESSES, возвращенную в память функцией API-интерфейса Windows GetAdaptersAddresses?

У меня есть скрипт AHK, который мне нужен для получения различной информации о конкретном сетевом интерфейсе. Для этого я делаю DLL-вызов к библиотеке IPHlpAPI для GetAdaptersAddresses функция, которая возвращает 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. Так по какому адресу я могу найти FriendlyName в структуре IP_ADAPTER_ADDRESSES?

Я также разместил на pastebin содержимое памяти, которое получаю:
Структура IP_ADAPTER_ADDRESSES — HEX
Структура IP_ADAPTER_ADDRESSES — ANSI

0

Решение

Первые 8 байтов — это объединение, а не структура. Это означает, что поля Alignment и поля Length / IfIndex хранятся в одном и том же месте в памяти. Первые 4 байта структуры будут длиной, а следующие 4 будут IfIndex.

Есть ли причина, по которой вы не можете использовать структуру, определенную в IPTypes.h? то есть получить имя, используя myAddrPtr->FriendlyName где myAddrPtr является IP_ADAPTER_ADDRESSES *,

2

Другие решения

Может быть, я не совсем понимаю вашу проблему, я просто использую саму структуру, чтобы получить понятное имя — ниже приведен фрагмент кода из не-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);

Будет ли что-то подобное сделать свое дело?

1

По вопросам рекламы [email protected]