У меня есть скрипт 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
Первые 8 байтов — это объединение, а не структура. Это означает, что поля Alignment и поля Length / IfIndex хранятся в одном и том же месте в памяти. Первые 4 байта структуры будут длиной, а следующие 4 будут IfIndex.
Есть ли причина, по которой вы не можете использовать структуру, определенную в IPTypes.h? то есть получить имя, используя myAddrPtr->FriendlyName
где myAddrPtr
является IP_ADAPTER_ADDRESSES *
,
Может быть, я не совсем понимаю вашу проблему, я просто использую саму структуру, чтобы получить понятное имя — ниже приведен фрагмент кода из не-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);
Будет ли что-то подобное сделать свое дело?