VC++ win7下实现WIFI共享工具 附源代码(无线承载网络)

来源:互联网 发布:网络连接不稳定 编辑:程序博客网 时间:2024/05/19 10:40

宿舍用手机连wifi总是要用浏览器登录联通的wlan登陆页面,无奈手机太挫内存只有512M,开个网页再干其他的事情就卡的要死,所以果断下载了个wifi共享精灵。用了一次就果断卸载了,为啥呢?竟然有广告,受不了啊。正好在学VC++ 算了自己做一个吧。  

关于无线承载网络

无线承载网络(Wireless Hosted Network)是指安装有无线局域网服务的Windows 7和Windows Server 2008 R2所提供的一种WLAN功能,具备两项主要功能:

第一、把一个物理无线网卡虚拟化成一个或多个虚拟无线网卡,称为虚拟的WiFi。

第二、借助无线网卡把当前接网络虚拟成为一个基于软件的无线接入点,称为虚拟AP或软AP。

=========================万恶的分割线===========================

项目需要包含wlanapi.h 头文件和wlanapi.lib 库

备注:测试环境win7_64,建议关闭一些安全软件,(比如我测试的时候忘了关comodo导致防火墙总是拒绝其他设备的连接)。

=============================================================

功能不复杂,用到的主要函数有下面几个

1.调用WlanOpenHandled得到一个连接hClientHandle,下面的操作都要用到这个连接。当然程序退出的时候记得调用WlanCloseHandle关闭这个连接。

01DWORD WINAPI WlanOpenHandle(
02  _In_        DWORD dwClientVersion,
03  _Reserved_  PVOID pReserved,
04  _Out_       PDWORD pdwNegotiatedVersion,
05  _Out_       PHANDLE phClientHandle
06);
07 
08DWORD WINAPI WlanCloseHandle(
09  _In_        HANDLE hClientHandle,
10  _Reserved_  PVOID pReserved
11);



2.下面的函数用来设置承载网络的一些属性。

01DWORD WINAPI WlanHostedNetworkSetProperty(
02  _In_        HANDLE hClientHandle,
03  _In_        WLAN_HOSTED_NETWORK_OPCODE OpCode,
04  _In_        DWORD dwDataSize,
05  _In_        PVOID pvData,
06  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
07  _Reserved_  PVOID pvReserved
08);
09<pre><span style="color:Blue;">typedef</span> <span style="color:Blue;">enum</span> _WLAN_HOSTED_NETWORK_OPCODE {
10  wlan_hosted_network_opcode_connection_settings,          //设置一些连接属性
11  wlan_hosted_network_opcode_security_settings,            //设置安全属性
12  wlan_hosted_network_opcode_station_profile,              //query the wireless Hosted Network station profile
13  wlan_hosted_network_opcode_enable                        //query or set the wireless Hosted Network enabled flag
14} WLAN_HOSTED_NETWORK_OPCODE, *PWLAN_HOSTED_NETWORK_OPCODE;
15</pre>
16<span></span>

3.启用和禁用无线承载网络。

打开网络和共享中心 单击更改适配器设置,如果启用了无线承载网络 面板里面就会有描述为Microsoft Virtual WiFi Miniport Adapter的一个虚拟网卡。禁用之后这个虚拟网卡就会消失了。

当然只有启用了无线承载网络才能分享wifi啦

1DWORD WINAPI WlanHostedNetworkForceStart(
2  _In_        HANDLE hClientHandle,
3  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
4  _Reserved_  PVOID pvReserved
5);
1DWORD WINAPI WlanHostedNetworkForceStop(
2  _In_        HANDLE hClientHandle,
3  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
4  _Reserved_  PVOID pvReserved
5);


4.连接和断开网络

1DWORD WINAPI WlanHostedNetworkStartUsing(
2  _In_        HANDLE hClientHandle,
3  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
4  _Reserved_  PVOID pvReserved
5);
1DWORD WINAPI WlanHostedNetworkStopUsing(
2  _In_        HANDLE hClientHandle,
3  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
4  _Reserved_  PVOID pvReserved
5);

5.用来查询承载网络的网络状况。

1DWORD WINAPI WlanHostedNetworkQueryStatus(
2  _In_        HANDLE hClientHandle,
3  _Out_       PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus,
4  _Reserved_  PVOID pvReserved
5);
01typedef struct _WLAN_HOSTED_NETWORK_STATUS {
02  WLAN_HOSTED_NETWORK_STATE      HostedNetworkState;
03  GUID                           IPDeviceID;
04  DOT11_MAC_ADDRESS              wlanHostedNetworkBSSID;
05  DOT11_PHY_TYPE                 dot11PhyType;
06  ULONG                          ulChannelFrequency;
07  DWORD                          dwNumberOfPeers;            //已连接的节点数目
08  WLAN_HOSTED_NETWORK_PEER_STATE PeerList[1];                //存放节点信息的数组
09} WLAN_HOSTED_NETWORK_STATUS, *PWLAN_HOSTED_NETWORK_STATUS;
10 
11typedef struct _WLAN_HOSTED_NETWORK_PEER_STATE {
12  DOT11_MAC_ADDRESS                   PeerMacAddress;        //节点设备的MAC地址
13  WLAN_HOSTED_NETWORK_PEER_AUTH_STATE PeerAuthState;            //节点的认证状态
14} WLAN_HOSTED_NETWORK_PEER_STATE, *PWLAN_HOSTED_NETWORK_PEER_STATE;
调用WlanHostedNetworkQueryStatus将得到一个WLAN_HOSTED_NETWORK_STATUS结构体,就可以查询一些网络基本信息了,比如dwNumberOfPeers连接到这个网络的节点数,PeerList数组存放着对应节点的详细信息,包括MAC地址和认证状态。

6.用来设置密码

注意密码长度必须 大于8  小于63 否则会调用失败

1DWORD WINAPI WlanHostedNetworkSetSecondaryKey(
2  _In_        HANDLE hClientHandle,
3  _In_        DWORD dwKeyLength,
4  _In_        PUCHAR pucKeyData,
5  _In_        BOOL bIsPassPhrase,
6  _In_        BOOL bPersistent,
7  _Out_opt_   PWLAN_HOSTED_NETWORK_REASON pFailReason,
8  _Reserved_  PVOID pvReserved
9);

======================贴代码==========================


01//WIFIMAIN.h  实现文件
02#pragma once
03#include <wlanapi.h>
04#pragma comment(lib,"wlanapi.lib")
05 
06// WIFIMAIN
07 
08class WIFIMAIN : public CWnd
09{
10    DECLARE_DYNAMIC(WIFIMAIN)
11 
12public:
13    WIFIMAIN();
14    virtual ~WIFIMAIN();
15 
16protected:
17    DECLARE_MESSAGE_MAP()
18private:
19    bool allow;
20    bool start;
21    HANDLE hClient;
22public:
23    int Init(void);
24    int AllowHostedNetWork(void);
25    int DisallowHostedNetWork(void);
26    int StartHostedNetWork(void);
27    int StopHostedNetWork(void);
28    bool isStart(void);
29    bool isAllow(void);
30    int Resume(void);
31    int getpeernumber(void);
32    int SetKEY(CString key);
33    int SetSSID(CString ssidname);
34};



001// WIFIMAIN.cpp : 实现文件
002//
003 
004#include "stdafx.h"
005#include "wifi共享1028.h"
006#include "WIFIMAIN.h"
007 
008 
009// WIFIMAIN
010 
011IMPLEMENT_DYNAMIC(WIFIMAIN, CWnd)
012 
013WIFIMAIN::WIFIMAIN()
014: allow(false)
015, start(false)
016{
017    Init();
018}
019 
020WIFIMAIN::~WIFIMAIN()
021{
022    StopHostedNetWork();
023    WlanCloseHandle(hClient, NULL);
024}
025 
026 
027BEGIN_MESSAGE_MAP(WIFIMAIN, CWnd)
028END_MESSAGE_MAP()
029 
030 
031 
032// WIFIMAIN 消息处理程序
033 
034 
035 
036 
037 
038 
039int WIFIMAIN::Init(void)
040{
041    DWORD dwCurVersion = 0;
042    DWORD dwResult = 0;
043     
044    dwResult = WlanOpenHandle(WLAN_API_VERSION, NULL, &dwCurVersion, &hClient);
045    if( ERROR_SUCCESS != dwResult )
046    {
047        return -1;
048    }
049 
050 
051    BOOL bIsAllow = true;
052    WLAN_HOSTED_NETWORK_REASON dwFailedReason;
053    dwResult = WlanHostedNetworkSetProperty(hClient,
054                                            wlan_hosted_network_opcode_enable,
055                                            sizeof(BOOL),
056                                            &bIsAllow,
057                                            &dwFailedReason,
058                                            NULL);
059    if( ERROR_SUCCESS != dwResult )
060    {
061        return -2;
062    }
063     
064    return 0;
065}
066 
067 
068int WIFIMAIN::AllowHostedNetWork(void)
069{
070    PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
071     
072    DWORD dwResult= 0;
073    dwResult=WlanHostedNetworkForceStart(hClient,pFailReason,NULL);
074    if( dwResult != ERROR_SUCCESS )
075    {
076        return -1;
077    }
078    allow=true;
079    return 0;
080}
081 
082 
083int WIFIMAIN::DisallowHostedNetWork(void)
084{
085    PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
086    DWORD dwResult= 0;
087    dwResult=WlanHostedNetworkForceStop(hClient,pFailReason,NULL);
088    if( dwResult != ERROR_SUCCESS )
089    {
090        return -1;
091    }
092    allow=false;
093    return 0;
094}
095 
096 
097int WIFIMAIN::StartHostedNetWork(void)
098{
099    PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
100    DWORD dwResult= 0;
101    dwResult=WlanHostedNetworkStartUsing(hClient,pFailReason,NULL);
102    if( dwResult != ERROR_SUCCESS )
103    {
104        return -1;
105    }
106    start=true;
107    return 0;
108}
109 
110 
111int WIFIMAIN::StopHostedNetWork(void)
112{
113    PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL;
114    DWORD dwResult= 0;
115    dwResult=WlanHostedNetworkStopUsing(hClient,pFailReason,NULL);
116    if( dwResult != ERROR_SUCCESS )
117    {
118        return -1;
119    }
120    start=false;
121    return 0;
122}
123 
124 
125 
126bool WIFIMAIN::isStart(void)
127{
128    return start;
129}
130 
131 
132bool WIFIMAIN::isAllow(void)
133{
134    return allow;
135}
136 
137 
138int WIFIMAIN::Resume(void)
139{
140    DWORD dwResult = 0;
141     
142    BOOL bIsAllow = false;
143    WLAN_HOSTED_NETWORK_REASON dwFailedReason;
144    dwResult = WlanHostedNetworkSetProperty(hClient,
145                                            wlan_hosted_network_opcode_enable,
146                                            sizeof(BOOL),
147                                            &bIsAllow,
148                                            &dwFailedReason,
149                                            NULL);
150    if( ERROR_SUCCESS != dwResult )
151    {
152        return -2;
153    }
154     
155    return 0;
156}
157 
158 
159int WIFIMAIN::getpeernumber(void)
160{
161    PWLAN_HOSTED_NETWORK_STATUS ppWlanHostedNetworkStatus=NULL;
162    int retval = WlanHostedNetworkQueryStatus(hClient,&ppWlanHostedNetworkStatus,NULL);
163    if(  retval != ERROR_SUCCESS ){
164        return -1;
165    }
166    return ppWlanHostedNetworkStatus->dwNumberOfPeers;
167}
168 
169 
170int WIFIMAIN::SetKEY(CString key)
171{
172    char chkey[64];
173    int index;
174    for(index=0; index<key.GetLength(); index++ )
175    {
176        chkey[index] = key[index];
177    }
178    chkey[index]='\0';
179 
180 
181    WLAN_HOSTED_NETWORK_REASON dwFailedReason;
182         
183    DWORD dwResult= 0;
184    dwResult = WlanHostedNetworkSetSecondaryKey(hClient,
185                                                strlen((const char*)chkey) + 1,
186                                                (PUCHAR)chkey,
187                                                TRUE,
188                                                FALSE,
189                                                &dwFailedReason,
190                                                NULL);
191    if(ERROR_SUCCESS != dwResult)
192    {
193       return -1;
194    }
195 
196    return 0;
197}
198 
199 
200int WIFIMAIN::SetSSID(CString ssidname)
201{
202     
203    char chname[64];
204    int index;
205    for(index=0; index<ssidname.GetLength(); index++ )
206    {
207        chname[index] = ssidname[index];
208    }
209    chname[index]='\0';
210     
211    DWORD dwResult= 0;
212    WLAN_HOSTED_NETWORK_REASON dwFailedReason;
213    WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS cfg;
214    memset(&cfg, 0, sizeof(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS));
215 
216    memcpy( cfg.hostedNetworkSSID.ucSSID, chname, strlen(chname)  ) ;
217    cfg.hostedNetworkSSID.uSSIDLength = strlen((const char*)cfg.hostedNetworkSSID.ucSSID);
218    cfg.dwMaxNumberOfPeers = 20;        //最大连接数   
219 
220    dwResult = WlanHostedNetworkSetProperty(hClient,
221                                            wlan_hosted_network_opcode_connection_settings,
222                                            sizeof(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS),
223                                            &cfg,
224                                            &dwFailedReason,
225                                            NULL);
226     if(ERROR_SUCCESS != dwResult )
227     {
228        return -1;
229     }
230 
231     return 0;
232}


==========================================

这里只贴出了比较重要的代码,其他的略去了,需要的可以去我的网盘下载完整项目代码。

代码和程序下载:http://pan.baidu.com/s/1GI0kG
程序只完成了基本功能,还有待完善,但是学习的过程还是很有意思的。

下面是几篇关于无线承载网络比较不错的文章,当时对我帮助很大。

关于无线承载网络http://blog.wbpluto.com/2010/08/about-wireless-hosted-network/

==========================================


转载请以超链接保留本文链接