поиск device-имени сетевого адаптера

Тема в разделе "WASM.NT.KERNEL", создана пользователем hlt, 5 фев 2008.

  1. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Народ, подскажите плиз, как найти имя сетевого адаптера, через девайс которого можно слать Ethernet-кадры в _интернет_. (типа \Device\{<guid_или_что_там>}) Надеюсь правильно выразился :)... Вобщем, надо алгоритм поиска имени адаптера, которое надо скормить NdisOpenAdapter - для отправки данных в мир.
    Я так понимаю можно пошариться в HKLM\System\CurrentControlSet\Services\Tcpip\Parameters (или Linkage)\... - Но что из тех адаптеров надо брать? как выбрать?...
     
  2. kyprizel

    kyprizel New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    232
    Адрес:
    TSK
    вот тут кусочек из MacShift(не мой), может пригодится:

    Код (Text):
    1. void SetMAC(char * AdapterName, char * NewMAC) {
    2.   HKEY hListKey = NULL;
    3.   HKEY hKey = NULL;
    4.   RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}",
    5.     0, KEY_READ, &hListKey);
    6.   if (!hListKey) {
    7.     printf("Failed to open adapter list key\n");
    8.     return;
    9.     }
    10.   FILETIME writtenTime;
    11.   char keyNameBuf[512], keyNameBuf2[512];
    12.   DWORD keyNameBufSiz = 512;
    13.   DWORD crap;
    14.   int i = 0;
    15.   bool found = false;
    16.   while (RegEnumKeyEx(hListKey, i++, keyNameBuf, &keyNameBufSiz, 0, NULL, NULL, &writtenTime)
    17.         == ERROR_SUCCESS) {
    18.     _snprintf(keyNameBuf2, 512, "%s\\Connection", keyNameBuf);
    19.     hKey = NULL;
    20.     RegOpenKeyEx(hListKey, keyNameBuf2, 0, KEY_READ, &hKey);
    21.     if (hKey) {
    22.       keyNameBufSiz = 512;
    23.       if (RegQueryValueEx(hKey, "Name", 0, &crap, (LPBYTE)keyNameBuf2, &keyNameBufSiz)
    24.         == ERROR_SUCCESS && strcmp(keyNameBuf2, AdapterName) == 0) {
    25.         printf("Adapter ID is %s\n", keyNameBuf);
    26.         found = true;
    27.         break;
    28.         }
    29.       RegCloseKey(hKey);
    30.       }
    31.     keyNameBufSiz = 512;
    32.     }
    33.   RegCloseKey(hListKey);
    34.   if (!found) {
    35.     printf("Could not find adapter name '%s'.\nPlease make sure this is the name you gave it in Network Connections.\n", AdapterName);
    36.     return;
    37.     }
    38.   RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}",
    39.     0, KEY_READ, &hListKey);
    40.   if (!hListKey) {
    41.     printf("Failed to open adapter list key in Phase 2\n");
    42.     return;
    43.     }
    44.   i = 0;
    45.   char buf[512];
    46.   while (RegEnumKeyEx(hListKey, i++, keyNameBuf2, &keyNameBufSiz, 0, NULL, NULL, &writtenTime)
    47.         == ERROR_SUCCESS) {
    48.     hKey = NULL;
    49.     RegOpenKeyEx(hListKey, keyNameBuf2, 0, KEY_READ | KEY_SET_VALUE, &hKey);
    50.     if (hKey) {
    51.       keyNameBufSiz = 512;
    52.       if ((RegQueryValueEx(hKey, "NetCfgInstanceId", 0, &crap, (LPBYTE)buf, &keyNameBufSiz)
    53.         == ERROR_SUCCESS) && (strcmp(buf, keyNameBuf) == 0)) {
    54.         RegSetValueEx(hKey, "NetworkAddress", 0, REG_SZ, (LPBYTE)NewMAC, strlen(NewMAC) + 1);
    55.         //printf("Updating adapter index %s (%s=%s)\n", keyNameBuf2, buf, keyNameBuf);
    56.         //break;
    57.         }
    58.       RegCloseKey(hKey);
    59.       }
    60.     keyNameBufSiz = 512;
    61.     }
    62.   RegCloseKey(hListKey);
    63.  
    64.   }
     
  3. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    kyprizel
    Спасибо, уже именно так и реализовал :)
    в разделе SYSTEM\\CurrentControlSet\\Control\\Network\\ содержаться сведения о всех сетевых интерфейсах установленых в системе
    Посмотри так же топик http://www.wasm.ru/forum/viewtopic.php?id=14880
     
  4. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    Т.е. я так понимаю, - ищется только первый попавшийся адаптер?... А если две сетевухи?... как узнать, которая дает траффик в мир? Кстати... а если подключение с миром через ВПН?
     
  5. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    hlt
    есть апишка GetBestInterface из Iphlpapi
    потом перебираешь интерфейсы с помощью той же Iphlpapi и по индексу этому находишь имя адаптера
    передаешь его в драйвер

    тока вот не помню что точно
    но у меня не получалось открывать адаптер с моим PPOE коннектом
     
  6. hlt

    hlt Member

    Публикаций:
    0
    Регистрация:
    21 дек 2007
    Сообщения:
    56
    спасибо! :)
     
  7. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    hlt
    Сорри за дизинформацию......
    Ветка в реестре
    "\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"
    Сколько там подразделов - столько и сетевых подключений, интерфейсов(я НЕ имею ввиду количество сетевых карт) в системе. в ключике "ServiceName" находится нужный тебе \Device\{<guid_или_что_там>}