请教各位,我要获取无线网络列表,采用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;
}
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;
}
{
PNDIS_WLAN_BSSID cpSsid=pBssid_List->Bssid;
int temp=i;
while(temp!=0 )
{
cpSsid=(PNDIS_WLAN_BSSID)((char*)cpSsid+ cpSsid->Length);
temp--;
}
获得SSID等参数
}你改成这样试试
{
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;}