【转】Windows 7 API Internet Connection Sharing(ICS) 与 Wireless Hosted Network构建本地AP
原文: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的更多相关文章
- 解决 internet connection sharing 启动不了
1.确认Windows Firewall服务是否启动(有异常可参考下面) a.打开注册表,找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ ...
- internet connection sharing has been disabled by the network administrator
Start > Run > gpedit.msc Locate; Computer Configuration/Administrative Templates/Network/Netwo ...
- Genymotion-Android模拟器提示"Unable to connect to the Genymotion server. Please check your Internet connection."解决方法
昨天刚装的Genymotion,昨晚还用得好好的. 今晚开机,重新打开Genymotion,却提示:"Unable to connect to the Genymotion server. ...
- Windows Automation API 3.0 Overview
https://www.codemag.com/article/0810042 While general accessibility requirements (such as font color ...
- mfc 调用Windows的API函数实现同步异步串口通信(源码)
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...
- (Delphi) Windows 32 API程序设计目录
这里所有程序均使用Delphi调用Windows 32 API方式实现,并不是使用VCL已经封装好的类实现的! (一)第一个窗口程序 01 创建第一个窗口.
- Windows录音API学习笔记(转)
源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...
- windows内核Api的学习
windows内核api就是ntoskrnl.exe导出的函数.我们能够跟调用应用层的api一样,调用内核api. 只是内核api须要注意的是.假设函数导出了.而且函数文档化(也就是能够直接在msdn ...
- C#中读写配置参数文件(利用Windows的API)
读配置文件与写配置文件的核心代码如下: [DllImport("kernel32")] // 读配置文件方法的6个参数:所在的分区(section).键值. 初始缺省值. ...
随机推荐
- x86-64整数寄存器
- NGINX宏观手记(变量|配置)
前言 任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总结.翻译.整理 ,希望你可以知道nginx不仅仅是PHP的附属品 ...
- 菜鸟学Java(十六)——Jboss简介
简介 JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器. 因为JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用它,而不用支付费用.2006年,Jboss公司 ...
- cuteftp 9 显示中文乱码
当用FTP连接空间时,中文命名的文件名会显示乱码,原来是编码设置错误.怎么修改呢? 修改方法如下: 选择. 工具--> 全局选项->传输:1. 传输方法: ASCII2. SFTP档案名称 ...
- c++11实现一个简单的lexical_cast
boost中有一个lexical_cast可以用统一的方式来做基本类型之间的转换,比如字符串到数字,数字到字符串,bool和字符串及数字之间的相互转换.boost::lexical_cast的用法比较 ...
- JAVA Zero Copy的相关知识【转】
转自:https://my.oschina.net/cloudcoder/blog/299944 摘要: java 的zero copy多在网络应用程序中使用.Java的libaries在linux和 ...
- 【delphi】Byte数组与String类型的转换
string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起 ...
- 使用BC库解密出现no such provider错误
使用BC库解密出现no such provider错误 错误提示如下: Exception in thread "main" java.security.NoSuchProvide ...
- FreeRTOS 事件标志组 ——提高篇
假设你已经看过FreeRTOS 事件标志组这篇随笔了. 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语 ...
- 【转】oracle中的游标的原理和使用详解
游标 游标的简介: 逐行处理查询结果,以编程的方式访问数据 游标的类型: 1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql. 2,显式游标:显式游标用 ...