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

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

关于无线承载网络

无线承载网络(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]=

''

;

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]=

''

;

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/

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

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

© 版权声明

相关文章

暂无评论

none
暂无评论...