You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 14:19:52