WinCE 5.0 WIFI 无线网卡的配置和建立连接(转)

From:http://blog.csdn.net/xajhuang/archive/2008/12/02/3419512.aspx

在 Windows CE 下自带有无线网卡的配置和连接程序,可是我的系统剪裁掉了资源管理器和任务栏,导致自带的无线网卡配置程序不能再使用了,只好自力更生。

我的环境是 S3C2440 + WinCE 5.0 + VNUWCL5(威盛无线网卡)及驱动程序。使用 Automatic Configuration Functions API

一、枚举系统中可用的无线网络设备

      下面的函数可以枚举出系统中所有可用的无线网卡设备的GUID,为了简化,我选择第一块可用的无线网卡来操作      

BOOL GetFirstWirelessCard(PTCHAR pCard) 
{ if (!pCard) { return FALSE; } INTFS_KEY_TABLE IntfsTable; IntfsTable.dwNumIntfs = 0; IntfsTable.pIntfs = NULL; _tcscpy(pCard, TEXT("")); // 枚举系统中可用的无线网卡DWORD dwStatus = WZCEnumInterfaces(NULL, &IntfsTable); if (dwStatus != ERROR_SUCCESS) { RETAILMSG(DBG_MSG, (TEXT("WZCEnumInterfaces() error 0x%08X\n"),dwStatus)); return FALSE; } // 判断无线网卡的数量,可以根据无线网卡数量来枚举出所有可用的无线网卡if (!IntfsTable.dwNumIntfs) { RETAILMSG(DBG_MSG, (TEXT("System has no wireless card.\n"))); return FALSE; } _tcscpy(pCard, IntfsTable.pIntfs[0].wszGuid); LocalFree(IntfsTable.pIntfs); return TRUE; 
}

 二、获取无线网络信息

        获取到了系统可用的无线网卡后,我们就可以利用它的 GUID 号来进行进一步的操作了,首先要做的事情就是得到该无线网卡的信息以及该无线网卡扫描到的 WIFI 网关信息。

        以下函数可以获取到该无线网卡及扫描的到的无线 AP 信息

// 
// pCard: 无线网卡GUID 
// pIntf: 无线网卡配置信息结果体
// pOutFlags: 网卡配置信息掩码标志
// 
BOOL GetWirelessCardInfo(PTCHAR pCard, PINTF_ENTRY_EX pIntf, PDWORD pOutFlags) 
{ TCHAR *szWiFiCard = NULL; // 参数校验if (!pCard || !pIntf || !pOutFlags) { RETAILMSG(DBG_MSG, (TEXT("Param Error.\n"))); return FALSE; }        szWiFiCard = pCard; *pOutFlags = 0; // 初始化无线网卡信息ZeroMemory(pIntf, sizeof(INTF_ENTRY_EX)); // 设置GUID 号pIntf->wszGuid = szWiFiCard; // 查询无线网卡信息DWORD dwStatus = WZCQueryInterfaceEx(NULL, INTF_ALL, pIntf, pOutFlags); if (dwStatus != ERROR_SUCCESS) { RETAILMSG(DBG_MSG, (TEXT("WZCQueryInterfaceEx() error 0x%08X\n"), dwStatus)); return FALSE; } return TRUE; 
}

三、判断连接状态

        我们可以通过无线网卡的状态来判断当前无线网卡是否已经和无线AP建立了连接

BOOL IsAssociated(const INTF_ENTRY_EX Intf, const DWORD dwOutFlags) 
{    if (dwOutFlags & INTF_BSSID) { PRAW_DATA prdMAC = (PRAW_DATA)(&Intf.rdBSSID); // 判断BSSID 的MAC 地址是否有效来判断是否和无线AP建立了连接if (prdMAC == NULL || prdMAC->dwDataLen == 0 ||  (!prdMAC->pData[0] && !prdMAC->pData[1] && !prdMAC->pData[2] & !prdMAC->pData[3] && !prdMAC->pData[4] && !prdMAC->pData[5])) { RETAILMSG(DBG_MSG, (TEXT("(This wifi card is not associated to any)\n"))); return FALSE; } else { RETAILMSG(DBG_MSG, (TEXT("(This wifi card is associated state)\n"))); return TRUE; } } else { return FALSE; }    
}

四、获取无线AP信息

        获取了无线网卡的信息后,可以通过无线网卡枚举出当前所有可用的无线AP的SSID名称以及加密模式等等所有可用信息,一下函数可以实现该功能

void GetWirelseeListSSID(const PRAW_DATA prdBSSIDList, HWND hListCtlWnd) 
{ if (prdBSSIDList == NULL || prdBSSIDList->dwDataLen  == 0) { RETAILMSG(DBG_MSG, (TEXT("<null> entry.\n"))); } else { PWZC_802_11_CONFIG_LIST pConfigList = (PWZC_802_11_CONFIG_LIST)prdBSSIDList->pData; //RETAILMSG(DBG_MSG, (TEXT("[%d] entries.\n"), pConfigList->NumberOfItems)); uint i; // 枚举所有无线AP for (i = 0; i < pConfigList->NumberOfItems; i++) { PWZC_WLAN_CONFIG pConfig = &(pConfigList->Config[i]); RAW_DATA rdBuffer; rdBuffer.dwDataLen = pConfig->Ssid.SsidLength; rdBuffer.pData = pConfig->Ssid.Ssid; TCHAR tSsid[MAX_PATH]; // 将SSID 的ASCII 码转化成字符串PrintSSID(&rdBuffer, tSsid); if (hListCtlWnd) {                    if (ListBox_FindString(hListCtlWnd, 0, tSsid) == LB_ERR) { ListBox_AddString(hListCtlWnd, tSsid); }                } //RETAILMSG(DBG_MSG, (TEXT("\n")));  } } 
}

五、连接到指定的无线AP

// 
// pCard: 无线网卡GUID 
// pSSID: 无线AP SSID号
// bAdhoc: 是否点对点的WIFI 连接
// ulPrivacy: 加密模式(WEP/WPA....) 
// ndisMode: 认证模式(Open/Share) 
// iKeyIndex: 密钥索引(1-4) 
// pKey: 密码
// iEapType: 802.11 认证模式
// 
BOOL WirelessConnect(PTCHAR pCard, PTCHAR pSSID, BOOL bAdhoc, ULONG ulPrivacy, NDIS_802_11_AUTHENTICATION_MODE ndisMode, int iKeyIndex, PTCHAR pKey, int iEapType) 
{ BOOL bRet = FALSE; if (!pSSID) { RETAILMSG(DBG_MSG, (TEXT("Param Error.\n"))); return FALSE; } else { WZC_WLAN_CONFIG wzcConfig; ZeroMemory(&wzcConfig, sizeof(WZC_WLAN_CONFIG)); wzcConfig.Length = sizeof(WZC_WLAN_CONFIG); wzcConfig.dwCtlFlags = 0; wzcConfig.Ssid.SsidLength = _tcslen(pSSID); for (UINT i = 0; i < wzcConfig.Ssid.SsidLength; i++) { wzcConfig.Ssid.Ssid[i] = (CHAR)pSSID[i]; } if (bAdhoc) { wzcConfig.InfrastructureMode = Ndis802_11IBSS; } else { wzcConfig.InfrastructureMode = Ndis802_11Infrastructure; } wzcConfig.AuthenticationMode = ndisMode; wzcConfig.Privacy = ulPrivacy; if (pKey == NULL || _tcslen(pKey) == 0) { // 对密钥进行转换bRet = InterpretEncryptionKeyValue(wzcConfig, 0, NULL, TRUE); wzcConfig.EapolParams.dwEapType = iEapType; wzcConfig.EapolParams.dwEapFlags = EAPOL_ENABLED; wzcConfig.EapolParams.bEnable8021x  = TRUE; wzcConfig.EapolParams.dwAuthDataLen = 0; wzcConfig.EapolParams.pbAuthData = 0; } else { RETAILMSG(DBG_MSG, (TEXT("WirelessConnect iKeyIndex = %d.\n"), iKeyIndex));              bRet = InterpretEncryptionKeyValue(wzcConfig, iKeyIndex, pKey, FALSE); } // 连接到指定的无线AP,并将该AP添加到首先无线AP中AddToPreferredNetworkList(pCard, wzcConfig, pSSID);      } return bRet; 
}

六、密钥转换

        输入的密钥需要通过加密方式进行一定的转化,以下函数可以完成改功能

static void EncryptWepKMaterial(IN OUT WZC_WLAN_CONFIG* pwzcConfig) 
{ BYTE chFakeKeyMaterial[] = { 0x56, 0x09, 0x08, 0x98, 0x4D, 0x08, 0x11, 0x66, 0x42, 0x03, 0x01, 0x67, 0x66 }; for (int i = 0; i < WZCCTL_MAX_WEPK_MATERIAL; i++) pwzcConfig->KeyMaterial[i] ^= chFakeKeyMaterial[(7*i)%13]; 
} BOOL InterpretEncryptionKeyValue(IN OUT WZC_WLAN_CONFIG& wzcConfig, IN int iKeyIndex, IN PTCHAR pKey, IN BOOL bNeed8021X) 
{    if(wzcConfig.Privacy == Ndis802_11WEPEnabled) {        if(!bNeed8021X && pKey)      {            wzcConfig.KeyIndex = iKeyIndex; wzcConfig.KeyLength = _tcslen(pKey); if((wzcConfig.KeyLength == 5) || (wzcConfig.KeyLength == 13)) { for(UINT i=0; i<wzcConfig.KeyLength; i++) wzcConfig.KeyMaterial[i] = (UCHAR)pKey[i]; } else { if((pKey[0] != TEXT('0')) || (pKey[1] != TEXT('x'))) {                    RETAILMSG(DBG_MSG, (TEXT("Invalid key value.\n")));  return FALSE; } pKey += 2; wzcConfig.KeyLength = wcslen(pKey); if((wzcConfig.KeyLength != 10) && (wzcConfig.KeyLength != 26)) { RETAILMSG(DBG_MSG, (TEXT("Invalid key value.\n")));  return FALSE; } wzcConfig.KeyLength >>= 1; for(UINT i=0; i<wzcConfig.KeyLength; i++) { wzcConfig.KeyMaterial[i] = (HEX(pKey[2 * i]) << 4) | HEX(pKey[2 * i + 1]); }                    } EncryptWepKMaterial(&wzcConfig); wzcConfig.dwCtlFlags |= WZCCTL_WEPK_PRESENT; } } else if(wzcConfig.Privacy == Ndis802_11Encryption2Enabled || wzcConfig.Privacy == Ndis802_11Encryption3Enabled) {        if(!bNeed8021X)      { wzcConfig.KeyLength = wcslen(pKey); if((wzcConfig.KeyLength < 8) || (wzcConfig.KeyLength > 63)) { RETAILMSG(DBG_MSG, (TEXT("WPA-PSK/TKIP key should be 8-63 char long string.\n")));   return FALSE; } char szEncryptionKeyValue8[64]; // longest key is 63 memset(szEncryptionKeyValue8, 0, sizeof(szEncryptionKeyValue8)); WideCharToMultiByte(CP_ACP, 0, pKey, wzcConfig.KeyLength + 1, szEncryptionKeyValue8, wzcConfig.KeyLength + 1, NULL, NULL); WZCPassword2Key(&wzcConfig, szEncryptionKeyValue8); EncryptWepKMaterial(&wzcConfig); wzcConfig.dwCtlFlags |= WZCCTL_WEPK_XFORMAT | WZCCTL_WEPK_PRESENT | WZCCTL_ONEX_ENABLED; } wzcConfig.EapolParams.dwEapFlags = EAPOL_ENABLED; wzcConfig.EapolParams.dwEapType = DEFAULT_EAP_TYPE; wzcConfig.EapolParams.bEnable8021x = TRUE; wzcConfig.WPAMCastCipher = Ndis802_11Encryption2Enabled; } return TRUE; 
}

      通过以上操作,完全可以连接到可用的无线AP了,再加上些适当的UI程序,完全可以用来替代 Windows CE 自带的无线配置程序了,我再连接中放置了一个简单的而完整的测试程序,相信大家看了以后都知道怎么操作无线网卡了

http://download.csdn.net/source/927575

转载于:https://www.cnblogs.com/mugua/archive/2009/12/24/1631531.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Qt所有的类

转自&#xff1a;Qt所有的类 - IT观察者 - 博客园 QAccel处理键盘加速器和快捷键Handles keyboard accelerator and shortcut keysQAccessibleEnums与可达性的静态函数Enums and static functions relating to accessibilityQAccessibleInterface定义一个接口&#xff0c;该接…

异步调用与多线程

异步调用并不是要减少线程的开销, 它的主要目的是让调用方法的主线程不需要同步等待在这个函数调用上, 从而可以让主线程继续执行它下面的代码.与此同时, 系统会通过从ThreadPool中取一个线程来执行,帮助我们将我们要写/读的数据发送到网卡.由于不需要我们等待, 我们等于同时做…

【转】DPDK(一):专业术语

转自&#xff1a;DPDK&#xff08;一&#xff09;&#xff1a;专业术语 - 小蚂蚁_CYJ - 博客园 一&#xff1a;简介 1、术语 EAL&#xff1a;Environment Abstraction Layer LPM&#xff1a;Longest Prefix Match IOVA-contiguous&#xff1a; VFIO&#xff1a;VFIO是一个可以…

wince2秒快速启动TOC分析

为什么29M的wince内核nk.nb0文件在2秒钟就能快速启动&#xff0c;如果你用汇编设计一个从NAND单纯拷贝29M nk.nb0的快速程序&#xff0c;你会发现用200MFCLK的2410或者用400MFCLK的2440都至少需要十几秒&#xff0c;那为什么ce能够启动这么快呢&#xff0c;有什么加速算法吗&am…

插座上的Linux充电器.不..Marvell Plug Computer

一直以来&#xff0c;台式机都有变小的趋势&#xff0c;于是变成了一体机&#xff0c;主机也有变小的趋势&#xff0c;那样可以占用更小的空间&#xff0c;却提供一样的功 能&#xff0c;Marvell Plug Computer 3.0 同样是那种壁插式主机&#xff0c;身形小巧&#xff0c;能够直…

【转】tftp命令详解

转自&#xff1a;tftp命令详解 - 张大猛 - 博客园 介绍一个 FTP客户端-IIS7服务器管理工具 作为FTP客户端&#xff0c;它支持批量管理ftp站点。定时上传和定时下载&#xff0c;定时备份&#xff0c;且操作简洁。同时iis7服务器管理工具还是vnc客户端。并且支持批量管理管理…

对Multi-bin 技术的理解

[bin文件的格式]&#xff1a; Bin文件格式比较简单.结构如下&#xff1a; struct BinFile { BYTE signature[7]; //前面7个字节是标志, 固定的{‘B’,‘0’,‘0’,‘0’,‘F’,‘F’,‘\a’}. DWORD ImageStart; //Image Start表示image的开始地址 DWORD ImageLength; …

关于C#程序调用AMFPHP服务的问题!!

我想实现的功能是实现一个c# winform客户端&#xff08;web也行&#xff09;&#xff0c;与php服务器以amf3格式通信&#xff0c;其实就是模拟flex与php通信的机制&#xff0c;这方面资料真的太少了&#xff0c;不知道该怎么实现&#xff0c;求帮助&#xff0c;谢谢&#xff01…

【转】总结_C++日志系统log4cxx使用

转自&#xff1a;总结_C日志系统log4cxx使用_OneByOne-CSDN博客_log4cxx C日志系统log4cxx使用总结 参考连接: log4CXX第二篇---配置文件&#xff08;properties文件&#xff09;详解_crazyhacking的专栏-CSDN博客 C日志系统log4cxx使用总结_邵明_新浪博客 一、log4cxx组件…

S3c2440A平台HIVE注册表+binfs的实现

我的例子是基于samsung S3C2440A&#xff0b;samsung ONENANDWinCE5.0的&#xff0c;开发平台是platform builder 5.0&#xff0c;首先我们基于RAM register的image已经可以正常跑起来了&#xff0c;Flash除了放置image外其他的空间为用户提供文件系统&#xff0c;这部分的驱动…

DHT

DHT 类似Tracker的根据种子特征码返回种子信息的网络.DHT全称叫分布式哈希表(Distributed Hash Table)&#xff0c;是一种分布式存储方法。在不需要服务器的情况下&#xff0c;每个客户端负责一个小范围的路由&#xff0c;并负责存储一小部分数据&#xff0c;从而实现整个DHT网…

【转】日志记录库(log4cxx)使用指南

转自&#xff1a;日志记录库&#xff08;log4cxx&#xff09;使用指南_外环西路-CSDN博客 一、Log4j、log4cxx简介 Log4j、log4cxx有三个主要的组件&#xff1a; Loggers(记录器)&#xff0c;Appenders (输出源)和Layouts(布局)。Loggers(记录器)&#xff1a; 负责执行记录日…

WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(11)-BINFS在Nand上的实现(Multi-Bin的实现)

之前我们都是把整个系统镜像复制到RAM中运行,这样启动时间较慢,也占用内存.使用Multi-Bin的模式,将需要复制到RAM的组件和可存放在存储设备(如Nand)中的组件分开,系统启动时只需要将CE核心组件复制到内存中运行,然后需要的组件从Nand中读取即可.之前我们已经在eboot中添加了操作…

C# 数据库连接字符串集合

c#数据库连接字符串集合(一)常用连接:1.使用SqlConnection对象: a. Sql 验证public void SqlConnectionOpen(){SqlConnection conn new SqlConnection();conn.ConnectionString "user idsa;password;initial catalognorthwind;datasourcelocalhost;connect Timeout20&quo…

【转】聊聊Linux操作系统中的显示管理器及如何更换

转自&#xff1a;聊聊Linux操作系统中的显示管理器及如何更换 - linux-123 - 博客园 聊聊Linux操作系统中的显示管理器及如何更换 | 《Linux就该这么学》 什么是 Linux 中的显示管理器&#xff1f; 简单来说&#xff0c;显示管理器display manager&#xff08;DM&#xff09…

winCE改变字库方法(WINCE字库更新)

更新系统字库&#xff1a;例如要在WinCE5.0加入微软雅黑字体的支持。 第一步&#xff1a;增加如下注册表 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontPath] "FontPath""// Windows " ; 字库文件所在目录 [HKEY_LOCAL_MACHINE/SYSTEM/GDI] "Fon…

【转】[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx

转自&#xff1a;[WSL2]WSL2迁移虚拟磁盘文件ext4.vhdx_Ryan ZHENG的专栏-CSDN博客 WSL2本质上是一个虚拟机&#xff0c;因此必然存在磁盘镜像文件。 默认情况下&#xff0c;这个镜像文件会放在C盘&#xff08;参考官网举例&#xff1a;%LOCALAPPDATA%\Packages<PackageFa…

WINCE字体动态加载

1. 加载字体 if (NULL ! AddFontResource(SDBOOTDisk\\FZY3JW.ttf)) ::SendMessage( HWND_BROADCAST, WM_FONTCHANGE, 0, 0); else AfxMessageBox(L"加载方正准圆简体字体失败!"); 2.创建字体并设置控件字体 CFont hFontNew&#xff1b; LOGFONT lf; …

ckedit 3.0 配置(一)

个人喜欢使用config.js的方式来使用&#xff0c;下面以此为例&#xff0c;介绍其配置参数。&#xff08;所示为默认值&#xff09;//当提交包含有此编辑器的表单时&#xff0c;是否自动更新元素内的数据config.autoUpdateElement true //编辑器的z-index值 config.baseFloatZI…

【转】Ubuntu中SVN客户端安装+使用

转自&#xff1a;Ubuntu中SVN客户端安装使用_三少GG-CSDN博客 1、 安装 svn客户端&#xff1a; apt-get install subversion&#xff0c;然后根据提示一步一步&#xff0c;就完成了 svn的安装。当然&#xff0c;也可以源码安装 svn&#xff0c;下载 subversion 一个最新版本的源…