Народ, подскажите плиз, как найти имя сетевого адаптера, через девайс которого можно слать Ethernet-кадры в _интернет_. (типа \Device\{<guid_или_что_там>}) Надеюсь правильно выразился ... Вобщем, надо алгоритм поиска имени адаптера, которое надо скормить NdisOpenAdapter - для отправки данных в мир. Я так понимаю можно пошариться в HKLM\System\CurrentControlSet\Services\Tcpip\Parameters (или Linkage)\... - Но что из тех адаптеров надо брать? как выбрать?...
вот тут кусочек из MacShift(не мой), может пригодится: Код (Text): void SetMAC(char * AdapterName, char * NewMAC) { HKEY hListKey = NULL; HKEY hKey = NULL; RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}", 0, KEY_READ, &hListKey); if (!hListKey) { printf("Failed to open adapter list key\n"); return; } FILETIME writtenTime; char keyNameBuf[512], keyNameBuf2[512]; DWORD keyNameBufSiz = 512; DWORD crap; int i = 0; bool found = false; while (RegEnumKeyEx(hListKey, i++, keyNameBuf, &keyNameBufSiz, 0, NULL, NULL, &writtenTime) == ERROR_SUCCESS) { _snprintf(keyNameBuf2, 512, "%s\\Connection", keyNameBuf); hKey = NULL; RegOpenKeyEx(hListKey, keyNameBuf2, 0, KEY_READ, &hKey); if (hKey) { keyNameBufSiz = 512; if (RegQueryValueEx(hKey, "Name", 0, &crap, (LPBYTE)keyNameBuf2, &keyNameBufSiz) == ERROR_SUCCESS && strcmp(keyNameBuf2, AdapterName) == 0) { printf("Adapter ID is %s\n", keyNameBuf); found = true; break; } RegCloseKey(hKey); } keyNameBufSiz = 512; } RegCloseKey(hListKey); if (!found) { printf("Could not find adapter name '%s'.\nPlease make sure this is the name you gave it in Network Connections.\n", AdapterName); return; } RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}", 0, KEY_READ, &hListKey); if (!hListKey) { printf("Failed to open adapter list key in Phase 2\n"); return; } i = 0; char buf[512]; while (RegEnumKeyEx(hListKey, i++, keyNameBuf2, &keyNameBufSiz, 0, NULL, NULL, &writtenTime) == ERROR_SUCCESS) { hKey = NULL; RegOpenKeyEx(hListKey, keyNameBuf2, 0, KEY_READ | KEY_SET_VALUE, &hKey); if (hKey) { keyNameBufSiz = 512; if ((RegQueryValueEx(hKey, "NetCfgInstanceId", 0, &crap, (LPBYTE)buf, &keyNameBufSiz) == ERROR_SUCCESS) && (strcmp(buf, keyNameBuf) == 0)) { RegSetValueEx(hKey, "NetworkAddress", 0, REG_SZ, (LPBYTE)NewMAC, strlen(NewMAC) + 1); //printf("Updating adapter index %s (%s=%s)\n", keyNameBuf2, buf, keyNameBuf); //break; } RegCloseKey(hKey); } keyNameBufSiz = 512; } RegCloseKey(hListKey); }
kyprizel Спасибо, уже именно так и реализовал в разделе SYSTEM\\CurrentControlSet\\Control\\Network\\ содержаться сведения о всех сетевых интерфейсах установленых в системе Посмотри так же топик http://www.wasm.ru/forum/viewtopic.php?id=14880
Т.е. я так понимаю, - ищется только первый попавшийся адаптер?... А если две сетевухи?... как узнать, которая дает траффик в мир? Кстати... а если подключение с миром через ВПН?
hlt есть апишка GetBestInterface из Iphlpapi потом перебираешь интерфейсы с помощью той же Iphlpapi и по индексу этому находишь имя адаптера передаешь его в драйвер тока вот не помню что точно но у меня не получалось открывать адаптер с моим PPOE коннектом
hlt Сорри за дизинформацию...... Ветка в реестре "\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards" Сколько там подразделов - столько и сетевых подключений, интерфейсов(я НЕ имею ввиду количество сетевых карт) в системе. в ключике "ServiceName" находится нужный тебе \Device\{<guid_или_что_там>}