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

宿舍用手机连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关闭这个连接。

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



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

01 DWORD 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啦

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


4.连接和断开网络

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

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

1 DWORD WINAPI WlanHostedNetworkQueryStatus(
2   _In_        HANDLE hClientHandle,
3   _Out_       PWLAN_HOSTED_NETWORK_STATUS *ppWlanHostedNetworkStatus,
4   _Reserved_  PVOID pvReserved
5 );
01 typedef 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  
11 typedef 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 否则会调用失败

1 DWORD 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  
08 class WIFIMAIN : public CWnd
09 {
10     DECLARE_DYNAMIC(WIFIMAIN)
11  
12 public:
13     WIFIMAIN();
14     virtual ~WIFIMAIN();
15  
16 protected:
17     DECLARE_MESSAGE_MAP()
18 private:
19     bool allow;
20     bool start;
21     HANDLE hClient;
22 public:
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  
011 IMPLEMENT_DYNAMIC(WIFIMAIN, CWnd)
012  
013 WIFIMAIN::WIFIMAIN()
014 : allow(false)
015 , start(false)
016 {
017     Init();
018 }
019  
020 WIFIMAIN::~WIFIMAIN()
021 {
022     StopHostedNetWork();
023     WlanCloseHandle(hClient, NULL);
024 }
025  
026  
027 BEGIN_MESSAGE_MAP(WIFIMAIN, CWnd)
028 END_MESSAGE_MAP()
029  
030  
031  
032 // WIFIMAIN 消息处理程序
033  
034  
035  
036  
037  
038  
039 int 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  
068 int 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  
083 int 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  
097 int 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  
111 int 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  
126 bool WIFIMAIN::isStart(void)
127 {
128     return start;
129 }
130  
131  
132 bool WIFIMAIN::isAllow(void)
133 {
134     return allow;
135 }
136  
137  
138 int 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  
159 int 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  
170 int 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  
200 int 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/

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


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


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值