请教各位,我要获取无线网络列表,采用OID_802_11_BSSID_LIST,返回值中只有第一个SSID是正确的,其他的都是乱码,请教各位高人,我用的是winDDK2003,代码如下:
typedef struct _AP_DATA
{
MAC_ADDR mac_addr;  // access point mac        
SIG_STRENGTH Rssi;  // 接收信号强度 (RSSI), in dBm
UCHAR Ssid[32]; // AP ssid
ULONG  Privacy;     // Specifies a WEP/WPA/WPA2 encryption requirement. 
NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; 
NDIS_802_11_NETWORK_TYPE  NetworkTypeInUse;
UCHAR Rate[8];
} AP_DATA;
HRESULT CWrapix::GetAPList(AP_DATA **ppAP_data, long *plItems)
{
UCHAR QueryBuffer[1024];
PNDISPROT_QUERY_OID pQueryOid;
PNDISPROT_SET_OID pSetOid;
//PNDIS_802_11_BSSID_LIST pBssid_List;
PNDIS_802_11_BSSID_LIST_EX  pBssid_List;
ULONG i = 0;
int j = 0;
CString strSSID;
ULONG len = 0; if (!ppAP_data)
{
m_hRes = E_POINTER;
} else
{
// 1. scan APs in range of stand(client)
pSetOid = (PNDISPROT_SET_OID) &QueryBuffer[0];
pSetOid->Oid = OID_802_11_BSSID_LIST_SCAN;
if (!DeviceIoControl(m_hFileHandle,
IOCTL_NDISPROT_SET_OID_VALUE,
(LPVOID) &QueryBuffer[0],
sizeof(QueryBuffer),
(LPVOID) &QueryBuffer[0],
0,
&m_dwBytesReturned,
NULL))
{
m_dwError = GetLastError();
DbgPrint("IOCTL SET BSSID_LIST_SCAN failed: %d\n", m_dwError);
}

// 2. get BSSID list to scan
pQueryOid = (PNDISPROT_QUERY_OID) &QueryBuffer[0];
pQueryOid->Oid = OID_802_11_BSSID_LIST;

if (DeviceIoControl(m_hFileHandle,
IOCTL_NDISPROT_QUERY_OID_VALUE,
(LPVOID) &QueryBuffer[0],
sizeof(QueryBuffer),
(LPVOID) &QueryBuffer[0],
sizeof(QueryBuffer),
&m_dwBytesReturned,
NULL))
{
DbgPrint("IOCTL BSSID_LIST succeeded\n"); pBssid_List = (PNDIS_802_11_BSSID_LIST_EX)pQueryOid->Data;
*plItems = pBssid_List->NumberOfItems;
// If there are no BSSIDs detected, NumberOfItems is zero
if ( NULL == m_pAPList )
m_pAPList = (AP_DATA *) calloc(pBssid_List->NumberOfItems, sizeof(AP_DATA));
else
memset(m_pAPList, 0, sizeof(AP_DATA));
// NumberOfItems为0时表明未发现可用bss.
for ( i = 0; i < pBssid_List->NumberOfItems; i++ )
{
strSSID = (pBssid_List->Bssid[i].Ssid).Ssid;
DbgPrint("Find AP %d, SSid:%s\n", i, strSSID);
m_pAPList[i].Privacy=(pBssid_List->Bssid[i]).Privacy;
m_pAPList[i].InfrastructureMode  = (pBssid_List->Bssid[i]).InfrastructureMode;
//m_pAPList[i].NetworkTypeInUse    = (pBssid_List->Bssid[i]).NetworkTypeInUse;
// NDIS_STATUS_ADAPTER_NOT_READY
m_pAPList[i].Rssi                = (pBssid_List->Bssid[i]).Rssi;

}
}
else
{
m_dwError = GetLastError();
DbgPrint("IOCTL BSSID_LIST failed: %d\n", m_dwError);
}
}
*ppAP_data = m_pAPList;
return m_hRes;
}

解决方案 »

  1.   

    for(int i =0 ;i < pBssid_List-> NumberOfItems;i++)
    {
        
        PNDIS_WLAN_BSSID cpSsid=pBssid_List->Bssid;
        int temp=i;
        while(temp!=0 )
        {
            cpSsid=(PNDIS_WLAN_BSSID)((char*)cpSsid+ cpSsid->Length);
    temp--;
        }
        获得SSID等参数
    }你改成这样试试       
      

  2.   

    for(int   i   =0   ;i   <   pBssid_List->   NumberOfItems;i++) 

            
        PNDIS_WLAN_BSSID   cpSsid=pBssid_List-> Bssid; 
        int   temp=i; 
        while(temp!=0   ) 
        { 
            cpSsid=(PNDIS_WLAN_BSSID)((char*)cpSsid+   cpSsid-> Length); 
            temp--; 
        } 
        strSSID[i]= cpSsid->Ssid;
        m_pAPList[i].Privacy=cpSsid->Privacy;
        m_pAPList[i].InfrastructureMode=cpSsid->InfrastructureMode;
        m_pAPList[i].Rssi  =cpSsid->Rssi;} 
      

  3.   

    谢谢bluepuzzle,这个问题我后来已经解决了,思路跟你的一样,PNDIS_WLAN_BSSID结构每次都要算内存地址偏移量,要用指针去取结构内容。
      

  4.   

    内存偏移之后可以取出ssid的值,不过为什么取不到Macaddress的值呢