• <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 無線網卡的配置和建立連接(轉)

            在 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

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

            導航

            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久这里的只有是精品23| 久久天天躁夜夜躁狠狠| 一本色道久久99一综合| 怡红院日本一道日本久久 | 亚洲国产精品一区二区久久| 日韩人妻无码一区二区三区久久 | 思思久久精品在热线热| 亚洲va久久久噜噜噜久久天堂| 国产精品视频久久| 一级女性全黄久久生活片免费 | 久久这里只有精品久久| 亚洲精品综合久久| 久久国产精品99精品国产987| 四虎久久影院| 久久这里只有精品久久| 77777亚洲午夜久久多喷| 亚洲精品国产成人99久久| 亚洲午夜久久久久久久久久| 国产精品va久久久久久久| 久久这里只有精品18| 久久中文字幕人妻熟av女| 久久996热精品xxxx| 狠狠色丁香婷综合久久| 久久久久久久久久久| 日韩中文久久| 国产亚洲精午夜久久久久久| 成人久久精品一区二区三区| 波多野结衣久久精品| 日产久久强奸免费的看| 久久www免费人成精品香蕉| 97热久久免费频精品99| 久久亚洲精品人成综合网| 久久久www免费人成精品| 伊人久久成人成综合网222| 久久噜噜久久久精品66| 国产精品久久久天天影视香蕉| 久久精品麻豆日日躁夜夜躁| 无码精品久久久久久人妻中字| 麻豆一区二区99久久久久| 天天爽天天狠久久久综合麻豆| 久久国产精品99国产精|