BOOLEAN WscGetXmlKeyIndex( IN STRING *pXmlData, OUT UCHAR *pKeyIndex) { STRING *ptr, *pBuffer = pXmlData; *pKeyIndex = 1; ptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_INDEX_START); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlKeyIndex: missing %s\n", XML_KEY_INDEX_START)); return FALSE; } pBuffer = ptr + strlen(XML_KEY_INDEX_START); ptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_INDEX_END); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlKeyIndex: missing %s\n", XML_KEY_INDEX_END)); return FALSE; } *pKeyIndex = *(--ptr) - 0x30; return TRUE; }
BOOLEAN WscPassXmlDeclare( INOUT STRING **pXmlData) { STRING *ptr; DBGPRINT(RT_DEBUG_TRACE, ("======> WscPassXmlDeclare\n")); ptr = rtstrstr(*pXmlData, (PSTRING)XML_DECLARE_START); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscPassXmlDeclare: missing XML Declare <?xml\n")); return FALSE; } ptr = rtstrstr(*pXmlData, (PSTRING)XML_DECLARE_END); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("XML syntax error: missing XML Declare ?>\n")); return FALSE; } (*pXmlData) = ptr + strlen(XML_DECLARE_END); DBGPRINT(RT_DEBUG_TRACE, ("<====== WscPassXmlDeclare\n")); return TRUE; }
BOOLEAN WscGetXmlKey( IN STRING *pXmlData, OUT UCHAR *pKey, OUT USHORT *pKeyLen) { STRING *ptr, *pBuffer = pXmlData; UINT KeyLen = 0; ptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_START); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlKey: missing %s\n", XML_KEY_START)); return FALSE; } pBuffer = ptr + strlen(XML_KEY_START); ptr = rtstrstr(pBuffer, ">"); if (ptr) { pBuffer = ptr + 1; } ptr = rtstrstr(pBuffer, (PSTRING)XML_KEY_END); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlKey: missing %s\n", XML_KEY_END)); return FALSE; } KeyLen = (UINT)(ptr - pBuffer); if ((KeyLen >= 8) && (KeyLen <= 64)) { RTMPMoveMemory(pKey, pBuffer, KeyLen); *pKeyLen = KeyLen; } else { return FALSE; } return TRUE; }
BOOLEAN WscGetXmlEncr( IN STRING *pXmlData, OUT USHORT *pEncrType) { STRING *ptr, *pBuffer = pXmlData; STRING EncrStr[10] = {0}; UINT EncrStrLen = 0; *pEncrType = 0; ptr = rtstrstr(pBuffer, (PSTRING)XML_ENCR_START); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlEncr: missing %s\n", XML_ENCR_START)); return FALSE; } pBuffer = ptr + strlen(XML_ENCR_START); ptr = rtstrstr(pBuffer, (PSTRING)XML_ENCR_END); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlEncr: missing %s\n", XML_ENCR_END)); return FALSE; } EncrStrLen = (UINT)(ptr - pBuffer); if ((EncrStrLen > 0) && (EncrStrLen <= 10)) { RTMPMoveMemory(EncrStr, pBuffer, EncrStrLen); for (PWSC_UFD_ENCR_TYPE = WSC_UFD_ENCR_TYPE; PWSC_UFD_ENCR_TYPE->encr_str; PWSC_UFD_ENCR_TYPE++) { if (strcmp(EncrStr, PWSC_UFD_ENCR_TYPE->encr_str) == 0) { *pEncrType = PWSC_UFD_ENCR_TYPE->encr_type; return TRUE; } } } return FALSE; }
BOOLEAN WscGetXmlAuth( IN STRING *pXmlData, OUT USHORT *pAuthType) { STRING *ptr, *pBuffer = pXmlData; STRING AuthStr[10] = {0}; UINT AuthStrLen = 0; *pAuthType = 0; ptr = rtstrstr(pBuffer, (PSTRING)XML_AUTH_START); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlAuth: missing %s\n", XML_AUTH_START)); return FALSE; } pBuffer = ptr + strlen(XML_AUTH_START); ptr = rtstrstr(pBuffer, (PSTRING)XML_AUTH_END); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlAuth: missing %s\n", XML_AUTH_END)); return FALSE; } AuthStrLen = (UINT)(ptr - pBuffer); if ((AuthStrLen > 0) && (AuthStrLen <= 10)) { RTMPMoveMemory(AuthStr, pBuffer, AuthStrLen); for (PWSC_UFD_AUTH_TYPE = WSC_UFD_AUTH_TYPE; PWSC_UFD_AUTH_TYPE->auth_str; PWSC_UFD_AUTH_TYPE++) { if (strcmp(AuthStr, PWSC_UFD_AUTH_TYPE->auth_str) == 0) { *pAuthType = PWSC_UFD_AUTH_TYPE->auth_type; return TRUE; } } } return FALSE; }
BOOLEAN WscGetXmlSSID( IN STRING *pXmlData, OUT NDIS_802_11_SSID *pSsid) { STRING *ptr, *pBuffer = pXmlData; ptr = rtstrstr(pBuffer, (PSTRING)XML_SSID_START); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlSSID: missing <ssid\n")); return FALSE; } pBuffer = ptr + strlen(XML_SSID_START); ptr = rtstrstr(pBuffer, ">"); if (ptr) { pBuffer = ptr + 1; } ptr = rtstrstr(pBuffer, (PSTRING)XML_SSID_END); if (ptr == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("WscGetXmlSSID: missing </ssid>\n")); return FALSE; } pSsid->SsidLength = (UINT)(ptr - pBuffer); RTMPZeroMemory(pSsid->Ssid, NDIS_802_11_LENGTH_SSID); if ((pSsid->SsidLength > 0) && (pSsid->SsidLength < 33)) { RTMPMoveMemory(pSsid->Ssid, pBuffer, pSsid->SsidLength); } else { pSsid->SsidLength = 0; return FALSE; } return TRUE; }
static void WriteConfToDatFile( IN PRTMP_ADAPTER pAd) { char *cfgData = 0; PSTRING fileName = NULL; RTMP_OS_FD file_r, file_w; RTMP_OS_FS_INFO osFSInfo; LONG rv, fileLen = 0; char *offset = 0; PSTRING pTempStr = 0; // INT tempStrLen = 0; DBGPRINT(RT_DEBUG_TRACE, ("-----> WriteConfToDatFile\n")); fileName = STA_PROFILE_PATH; RtmpOSFSInfoChange(&osFSInfo, TRUE); file_r = RtmpOSFileOpen(fileName, O_RDONLY, 0); if (IS_FILE_OPEN_ERR(file_r)) { DBGPRINT(RT_DEBUG_TRACE, ("-->1) %s: Error opening file %s\n", __FUNCTION__, fileName)); return; } else { char tempStr[64] = {0}; while((rv = RtmpOSFileRead(file_r, tempStr, 64)) > 0) { fileLen += rv; } os_alloc_mem(NULL, (UCHAR **)&cfgData, fileLen); if (cfgData == NULL) { RtmpOSFileClose(file_r); DBGPRINT(RT_DEBUG_TRACE, ("CfgData kmalloc fail. (fileLen = %ld)\n", fileLen)); goto out; } NdisZeroMemory(cfgData, fileLen); RtmpOSFileSeek(file_r, 0); rv = RtmpOSFileRead(file_r, (PSTRING)cfgData, fileLen); RtmpOSFileClose(file_r); if (rv != fileLen) { DBGPRINT(RT_DEBUG_TRACE, ("CfgData kmalloc fail, fileLen = %ld\n", fileLen)); goto ReadErr; } } file_w = RtmpOSFileOpen(fileName, O_WRONLY|O_TRUNC, 0); if (IS_FILE_OPEN_ERR(file_w)) { goto WriteFileOpenErr; } else { offset = (PCHAR) rtstrstr((PSTRING) cfgData, "Default\n"); offset += strlen("Default\n"); RtmpOSFileWrite(file_w, (PSTRING)cfgData, (int)(offset-cfgData)); os_alloc_mem(NULL, (UCHAR **)&pTempStr, 512); if (!pTempStr) { DBGPRINT(RT_DEBUG_TRACE, ("pTempStr kmalloc fail. (512)\n")); RtmpOSFileClose(file_w); goto WriteErr; } for (;;) { int i = 0; PSTRING ptr; NdisZeroMemory(pTempStr, 512); ptr = (PSTRING) offset; while(*ptr && *ptr != '\n') { pTempStr[i++] = *ptr++; } pTempStr[i] = 0x00; if ((size_t)(offset - cfgData) < fileLen) { offset += strlen(pTempStr) + 1; if (strncmp(pTempStr, "SSID=", strlen("SSID=")) == 0) { NdisZeroMemory(pTempStr, 512); NdisMoveMemory(pTempStr, "SSID=", strlen("SSID=")); NdisMoveMemory(pTempStr + 5, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen); } else if (strncmp(pTempStr, "AuthMode=", strlen("AuthMode=")) == 0) { NdisZeroMemory(pTempStr, 512); if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeOpen) sprintf(pTempStr, "AuthMode=OPEN"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) sprintf(pTempStr, "AuthMode=SHARED"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch) sprintf(pTempStr, "AuthMode=WEPAUTO"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) sprintf(pTempStr, "AuthMode=WPAPSK"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) sprintf(pTempStr, "AuthMode=WPA2PSK"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) sprintf(pTempStr, "AuthMode=WPA"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) sprintf(pTempStr, "AuthMode=WPA2"); else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) sprintf(pTempStr, "AuthMode=WPANONE"); } else if (strncmp(pTempStr, "EncrypType=", strlen("EncrypType=")) == 0) { NdisZeroMemory(pTempStr, 512); if (pAd->StaCfg.WepStatus == Ndis802_11WEPDisabled) sprintf(pTempStr, "EncrypType=NONE"); else if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) sprintf(pTempStr, "EncrypType=WEP"); else if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) sprintf(pTempStr, "EncrypType=TKIP"); else if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) sprintf(pTempStr, "EncrypType=AES"); } RtmpOSFileWrite(file_w, pTempStr, strlen(pTempStr)); RtmpOSFileWrite(file_w, "\n", 1); } else { break; } } RtmpOSFileClose(file_w); } WriteErr: if (pTempStr) /* kfree(pTempStr); */ os_free_mem(NULL, pTempStr); ReadErr: WriteFileOpenErr: if (cfgData) /* kfree(cfgData); */ os_free_mem(NULL, cfgData); out: RtmpOSFSInfoChange(&osFSInfo, FALSE); DBGPRINT(RT_DEBUG_TRACE, ("<----- WriteConfToDatFile\n")); return; }
BOOLEAN WscWriteProfileToUfdFile( IN PRTMP_ADAPTER pAd, IN UCHAR ApIdx, IN PSTRING pUfdFileName) { PWSC_CTRL pWscControl = &pAd->ApCfg.MBSSID[ApIdx].WscControl; PWSC_CREDENTIAL pCredential = &pWscControl->WscProfile.Profile[0]; RTMP_OS_FS_INFO osFSInfo; RTMP_OS_FD file_w; PSTRING offset, pXmlTemplate = (PSTRING)XML_TEMPLATE; BOOLEAN bFound = FALSE, bRtn = TRUE; UCHAR Guid[UUID_LEN_HEX]; UCHAR Guid_Str[UUID_LEN_STR]; if (pUfdFileName == NULL) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: pUfdFileName is NULL\n", __FUNCTION__)); return FALSE; } RtmpOSFSInfoChange(&osFSInfo, TRUE); file_w = RtmpOSFileOpen(pUfdFileName, O_WRONLY|O_TRUNC|O_CREAT, 0); if (IS_FILE_OPEN_ERR(file_w)) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: Error opening file %s\n", __FUNCTION__, pUfdFileName)); return FALSE; } else { WscCreateProfileFromCfg(pAd, AP_MODE, pWscControl, &pWscControl->WscProfile); WscGenerateUUID(pAd, &Guid[0], &Guid_Str[0], ApIdx, TRUE); if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_GUID_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)&Guid_Str[0], (int)UUID_LEN_STR); pXmlTemplate = offset + strlen(XML_GUID_MARK); } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_AP_GUID_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)&pWscControl->Wsc_Uuid_Str[0], (int)UUID_LEN_STR); pXmlTemplate = offset + strlen(XML_AP_GUID_MARK); } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_SSID_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)&pCredential->SSID.Ssid[0], (int)pCredential->SSID.SsidLength); pXmlTemplate = offset + strlen(XML_SSID_MARK); } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_AUTH_MARK)) != NULL) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); for (PWSC_UFD_AUTH_TYPE = WSC_UFD_AUTH_TYPE; PWSC_UFD_AUTH_TYPE->auth_str; PWSC_UFD_AUTH_TYPE++) { if (PWSC_UFD_AUTH_TYPE->auth_type == pCredential->AuthType) { RtmpOSFileWrite(file_w, (PSTRING)PWSC_UFD_AUTH_TYPE->auth_str, (int)strlen(PWSC_UFD_AUTH_TYPE->auth_str)); bFound = TRUE; break; } } pXmlTemplate = offset + strlen(XML_AUTH_MARK); if (bFound == FALSE) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: Unknow Auth Type(=%x)\n", __FUNCTION__, pCredential->AuthType)); bRtn = FALSE; goto out; } } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_ENCR_MARK)) != NULL) { bFound = FALSE; RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); for (PWSC_UFD_ENCR_TYPE = WSC_UFD_ENCR_TYPE; PWSC_UFD_ENCR_TYPE->encr_str; PWSC_UFD_ENCR_TYPE++) { if (PWSC_UFD_ENCR_TYPE->encr_type == pCredential->EncrType) { RtmpOSFileWrite(file_w, (PSTRING)PWSC_UFD_ENCR_TYPE->encr_str, (int)strlen(PWSC_UFD_ENCR_TYPE->encr_str)); bFound = TRUE; } } pXmlTemplate = offset + strlen(XML_ENCR_MARK); if (bFound == FALSE) { DBGPRINT(RT_DEBUG_TRACE, ("--> %s: Unknow Encr Type(=%x)\n", __FUNCTION__, pCredential->EncrType)); bRtn = FALSE; goto out; } } if ((offset = rtstrstr(pXmlTemplate, (PSTRING)XML_KEY_MARK)) != NULL) { if (pCredential->EncrType != WSC_ENCRTYPE_NONE) { RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)(offset - pXmlTemplate)); RtmpOSFileWrite(file_w, (PSTRING)pCredential->Key, (int)pCredential->KeyLength); pXmlTemplate = offset + strlen(XML_KEY_MARK); } else { RtmpOSFileWrite(file_w, (PSTRING)XML_ENCR_END, (int)strlen(XML_ENCR_END)); RtmpOSFileWrite(file_w, (PSTRING)"\n", (int)1); pXmlTemplate = offset + strlen(XML_KEY_MARK) + strlen(XML_KEY_END) + 1; /* 1: '\n' */ } } RtmpOSFileWrite(file_w, (PSTRING)pXmlTemplate, (int)strlen(pXmlTemplate)); } out: RtmpOSFileClose(file_w); RtmpOSFSInfoChange(&osFSInfo, FALSE); return bRtn; }