如何在Windows Native Wifi中获取Wi-Fi信息元素(IE)
问题分析与解决方案
核心错误原因
你代码中对WLAN_BSS_ENTRY做了值拷贝:const WLAN_BSS_ENTRY bssEntry = pBssList->wlanBssEntries[i];,把原始结构体复制到了栈上的局部变量。但ulIeOffset是相对于pBssList中原始结构体的内存偏移量,不是栈上拷贝变量的偏移。用局部变量的地址加偏移量计算IE缓冲区位置,必然指向非法内存区域,触发读取异常。
修正后的代码
// retrieve scanned networks dwResult = WlanGetNetworkBssList(hClient, &pIfList->InterfaceInfo[0].InterfaceGuid, NULL, dot11_BSS_type_any, false, NULL, &pBssList); if (dwResult == ERROR_SUCCESS) { for (DWORD i = 0; i < pBssList->dwNumberOfItems; i++) { // 直接引用原始结构体,不做值拷贝 const WLAN_BSS_ENTRY& bssEntry = pBssList->wlanBssEntries[i]; std::cout << "SSID: " << bssEntry.dot11Ssid.ucSSID << std::endl; std::cout << "RSSI: " << bssEntry.lRssi << " dBm" << std::endl; // print bunch of other bssEntry fields, all valid std::cout << "IE buffer offset: " << bssEntry.ulIeOffset << std::endl; std::cout << "IE buffer size: " << bssEntry.ulIeSize << std::endl; // 基于原始结构体地址计算IE缓冲区位置 const PBYTE ieBuffer = (const PBYTE)((PBYTE)(&bssEntry) + bssEntry.ulIeOffset); for (DWORD j = 0; j < bssEntry.ulIeSize; j++) { printf("%02X ", ieBuffer[j]); } std::cout << std::endl; std::cout << std::endl; } WlanFreeMemory(pBssList); }
补充说明
WLAN_BSS_ENTRY的ulIeOffset字段定义的是:从该结构体自身起始地址,到IE数据区域的字节偏移。IE数据紧跟在原始结构体之后,属于pBssList分配的内存块的一部分。- 若仍出现异常,需确认:程序已获取足够权限调用WLAN API,网卡驱动支持BSS列表与IE数据的读取(部分旧驱动存在兼容性问题)。
内容的提问来源于stack exchange,提问作者ptorab
相关产品推荐
相关产品推荐

