原文:http://hi.baidu.com/ritrachiao/item/bf7715e6bb8cb3a0c10d75be

【此刻我要大大地记录一下!】

这个折腾了我好几天的Windows 7 API终于让我搞定了!

利用Windows ICS API 和Windows 7 API中全新的Wireless Hosted Network,将本地的有线连接共享给Microsoft虚拟Wifi,使得本地计算机在windows 7下变成AP!

这个操作的手动操作部分,我在前一篇文章[译] 关于无线承载网络(Wireless Hosted Network)中已经讲明白了,但是Windows 7为我们提供了相关操作的API,所以,我想,可否不需要去记录那些繁琐的命令,也不要打开命令行,只需要用一个C++程序,将所有的操作封装在一起,那么便可以实现!

于是,开启了我苦逼地阅读Windows API的旅程。。

其实原理非常简单,首先想办法开启Windows的ICS服务,然后开启Wireless Hosted Network,再将两个关联起来。可是,就是这么easy的逻辑,老纸找这些API找了好久啊~~~主要也是之前不懂这些API怎么用,再加上一直查不到相关的资料,最后,几番折腾,终于在官方文档、走过无数弯路、MSDN的友情帮助,以及各大论坛的细枝末节中,我终于找到蛛丝马迹,将功能完全实现了!

废话不多说,直接上代码!

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Copyright (C) Microsoft.  All rights reserved.

#define WIN32_LEAN_AND_MEAN

#include "stdafx.h"

#include <windows.h>

#include <objbase.h>

#include <netcon.h>

#include <stdio.h>

#include <NetCon.h>

#include <locale.h>

#include <wlanapi.h>

#include <WinNetWk.h>

#include <netlistmgr.h>

#include <ShObjIdl.h>

#pragma comment (lib, "wlanapi.lib")

#pragma comment (lib,"Mpr.lib")

#pragma comment(lib, "ole32.lib")

#pragma comment(lib, "oleaut32.lib")

// as in winsock.h

#define NAT_PROTOCOL_TCP 6

#define NAT_PROTOCOL_UDP 17

HRESULT AddSharingNet (INetSharingManager* pNSM)

{

INetConnection * pNC = NULL; // fill this out for part 2 below

INetSharingEveryConnectionCollection * pNSECC = NULL;

HRESULT hr = pNSM->get_EnumEveryConnection (&pNSECC);

if (!pNSECC)

wprintf (L"failed to get EveryConnectionCollection!\r\n");

else {

// enumerate connections

IEnumVARIANT * pEV = NULL;

IUnknown * pUnk = NULL;

hr = pNSECC->get__NewEnum (&pUnk);

if (pUnk) {

hr = pUnk->QueryInterface (__uuidof(IEnumVARIANT),

(void**)&pEV);

pUnk->Release();

}

if (pEV) {

VARIANT v;

VariantInit (&v);

BOOL bFoundIt = FALSE;

INetSharingConfiguration * pNSC = NULL;

INetSharingConfiguration * pVWifiNSC = NULL;

NETCON_PROPERTIES* pVWifi = NULL;

while (S_OK == pEV->Next (1, &v, NULL)) {

if (V_VT (&v) == VT_UNKNOWN) {

V_UNKNOWN (&v)->QueryInterface (__uuidof(INetConnection),

(void**)&pNC);

if (pNC) {

NETCON_PROPERTIES* pNP = NULL;

pNC->GetProperties(&pNP);

setlocale(LC_ALL, "chs");

wprintf(L"pszwName--%s\n",pNP->pszwName);

wprintf(L"pszwDeviceName--%s\n",pNP->pszwDeviceName);

wprintf(L"Status--%d\n",pNP->Status);

wprintf(L"MediaType--%d\n",pNP->MediaType);

wprintf(L"dwCharacter--%d\n",pNP->dwCharacter);

wprintf(L"clsidThisObject--%d\n",pNP->clsidThisObject);

wprintf(L"clsidUiObject--%d\n",pNP->clsidUiObject);

wprintf(L"\n");

if(pNP->Status == NCS_CONNECTED){

hr = pNSM->get_INetSharingConfigurationForINetConnection (pNC, &pNSC);

hr = pNSC->EnableSharing(ICSSHARINGTYPE_PUBLIC);

pNSC->Release();

}

if(!strcmp((char*)(pNP->pszwName),(char*)(L"leonchiao"))){

pVWifi = pNP;

hr = pNSM->get_INetSharingConfigurationForINetConnection(pNC,&pVWifiNSC);

pVWifiNSC->EnableSharing(ICSSHARINGTYPE_PRIVATE);

wprintf(L"\nIs this VWifi?--%s\n\n",pVWifi->pszwDeviceName);

}

}

}

}

INetSharingPortMapping * pNSPM = NULL;

BSTR pszwName = pVWifi->pszwName;

wprintf(L"BSTR--------------%s\n",pszwName);

pVWifiNSC->Release();

if (pNSPM) {

wprintf (L"just added ........................................................!\r\n");

hr = pNSPM->Enable();

wprintf (L"just enabled port mapping!\r\n");

INetSharingPortMappingProps* pMapping = NULL;

pNSPM->get_Properties(&pMapping);

BSTR result = NULL;

long port = 0;

pMapping->get_Name(&result);

pMapping->get_ExternalPort(&port);

wprintf(L"NAMEEEEE::::%s\n",result);

wprintf(L"exPortttttt::::%d\n",port);

pNSPM->Release();

}

}

}

return hr;

}

HRESULT StartHostednetwork()

{

DWORD dwNegotiatedVersion = 1;

HANDLE hClientHandle = 0;

DWORD dwClientVersion = 2;

DWORD hWlan;

DWORD hStart;

WLAN_HOSTED_NETWORK_REASON failReason;

char result[600];

DWORD dwKeyLength = 10;

BOOL bIsPassPhrase = true;

BOOL bPersistent = true;

DWORD hSecondkey;

hWlan = WlanOpenHandle(dwClientVersion,NULL,&dwNegotiatedVersion,&hClientHandle);

DWORD dwRetVal;

TCHAR UserName[80];

DWORD dwNameLength = sizeof(UserName);

if(hWlan == ERROR_SUCCESS)

{

hStart = WlanHostedNetworkStartUsing (hClientHandle,&failReason,NULL);

wprintf(L"Starting Hostednetwork!\n");

}

return hStart;

}

int main()

{

CoInitialize (NULL);

// init security to enum RAS connections

CoInitializeSecurity (NULL, -1, NULL, NULL,

RPC_C_AUTHN_LEVEL_PKT,

RPC_C_IMP_LEVEL_IMPERSONATE,

NULL, EOAC_NONE, NULL);

INetSharingManager * pNSM = NULL;

HRESULT hr = ::CoCreateInstance (__uuidof(NetSharingManager),

NULL,

CLSCTX_ALL,

__uuidof(INetSharingManager),

(void**)&pNSM);

if (!pNSM)

wprintf (L"failed to create NetSharingManager object\r\n");

else{

AddSharingNet(pNSM);

StartHostednetwork();

}

getchar();

return (int)hr;

}

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我简单解释一下代码:(1)第一个函数是HRESULT AddSharingNet (INetSharingManager* pNSM),这个函数的作用就是开启ICS服务,并且将ICS服务共享出去。除此之外,我在函数中将所有的网络适配器都打印了出来,可以为进一步开发做铺垫。这里面比较重要的一个地方是用红色标记出来的,也就是说,ICS需要PUBLIC的共享。另一个重要的地方是用蓝色标记出来的,这里主要说明的是,在找到Microsoft 虚拟Wifi之后,你需要为这个虚拟wifi做映射,那么映射之前你得先找到这个网络适配器,所以就先将它保存在pVWifiNSC中,然后这个时候记录下来的适配器是虚拟Wifi,这是将虚拟wifi进行PRIVATE共享,它会自动和本机的有线连接进行关联,实现内部的ICS共享。这一步就是这么简单,但是就是这么简单,然我尝试了N种方法,最终终于搞定!

(2)第二个函数是HRESULT StartHostednetwork(),这个函数很简单,就是开启Wireless Hosted Network,如果你对这里不熟悉,很容易在Windows 7 API W部分找到这些API,而且我的上一篇文章页提到了如何使用这些API。

就这样,整个工作就结束了,老纸可是花了九牛二虎之力才搞定的,真的不容易啊!

期间走了很多弯路,而且发现没有其他人写过类似的代码,连个可以参考的都没有,最后自己摸黑走,实验了很多种API,思来想去找了很多种办法,都不成功,最后几经周折,功夫不负有心人,终于将问题搞定!

不得不感叹一下啊!哈哈~

【转】Windows 7 API Internet Connection Sharing(ICS) 与 Wireless Hosted Network构建本地AP的更多相关文章

  1. 解决 internet connection sharing 启动不了

    1.确认Windows Firewall服务是否启动(有异常可参考下面) a.打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ ...

  2. internet connection sharing has been disabled by the network administrator

    Start > Run > gpedit.msc Locate; Computer Configuration/Administrative Templates/Network/Netwo ...

  3. Genymotion-Android模拟器提示"Unable to connect to the Genymotion server. Please check your Internet connection."解决方法

    昨天刚装的Genymotion,昨晚还用得好好的. 今晚开机,重新打开Genymotion,却提示:"Unable to connect to the Genymotion server. ...

  4. Windows Automation API 3.0 Overview

    https://www.codemag.com/article/0810042 While general accessibility requirements (such as font color ...

  5. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  6. (Delphi) Windows 32 API程序设计目录

    这里所有程序均使用Delphi调用Windows 32 API方式实现,并不是使用VCL已经封装好的类实现的! (一)第一个窗口程序 01 创建第一个窗口.

  7. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  8. windows内核Api的学习

    windows内核api就是ntoskrnl.exe导出的函数.我们能够跟调用应用层的api一样,调用内核api. 只是内核api须要注意的是.假设函数导出了.而且函数文档化(也就是能够直接在msdn ...

  9. C#中读写配置参数文件(利用Windows的API)

      读配置文件与写配置文件的核心代码如下:   [DllImport("kernel32")] // 读配置文件方法的6个参数:所在的分区(section).键值. 初始缺省值. ...

随机推荐

  1. 【Unity】4.6 灯光

    分类:Unity.C#.VS2015 创建日期:2016-04-11 一.简介 灯光(Light,也叫光源)是每一个场景的重要组成部分,用于照亮场景和对象,从而让游戏具有自己的个性和风格,比如利用灯光 ...

  2. android Binder的优点

    Linux进程间通信的方式: 管道(Pipe) 信号(Signal) 消息队列(Message) 共享内存(Share Memory) 套接字(Socket)中断 Binder Binder 介绍: ...

  3. 基于express框架的Token实现方案

    什么是Token? 在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思.一般我们所说的的token大多是指用于身份验证的token Token的特点 随机性 不可预测性 时效性 无状态. ...

  4. Node + Express + vue2.0 + Webpack项目实践

    技术 Express.Vue.Vue-Router.Vue-Resource.Webpack Vue vue 的组件化思想和 React 很像,一个 vue 组件将 html.css 和 js 都写在 ...

  5. 菜鸟学Java(五)——JSP内置对象之request

    书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...

  6. mongoose之findOneAndUpdate方法之代码示例

    categoryModel.findOneAndUpdate({name:{$in:req.body.categorys}},{$inc:{total:1}},function(err){ if (e ...

  7. js中实现对checkbox选中和取消

    可以使用 element.attr('checked','checked') 来进行选中.但是不能使用 element.attr('checked','false') 来取消选中. 必须通过以下方式: ...

  8. (原创)C++11改进我们的程序之简化我们的程序(三)

    这次要讲的是:C++11如何通过auto.decltype和返回值后置来简化我们的程序. auto和c#中的var类似,都是在初始化时自动推断出数据类型.当某个变量的返回值难于书写时,或者不太确定返回 ...

  9. Windows下断言的类型及实现

    一.内容综述 本文主要介绍Windows下断言assert的实现,并总结断言的不同应用准则.最后给出一个windows自定义断言的方法. 本文行文参考<Debugging Windows Pro ...

  10. Leetcode: Remove Duplicates from Sorted List II 解题报告

    Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...