Saber 酱的抱枕

Fly me to the moon

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;
}

承载网络及其辅助工具

  1. locationiskey 文章作者
    Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

    继续折腾输入输出流……坑
    缩进不管啦!

    回复
      1. locationiskey 文章作者
        Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

        睡眠严重不足。大前天只睡了4小时就起来赶车

        回复
          1. locationiskey 文章作者
            Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

            _(:3」∠)_早上几点起

            另,求一个程序图标……大致就像波兰球(只有一个圆,没有别的)顶着一个wifi标志_(:3」∠)_

            回复
        1. saber
          Google Chrome 45Google Chrome 45Windows 7 x64 EditionWindows 7 x64 Edition

          设计苦手 你要我做图标 估计就是俩素材直接一拼 _(:3」∠)_
          我想单纯做程序啊

          回复
          1. locationiskey 文章作者
            Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

            就是拼一拼_(:3」∠)_
            好吧说着玩的
            这年头都得当多面手,越是小公司,越………………

            回复
        2. saber
          Google Chrome 45Google Chrome 45Windows 7 x64 EditionWindows 7 x64 Edition

          果断时间有望再招一个美工,摆脱苦逼的做图了 _(:3」∠)_

          回复
          1. locationiskey 文章作者
            Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

            呃。你是这个意思………………

            遥遥无期罢了………………

            回复
          1. locationiskey 文章作者
            Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

            我也不想的。

            可惜我只能说自作自受。

            只是代价好像有点大啊……

            回复
        1. saber
          Google Chrome 45Google Chrome 45Windows 7 x64 EditionWindows 7 x64 Edition

          这种情况太纠结了,单身狗只能表示祝福你 (#-_-)┯━┯

          回复
  2. saber
    Google Chrome 36Google Chrome 36Windows XPWindows XP

    表示不懂==还有评论的表情我也没注意到是什么时候没有的了

    回复
    1. locationiskey 文章作者
      Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

      就是win7的共享网络功能啊……写了个辅助使用的bat而已

      表情确实不见了……

      (另,你这的密码不是明文保存的吧……)

      回复
          1. saber
            Google Chrome 37Google Chrome 37Windows 7Windows 7

            是保存到数据库里面的吧,不知道你为什么要问是不是明文

            回复
            1. locationiskey 文章作者
              Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

              防脱库……在数据库里的用户名和密码配对有时是明文储存的

              其实是给站长普及安全知识……

              回复
              1. saber
                Google Chrome 36Google Chrome 36Windows 7 x64 EditionWindows 7 x64 Edition

                就算你这么说了,站长也还是不懂啊Orz关于表情我想是WP更新的时候搞没了的,有空了看能不能再改回来

    2. locationiskey 文章作者
      Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

      恩,这个代码是怎么贴的?现在怪怪的

      回复
      1. saber
        Google Chrome 45Google Chrome 45Windows 7 x64 EditionWindows 7 x64 Edition

        后台编辑器里有个插入代码的按钮,crayon 不过代码着色一直有问题

        回复
        1. locationiskey 文章作者
          Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

          我去怎么好像复制过来少了几行……暂且不管了(╯°口°)╯(┴—┴

          回复
            1. locationiskey 文章作者
              Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

              所有的<>都变成别的了,所以我又复制了一遍

              而且这是c++不是c#
              我再看看

              回复
              1. locationiskey 文章作者
                Internet Explorer 11.0Internet Explorer 11.0Windows 7Windows 7

                呃。你这里的尖括号会因为各种原因奇妙地消失所以这样的。包括上面这回复的………………

TOP
    显示公告
    聊      天
    吃 零 食
    博客后台
    生存时间
    关闭春菜
    X
    召唤春菜