// mWLANAPI.cpp : 实现文件
//
#include "stdafx.h"
#include "WLANAPI.h"
#include "mWLANAPI.h"
#include <windows.h>
#include <wlanapi.h>
// mWLANAPI
IMPLEMENT_DYNAMIC(mWLANAPI, CWnd)
mWLANAPI::mWLANAPI()
{
}
mWLANAPI::~mWLANAPI()
{
}
BEGIN_MESSAGE_MAP(mWLANAPI, CWnd)
END_MESSAGE_MAP()
// mWLANAPI 消息处理程序
//初始化参数
void mWLANAPI::WlanInit()
{
//dwResult = 0;
dwCurVersion = 0;
hClient = NULL;
pInterfaceList = NULL;
pInterface = NULL;
pNetList = NULL;
pNet = NULL;
searchWlan = false;
}
//第一步:打开wlan服务
bool mWLANAPI::OpenWLANService(DWORD *dwResult)
{
*dwResult = WlanOpenHandle(WLAN_API_VERSION //客户端支持的WLAN API的最高版本
, NULL, &dwCurVersion //指定这次会话中将会使用的版本
, &hClient //指定客户端在这次会话中使用的句柄,这个句柄会贯穿整个会话被其他函数使用 。
);
if(ERROR_SUCCESS != *dwResult)
{
switch (*dwResult)
{
case ERROR_INVALID_PARAMETER: //参数一、四为空或参数二不为空
//printMess("Para is NULL\n");
break;
case ERROR_NOT_ENOUGH_MEMORY: //没有足够的内存空间
//printMess("Failed to allocate memory \n");
break;
case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED: //超过服务器限定的句柄数量
//printMess("Server is Busy\n");
break;
default:
*dwResult = GetLastError();
//strbuf.Format("WlanOpenHandle Fail:%wd\n",dwResult);
//printMess(strbuf);
break;
}
return false;
}
//strbuf.Format("\n\nWlanOpenHandle success \n");
//printMess(strbuf);
return true;
}
//第二步:枚举处当前系统安装的所有无线网卡的接口信息。
#pragma region 枚举网卡信息
//WLAN_INTERFACE_INFO_LIST
//这个结构体是包含着网卡接口信息的阵列。
/*
typedef struct _WLAN_INTERFACE_INFO_LIST {
DWORD dwNumberOfItems;
DWORD dwIndex;
WLAN_INTERFACE_INFO InterfaceInfo[];
} WLAN_INTERFACE_INFO_LIST,
*PWLAN_INTERFACE_INFO_LIST;
dwNumberOfItems :InterfaceInfo[ ] 中包含的单元的个数。
dwIndex :当前单元的索引,从0开始到 dwNumberOfItems-1。
这个参数一般用于在 WLAN_INTERFACE_INFO_LIST 被用作参数传递时的一个传递偏移量。这个参数在用之前必须要进行初始化。
InterfaceInfo[ ] :包含WLAN_INTERFACE_INFO 结构体的阵列,用于记录接口信息。
*/
#pragma endregion 枚举网卡信息
bool mWLANAPI::WLANNetwork(DWORD *dwResult)
{
*dwResult = WlanEnumInterfaces(hClient //客户端会话句柄。由 WlanOpenHandle 得到。
, NULL, &pInterfaceList //指向包含无线网卡接口信息list的结构体 PWLAN_INTERFACE_INFO_LIST 的指针。
);
if(ERROR_SUCCESS != *dwResult)
{
switch (*dwResult)
{
case ERROR_INVALID_PARAMETER: //参数一、三为空,或参数二不为空
//printMess("Para is NULL\n");
break;
case ERROR_INVALID_HANDLE: //无效的句柄
//printMess("Failed to INVALID HANDLE \n");
break;
case ERROR_NOT_ENOUGH_MEMORY: //没有足够的内存空间
//printMess("Failed to allocate memory \n");
break;
default:
*dwResult = GetLastError();
//strbuf.Format("WlanEnumInterfaces Fail: %wd\n", dwResult);
//printMess(strbuf);
break;
}
return false;
}
//strbuf.Format("WlanEnumInterfaces Number %wd\n", pInterfaceList->dwNumberOfItems);
//printMess(strbuf); //输出网卡数量
return true;
}
//第三步:搜索接口上可用的网络。
#pragma region 第三步:搜索接口上可用的网络。
/*WLAN_AVAILABLE_NETWORK_LIST
结构体,包含可用网络(network)的信息的列表。
typedef struct _WLAN_AVAILABLE_NETWORK_LIST {
DWORD dwNumberOfItems;
DWORD dwIndex;
WLAN_AVAILABLE_NETWORK Network[1];
} WLAN_AVAILABLE_NETWORK_LIST,
*PWLAN_AVAILABLE_NETWORK_LIST;
dwNumberOfItems :Network中包含的单元的个数
dwIndex :当前单元的索引,从0开始到dwNumberOfItems-1;
当这个结构体作为参数时用到。用之前必须赋初值。
Network :一个WLAN_AVAILABLE_NETWORK 的列表,包含接口信息。
WLAN_AVAILABLE_NETWORK
结构体,包含可用无线网络(network)单元的信息。
typedef struct _WLAN_AVAILABLE_NETWORK {
WCHAR strProfileName[256];
DOT11_SSID dot11Ssid; //SSID
DOT11_BSS_TYPE dot11BssType;
ULONG uNumberOfBssids;
BOOL bNetworkConnectable;
WLAN_REASON_CODE wlanNotConnectableReason;
ULONG uNumberOfPhyTypes;
DOT11_PHY_TYPE dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER];
BOOL bMorePhyTypes;
WLAN_SIGNAL_QUALITY wlanSignalQuality; //信号强度
BOOL bSecurityEnabled;
DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;
DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;
DWORD dwFlags;
DWORD dwReserved;
} WLAN_AVAILABLE_NETWORK,
*PWLAN_AVAILABLE_NETWORK;
DOT11_BSS_TYPE
枚举类型,用于定义BSS网络的类型
typedef enum _DOT11_BSS_TYPE {
dot11_BSS_type_infrastructure,
dot11_BSS_type_independent,
dot11_BSS_type_any,
} DOT11_BSS_TYPE, *PDOT11_BSS_TYPE;
dot11_BSS_type_infrastructure : 为 infrastructure BSS 网络。
dot11_BSS_type_independent :为independent BSS网络
dot11_BSS_type_any :是 infrastructure 或者 independent BSS网络
infrastructure BSS:
中控型基本服务集 (BSS)是一个包含了一个接入点和一些站点的 802.11 网络。这个接入点将信息送入目标站点或者一个固定网络。
independent BSS:
IBSS(Independent Basic Service Set) 独立基本服务集 。是一种无线拓扑结构,IEEE802.11标准的模式
*/
#pragma endregion 第三步:搜索接口上可用的网络。
bool mWLANAPI::SearchNet(CString target,DWORD *dwResult)
{
if (!OpenWLANService(&buf))
{
return false;
}
//Sleep(1000);
if (!WLANNetwork(&buf))
{
return false;
}
//Sleep(1000);
int nInterfaceNumber;
//m_cListBox.ResetContent();
for(nInterfaceNumber = 0; nInterfaceNumber < (int)pInterfaceList->dwNumberOfItems; nInterfaceNumber++)
{
/*获取网卡信息*/
pInterface = (PWLAN_INTERFACE_INFO)&pInterfaceList->InterfaceInfo[nInterfaceNumber];
/*获得网络信息列表*/
*dwResult = WlanGetAvailableNetworkList(hClient //客户端的会话句柄
, &pInterface->InterfaceGuid //要搜索的接口的GUID
, 0x00 //控制list中返回的网络的类型,XP SP2和SP3为零
, NULL, &pNetList //指向返回的可用网络的 WLAN_AVAILABLE_NETWORK_LIST 的指针
);
if(ERROR_SUCCESS != *dwResult)
{
switch (*dwResult)
{
case ERROR_INVALID_PARAMETER: //参数四不为空,或其他参数为空
//printMess("Para is NULL\n");
break;
case ERROR_INVALID_HANDLE:
//printMess("Failed to INVALID HANDLE \n");
break;
case ERROR_NOT_ENOUGH_MEMORY:
//printMess("Failed to allocate memory \n");
break;
case ERROR_NDIS_DOT11_POWER_STATE_INVALID: //广播关闭无法搜索
//printMess("The radio for the interface is turned off \n");
break;
default:
*dwResult = GetLastError();
//strbuf.Format("WlanGetAvailableNetworkList Fail: %wd\n", dwResult);
//printMess(strbuf);
break;
}
return false;
}
//strbuf.Format("WlanGetAvailableNetworkList Number %wd\n", pNetList->dwNumberOfItems); //输出网络数量
//printMess(strbuf);
/*连接网络*/
//bool resultSearch = true;
int nNetNumber;
for(nNetNumber = 0; nNetNumber < pNetList->dwNumberOfItems; nNetNumber++)
{
/*获取网络信息,去重复,只留需要连接的wifi的ssid*/
pNet = (PWLAN_AVAILABLE_NETWORK)&pNetList->Network[nNetNumber];
//strbuf.Format("%s\n",(char*)pNet->dot11Ssid.ucSSID);
//m_cListBox.InsertString(nNetNumber,strbuf);
/*if (strcmp(target.GetBuffer(),(char*)pNet->dot11Ssid.ucSSID) || !resultSearch)
{
continue;
}*/
if (!strcmp(target.GetBuffer(),(char*)pNet->dot11Ssid.ucSSID))
{
searchWlan = true; //找到需要的网络
break; //退出for循环
}
//resultSearch = false;
}
///*释放网络信息列表*/
//if (NULL != pNetList)
//{
// WlanFreeMemory(pNetList);
// pNetList