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关闭这个连接。
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;
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/
==========================================
转载请以超链接保留本文链接
- VC++ win7下实现WIFI共享工具 附源代码(无线承载网络)
- Win7无线配置工具VC++(Soft-Ap,Wifi,无线承载网络,ICS,Wifi)
- Win7无线配置工具VC++(Soft-Ap,Wifi,无线承载网络,ICS,Wifi)
- Windows无线Wifi(网络承载实现)
- 用DOS写一个简单的虚拟WIFI工具,启动无线承载网络,自动配置实现共享
- Win7下建立WiFi热点共享网络(共享3G无线网卡/有线本地连接)
- Win7无线共享WiFi网络(修改增加版)
- Win7下开启无线Wifi共享
- win7 共享无线wifi
- 利用WIN7无线承载网络设置WIFI热点,让M9无线上网
- Wifi网络共享----Win8内置承载网络
- Win7虚拟成无线路由共享网络wifi热点
- win7---虚拟wifi无法启动承载网络
- WIN7下使用无线网卡共享网络(利用笔记本无线网卡做无线AP)
- Win7无线共享wifi热点
- win7虚拟无线工具+wifi下eclipse调试工具
- Win7共享无线 实现iPad 2 WiFi上网
- Win7共享无线 实现iPad 2 WiFi上网
- dex2jar和JD-GUI 反编译
- nyoj128 前缀式求值(栈---递归---数据结构)
- 汇编指令
- CSRF 攻击的应对之道
- processing第三天学习笔记
- VC++ win7下实现WIFI共享工具 附源代码(无线承载网络)
- Sample 3.2:exceed.cpp
- poj3087
- 最近读书计划
- 硬盘类型和Linux分区
- processing 第四天学习笔记
- ChannelProcessingFilter
- 关联式容器-基于hash
- 混乱的日子