

09/28
2014
很久没发东西了……
嘛最近那什么感觉还不错……
算了不扯远
承载网络是win7下引入的共享网络的方法。事实上网上教程多如牛毛,相关软件也不少
下面是我的教程(没错,就是很久以前写的那个)及其辅助工具。
注意,由于只是辅助工具,有些步骤难以代劳,所以不对这个方法有个全面的了解直接用工具只会摸不着头脑
工具可以直接查看代码……对密码位数处理的代码来自网络
http://pan.baidu.com/s/1sjv0WIL
net share.exe
大小 :240,128字节
MD5:7bbf66beef3af7c3e98d40054bb083f1
SHA1:5f76a27775a32076deae8434a6ddb7017b9f52ca
CRC32:46193bad
bat大更新,增强了代码健壮性,允许ssid和密码输入空格等字符事实上字符串处理一塌糊涂………………
c++版本正在路上。基础功能已经完成。 完成。
部分功能直接使用api调用,并且c++下字符串处理再怎么着也比批处理方便
有些仍然保留netsh,是因为不知道api/api没有公开/使用api会导致程序结束共享即关闭
API参考:https://msdn.microsoft.com/en-us/library/ms706274(v=vs.85).aspx
然而代码及其粗糙,完全不适合debug。反正也就自己随便用用……好孩子不要学!!!缩进已经爆炸了我不管了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 | #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <wlanapi.h> #pragma comment (lib, "wlanapi.lib") #include <VersionHelpers.h> #include <iostream> #include <string> using namespace std; #undef max//因为下面有标示符max而windows.h里定义了一个宏max………… int checkpassword(string pass);//检查密码长度是否合法 bool checkstring(string str);//检查字符串是否仅由ascII组成 string getssid();//输入ssid并检查长度 string getpassword();//输入密码,且调用checkpassword DWORD getpeer();//输入最大连接数 string getname();//输入"无线网络连接"名 int main() { if (!IsWindows7OrGreater()) { cout << "需要Windows 7或更高的操作系统才支持承载网络" << endl; system("pause"); return 0; } cout << "本程序不具备任何除错功能,当开启承载网络失败时请自行通过netsh命令开启以查找原因" << endl; system("pause"); system("cls"); DWORD dwClientVersion = 2; PVOID pReserved = NULL; DWORD dwNegotiatedVersion; HANDLE hClientHandle; PWLAN_HOSTED_NETWORK_REASON pFailReason = NULL; WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS wlan_settings;//API需求变量 WlanOpenHandle( dwClientVersion, pReserved, &dwNegotiatedVersion, &hClientHandle ); //句柄API int num, i; DWORD peer; string ssid, pass, name, commandtemp; const string COMMAND1_1 = { "netsh wlan set autoconfig enabled=no interface=" }, COMMAND1_2 = { "netsh wlan set autoconfig enabled=yes interface=" }, COMMAND2_1 = { "netsh int set int name=" }, COMMAND2_2_1 = { " admin=disabled" }, COMMAND2_2_2 = { " admin=enable" };//需要用到的命令行的组成部分 UCHAR upass[64]; char command[1000]; bool temp; while (true)//循环以回到原界面,其他函数同理 { num = -1; cout << "请输入操作对应的编号" << endl;<code> cout << "0.查看当前虚拟网卡状态" << endl << "1.查看是否支持虚拟网卡" << endl << "2.允许启用虚拟网卡功能并设定网络名称(ssid)、密码及最大连接数" << endl << "3.仅允许启用虚拟网卡功能" << endl << "4.打开虚拟网卡" << endl << "5.修改网络名称(ssid)和最大连接数" << endl << "6.修改密码" << endl << "7.关闭虚拟网卡" << endl << "8.禁止启用虚拟网卡功能" << endl << "9.增强网络共享的稳定性(慎用)" << endl << "10.关闭增强网络共享的稳定性功能(每次开启增强稳定性功能后必须要关闭)" << endl << "11.尝试修复无法正常启动或禁用的虚拟网卡(现有无线网络连接会断开)" << endl << "12.退出" << endl; cin >> num; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); switch (num) { case 0: { system("netsh wlan show hostednetwork "); } break; case 1: { system("netsh wlan show drivers"); } break; case 2: { ssid = getssid(); pass = getpassword(); peer = getpeer(); wlan_settings.hostedNetworkSSID.uSSIDLength = ssid.length(); for (i = 0;i<int(ssid.length()); i++) { wlan_settings.hostedNetworkSSID.ucSSID[i] = ssid[i]; }//将string转换为uchar,作为api参数 wlan_settings.dwMaxNumberOfPeers = peer; WlanHostedNetworkSetProperty( hClientHandle, wlan_hosted_network_opcode_connection_settings, sizeof(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS), &wlan_settings, pFailReason, NULL );//SSID/最大连接数API for (i = 0; i<int(pass.length()); i++) { upass[i] = pass[i]; } upass[i] = '\0';//将string转换为uchar字符串,作为api参数 WlanHostedNetworkSetSecondaryKey( hClientHandle, (i+1), upass, true, true, pFailReason, NULL );//密码API WlanHostedNetworkInitSettings( hClientHandle, pFailReason, NULL );//初始化API temp = true; WlanHostedNetworkSetProperty( hClientHandle, wlan_hosted_network_opcode_enable, sizeof(BOOL), &temp, pFailReason, NULL );//设置为允许API cout << "设置完成" << endl; } break; case 3: { WlanHostedNetworkInitSettings( hClientHandle, pFailReason, NULL ); temp = true; WlanHostedNetworkSetProperty( hClientHandle, wlan_hosted_network_opcode_enable, sizeof(BOOL), &temp, pFailReason, NULL ); cout << "设置完成" << endl; } break; case 4: { WlanHostedNetworkInitSettings( hClientHandle, pFailReason, NULL ); system("netsh wlan start hostednetwork"); } break; case 5: { system("netsh wlan stop hostednetwork"); ssid = getssid(); peer = getpeer(); wlan_settings.hostedNetworkSSID.uSSIDLength = ssid.length(); for (i = 0; i<int(ssid.length()); i++) { wlan_settings.hostedNetworkSSID.ucSSID[i] = ssid[i]; }//将string转换为uchar,作为api参数 wlan_settings.dwMaxNumberOfPeers = peer; WlanHostedNetworkSetProperty( hClientHandle, wlan_hosted_network_opcode_connection_settings, sizeof(WLAN_HOSTED_NETWORK_CONNECTION_SETTINGS), &wlan_settings, pFailReason, NULL ); WlanHostedNetworkInitSettings( hClientHandle, pFailReason, NULL ); cout << "设置完成" << endl; } break; case 6: { system("netsh wlan stop hostednetwork"); pass = getpassword(); for (i = 0; i<int(pass.length()); i++) { upass[i] = pass[i]; } upass[i] = '\0';//将string转换为uchar字符串,作为api参数 WlanHostedNetworkSetSecondaryKey( hClientHandle, (i+1), upass, true, true, pFailReason, NULL ); WlanHostedNetworkInitSettings( hClientHandle, pFailReason, NULL ); cout << "设置完成" << endl; } break; case 7: { system("netsh wlan stop hostednetwork"); } break; case 8: { system("netsh wlan stop hostednetwork"); temp = false; WlanHostedNetworkSetProperty( hClientHandle, wlan_hosted_network_opcode_enable, sizeof(BOOL), &temp, pFailReason, NULL ); cout << "设置完成" << endl; } break; case 9://基本上理解为关闭网卡的搜索功能让出资源给承载网络 { name = getname(); commandtemp = COMMAND1_1 + name; for (i = 0; i < int(commandtemp.length()); i++) { command[i] = commandtemp[i]; } command[i] = '\0';//将string转换为char字符串,作为命令行命令 system(command); cout << "网络共享停止后请一定记得关闭该功能(功能编号10)" << endl << "否则无法连接无线网络!" << endl; } break; case 10: { name = getname(); commandtemp = COMMAND1_2 + name; for (i = 0; i < int(commandtemp.length()); i++) { command[i] = commandtemp[i]; } command[i] = '\0';//将string转换为char字符串,作为命令行命令 system(command); cout << "设置完成" << endl; } break; case 11://其实就是把网卡禁用再启用 { system("netsh wlan stop hostednetwork"); name = getname(); commandtemp = COMMAND2_1 + name + COMMAND2_2_1; for (i = 0; i < int(commandtemp.length()); i++) { command[i] = commandtemp[i]; } command[i] = '\0';//将string转换为char字符串,作为命令行命令 system(command); commandtemp = COMMAND2_1 + name + COMMAND2_2_2; for (i = 0; i < int(commandtemp.length()); i++) { command[i] = commandtemp[i]; } command[i] = '\0';//将string转换为char字符串,作为命令行命令 system(command); cout << "请尝试再次启动虚拟网卡" << endl; } break; case 12: { WlanCloseHandle( hClientHandle, NULL );//关闭句柄API return 0; } break; default: { cout << "输入错误!请重新输入" << endl; } } system("pause"); system("cls"); } } int checkpassword(string pass) { int len; len = pass.length(); if (len < 8) return 1; else if (len > 63) return 2; return 0; } bool checkstring(string str) { int len = str.length(), i, j; for (i = 0; i < len; i++) { j = int(str[i]); if (j <= 0 || j >= 128) return true; } return false; } string getssid()//DOT11_SSID_MAX_LENGTH是API定义的SSID最大长度 { string ssid; while (true) { cout << "请输入ssid(网络名称," << DOT11_SSID_MAX_LENGTH << "位以内)。请仅使用数字、字母及符号" << endl; getline(cin, ssid); //cin.clear(); //cin.ignore(numeric_limits<streamsize>::max(), '\n'); if (checkstring(ssid)) { cout << "输入错误!请重新输入" << endl; system("pause"); continue; } if (ssid.length()>DOT11_SSID_MAX_LENGTH) { cout << "SSID过长,请重新输入" << endl; system("pause"); continue; } return ssid; } } string getpassword() { string pass; while (true) { cout << "请输入密码(8~63位)。请仅使用数字、字母及符号" << endl; getline(cin, pass); //cin.clear(); //cin.ignore(numeric_limits<streamsize>::max(), '\n'); if (checkstring(pass)) { cout << "输入错误!" << endl; system("pause"); continue; } switch (checkpassword(pass)) { case 1: { cout << "密码过短,请重新输入" << endl; system("pause"); continue; } break; case 2: { cout << "密码过长,请重新输入" << endl; system("pause"); continue; } break; } cout << "安全起见,接下来会进行清屏以消除密码" << endl; system("pause"); system("cls"); return pass; } } DWORD getpeer() { DWORD peer; while (true) { peer = 0; cout << "请输入最大连接数。不要设得过小" << endl; cin >> peer; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); if (peer <= 0) { cout << "输入错误!请重新输入" << endl; system("pause"); continue; } return peer; } } string getname()//由于必然涉及中文,所以并没有checkstring { string name; while (name.length() == 0) { cout << "请输入实际无线网卡对应的“无线网络连接”的名字(如无线网络连接 2),不带引号" << endl; getline(cin,name); //cin.clear(); //cin.ignore(numeric_limits<streamsize>::max(), '\n'); } name = "\"" + name + "\"";//给无线网络连接名加上引号,以防空格(用于命令行命令) return name; } |
继续折腾输入输出流……坑
缩进不管啦!