• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            WinCE 5.0 WIFI 無線網(wǎng)卡的配置和建立連接(轉(zhuǎn))

            在 Windows CE 下自帶有無線網(wǎng)卡的配置和連接程序,可是我的系統(tǒng)剪裁掉了資源管理器和任務(wù)欄,導致自帶的無線網(wǎng)卡配置程序不能再使用了,只好自力更生。

            我的環(huán)境是 S3C2440 + WinCE 5.0 + VNUWCL5(威盛無線網(wǎng)卡)及驅(qū)動程序。使用 Automatic Configuration Functions API

            一、枚舉系統(tǒng)中可用的無線網(wǎng)絡(luò)設(shè)備

                  下面的函數(shù)可以枚舉出系統(tǒng)中所有可用的無線網(wǎng)卡設(shè)備的GUID,為了簡化,我選擇第一塊可用的無線網(wǎng)卡來操作      

            BOOL GetFirstWirelessCard(PTCHAR pCard)
            {
            if (!pCard)
            {
            return FALSE;
            }
            INTFS_KEY_TABLE IntfsTable;
            IntfsTable.dwNumIntfs = 0;
            IntfsTable.pIntfs = NULL;
            _tcscpy(pCard, TEXT(""));
            // 枚舉系統(tǒng)中可用的無線網(wǎng)卡
            DWORD dwStatus = WZCEnumInterfaces(NULL, &IntfsTable);
            if (dwStatus != ERROR_SUCCESS)
            {
            RETAILMSG(DBG_MSG, (TEXT("WZCEnumInterfaces() error 0x%08X\n"),dwStatus));
            return FALSE;
            }
            // 判斷無線網(wǎng)卡的數(shù)量,可以根據(jù)無線網(wǎng)卡數(shù)量來枚舉出所有可用的無線網(wǎng)卡
            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;
            }

             二、獲取無線網(wǎng)絡(luò)信息

                    獲取到了系統(tǒng)可用的無線網(wǎng)卡后,我們就可以利用它的 GUID 號來進行進一步的操作了,首先要做的事情就是得到該無線網(wǎng)卡的信息以及該無線網(wǎng)卡掃描到的 WIFI 網(wǎng)關(guān)信息。

                    以下函數(shù)可以獲取到該無線網(wǎng)卡及掃描的到的無線 AP 信息

            //////////////////////////////////////////////////////////////////////////
            // pCard: 無線網(wǎng)卡GUID
            // pIntf: 無線網(wǎng)卡配置信息結(jié)果體
            // pOutFlags: 網(wǎng)卡配置信息掩碼標志
            //////////////////////////////////////////////////////////////////////////
            BOOL GetWirelessCardInfo(PTCHAR pCard, PINTF_ENTRY_EX pIntf, PDWORD pOutFlags)
            {
            TCHAR *szWiFiCard = NULL;
            // 參數(shù)校驗
            if (!pCard || !pIntf || !pOutFlags)
            {
            RETAILMSG(DBG_MSG, (TEXT("Param Error.\n")));
            return FALSE;
            }
            szWiFiCard = pCard;
            *pOutFlags = 0;
            // 初始化無線網(wǎng)卡信息
            ZeroMemory(pIntf, sizeof(INTF_ENTRY_EX));
            // 設(shè)置GUID 號
            pIntf->wszGuid = szWiFiCard;
            // 查詢無線網(wǎng)卡信息
            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;
            }

            三、判斷連接狀態(tài)

                    我們可以通過無線網(wǎng)卡的狀態(tài)來判斷當前無線網(wǎng)卡是否已經(jīng)和無線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信息

                    獲取了無線網(wǎng)卡的信息后,可以通過無線網(wǎng)卡枚舉出當前所有可用的無線AP的SSID名稱以及加密模式等等所有可用信息,一下函數(shù)可以實現(xiàn)該功能

            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 碼轉(zhuǎn)化成字符串
            PrintSSID(&rdBuffer, tSsid);
            if (hListCtlWnd)
            {
            if (ListBox_FindString(hListCtlWnd, 0, tSsid) == LB_ERR)
            {
            ListBox_AddString(hListCtlWnd, tSsid);
            }
            }
            //RETAILMSG(DBG_MSG, (TEXT("\n")));
            }
            }
            }

            五、連接到指定的無線AP

            //////////////////////////////////////////////////////////////////////////
            // pCard: 無線網(wǎng)卡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)
            {
            // 對密鑰進行轉(zhuǎn)換
            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;
            }

            六、密鑰轉(zhuǎn)換

                    輸入的密鑰需要通過加密方式進行一定的轉(zhuǎn)化,以下函數(shù)可以完成改功能

            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了,再加上些適當?shù)腢I程序,完全可以用來替代 Windows CE 自帶的無線配置程序了,我再連接中放置了一個簡單的而完整的測試程序,相信大家看了以后都知道怎么操作無線網(wǎng)卡了

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

            posted on 2010-12-16 09:31 wrh 閱讀(1662) 評論(0)  編輯 收藏 引用

            導航

            <2010年12月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統(tǒng)計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            精品无码久久久久国产动漫3d| 丁香狠狠色婷婷久久综合| 久久精品亚洲乱码伦伦中文| 中文字幕无码久久人妻| 99久久精品免费看国产一区二区三区| 色妞色综合久久夜夜| 欧美丰满熟妇BBB久久久| 国产激情久久久久影院小草| 亚洲va久久久久| 99久久精品午夜一区二区| 久久人妻少妇嫩草AV蜜桃| 久久综合九色综合网站| 久久精品国产亚洲7777| 久久精品国产亚洲av麻豆小说| 精品久久人人妻人人做精品| 久久国产精品无码HDAV| 久久久黄色大片| 久久久久久av无码免费看大片| 国产91久久精品一区二区| 久久久久se色偷偷亚洲精品av| 精品久久久久国产免费| 久久青青草原国产精品免费| 久久婷婷五月综合97色一本一本| 一级a性色生活片久久无少妇一级婬片免费放| 久久精品亚洲中文字幕无码麻豆| 国产精品久久久久久久久软件| 久久综合伊人77777| 久久久久无码专区亚洲av| 日韩一区二区久久久久久| 99久久精品国内| 97久久香蕉国产线看观看| 久久精品亚洲一区二区三区浴池 | 久久精品国产国产精品四凭| 高清免费久久午夜精品| 久久婷婷国产综合精品 | 久久精品毛片免费观看| 色欲av伊人久久大香线蕉影院 | 99久久综合狠狠综合久久止| 久久精品国产亚洲欧美| 国内精品免费久久影院| 久久亚洲国产成人精品无码区|