Всем привет! Пишу на ассемблере fasm. Функцией WlanGetNetworkBssList() получаю информацию о доступных Wi-Fi сетях в своей зоне. Она возвращает данные в структуру "WLAN_BSS_ENTRY", поля которой вывожу на консоль. Спойлер: Исходник Код (ASM): format pe console entry start include 'win32ax.inc' include 'equates\wlanapi.inc' ;//---------- .data negVer dd 0 wlanHndl dd 0 bssAddr dd 0 nextBss dd 0 itemCount dd 0 divide dd 1000*1000 gHz dq 0 align 16 buff db 0 ;//---------- .code start: invoke SetConsoleTitle,<'*** WlanGetNetworkBssList ***',0> ;//----- Попытка подключиться к службе Wireless invoke WlanOpenHandle,2,0,negVer,wlanHndl or eax,eax jz @f cinvoke printf,<10,' WlanOpen Error! Adapter is not working.',0> jmp @exit ;//----- Запрашиваем GUID своего интерфейса @@: invoke WlanEnumInterfaces,[wlanHndl],0,buff mov eax,dword[buff] add eax,8 ;//<--- указатель на GUID ;//----- Читаем записи BSS доступных сетей invoke WlanGetNetworkBssList,[wlanHndl],eax,0,0,0,0,buff mov esi,dword[buff] mov [bssAddr],esi ;//----- Запоминаем данные структуры "WLAN_BSS_LIST" mov eax,[esi+WLAN_BSS_LIST.dwTotalSize] mov ebx,[esi+WLAN_BSS_LIST.dwNumberOfItems] mov [itemCount],ebx push esi cinvoke printf,<10,' BSS total size : %d bytes',\ 10,' Number of items: %d',10,10,0>,eax,ebx cinvoke printf,<' Ssid Rssi Power ',\ ' Freq Speed Device MAC IeOffs IeSize',10,\ ' ------------------------------------------------------------------------------------------------',0> pop esi lea esi,[esi+WLAN_BSS_LIST.wlanBssEntries] mov [nextBss],esi ;//**** Обход массива структур "WLAN_BSS_ENTRY" всех доступных сетей ***************** @parseBss: mov esi,[nextBss] lea eax,[esi+WLAN_BSS_ENTRY.dot11Ssid+4] mov ebx,[esi+WLAN_BSS_ENTRY.lRssi] mov ecx,[esi+WLAN_BSS_ENTRY.uLinkQuality] mov edx,[esi+WLAN_BSS_ENTRY.ulChCenterFrequency] push 0 edx finit fild qword[esp] ;//<--- частота из кГц в ГГц fidiv [divide] fstp [gHz] add esp,8 push esi esi esi cinvoke printf,<10,' %-15s %d dB %3d %% %0.2f GHz ',0>,eax,ebx,ecx,\ dword[gHz],dword[gHz+4] ;//----- Находим наибольшее значение из "набора скоростей передачи данных Wi-Fi" pop edi mov ecx,[edi+WLAN_BSS_ENTRY.wlanRateSet] ;// реально элементов в наборе (всего макс.126) lea esi,[edi+WLAN_BSS_ENTRY.wlanRateSet+4] ;// линк на начало xor eax,eax mov ebx,eax @findMaxSpeed: lodsw and ax,7FFFh ;// ст.бит определяет базовую скорость - игнорируем cmp ebx,eax ja @fack xchg ebx,eax ;// EBX = макс скорость @fack: loop @findMaxSpeed shr ebx,1 ;//<---- по формуле: Speed = Rate * 0,5 (или /2) cinvoke printf,<'%d Mbit/s ',0>,ebx ;//----- Выводим МАС-адрес устройства (макрос лежит в инклуде wlanapi.inc) pop esi lea eax,[esi+WLAN_BSS_ENTRY.dot11Bssid] GetMac eax ;//----- BLOB со всеми деталями интерфейса "IE" (формат полей см.в спеке 802.11) ;//----- здесь просто показываем его размер + смещение от начала текущей "WLAN_BSS_ENTRY" pop esi cinvoke printf,<' 0x%08X %d byte',0>,\ [esi+WLAN_BSS_ENTRY.ulIeOffset],\ [esi+WLAN_BSS_ENTRY.ulIeSize] ;//----- Переход к структуре "WLAN_BSS_ENTRY" сл.доступной сети.. ;//----- размер этой структуры статичный, и равен 360-байт add [nextBss],360 dec [itemCount] jz @exit jmp @parseBss @exit: invoke WlanFreeMemory,[bssAddr] cinvoke getch cinvoke exit,0 ;//---------- section '.idata' import data readable library msvcrt,'msvcrt.dll',kernel32,'kernel32.dll',wlanapi,'wlanapi.dll' import msvcrt,printf,'printf',getch,'_getch',exit,'exit' import wlanapi,WlanOpenHandle,'WlanOpenHandle',\ WlanEnumInterfaces,'WlanEnumInterfaces',\ WlanGetNetworkBssList,'WlanGetNetworkBssList',\ WlanFreeMemory,'WlanFreeMemory' include 'api\kernel32.inc' В результате получаю такую картину, но хотелось-бы добавить сюда стоку с вендором устройства. Вычислить его можно двумя способами - или залезть в BLOB (адрес имеем в столбце "IeOffs") и проверить элемент №221, или-же скачать базу OUI (размер txt-файла 5МБ), где к МАС-адресам привязывается вендор. Тесты в отладчике показали, что производитель не всегда сбрасывает в BLOB свой паспорт, а потому я решил использовать второй вариант с базой МАС. Но база по ссылке огромная, и включает в себя не только девайсы Wireless, но в основном и Ethernet адаптеры, которые (в данном случае) мне не нужны. Здесь проще создать свою базу в формате fasm'a, прописав в неё пару сотен вендоров. Поэтому просьба, кому не в лом посмотрите, что у вас возвращает исполняемый файл в скрепке, а я по логам ваших МАС-адресов вытащу их из глобальной базы по ссылке. По сути, из 6-байтного значения МАС нужны только первые 3-байта (мл.три это № девайса внутри вендора). Но если можно будет обработать оригин/базу каким-нибудь скриптом (чтобы изменить её формат), было-бы вообще прекрасно! Лично я в скриптах не особо разбираюсь, а потому даже и не пытался. Вот пример, что есть, и во-что его требуется преобразить: Код (Text): ;//---- Имеем в оригин.базе 20-44-3A (hex) Schneider Electric Asia Pacific Ltd 20443A (base 16) Schneider Electric Asia Pacific Ltd 13F East Wing, Warwick House, Taikoo Place Quarry Bay Hong Kong 5C-24-79 (hex) Baltech AG 5C2479 (base 16) Baltech AG Lilienthalstrasse 27 Hallbergmoos 85399 Germany ;//---- Перевести скриптом в такой формат dd 0x20443A db 'Schneider Electric Asia Pacific Ltd - Hong Kong ',0 dd 0x5C2479 db 'Baltech AG - Germany ',0
Какие еще в Жапу скрипты в редакторе не хотите вручную набирать команды короче чем ваш пост. P.S. У меня несколько глючный на больших для него файлах DOS ME-7 так что возможны ошибки.