/*++ Copyright (c) 2001, Microsoft Corporation Module Name: elpolicy.c Abstract: The module deals with functions related to managing group policy settings Revision History: sachins, November 14 2001, Created --*/ #include "pcheapol.h" #pragma hdrstop VOID ElPrintPolicyList ( EAPOL_POLICY_LIST *pEAPOLPolicyList ) { EAPOL_POLICY_DATA *Tmp = NULL; DWORD i = 0; if (pEAPOLPolicyList == NULL) { EapolTrace ("ElPrintPolicyList: pEAPOLPolicyList is NULL"); return; } for (i=0; idwNumberOfItems;i++) { Tmp = &pEAPOLPolicyList->EAPOLPolicy[i]; EapolTrace ("Policy [%ld]:\n \ SSID [%s]\n \ Enable-802.1x [%ld]\n \ dw8021xMode [%ld]\n \ dwEapType [%ld]\n \ dwEAPDataLen [%ld]\n \ dwMachineAuthentication [%ld]\n \ dwMachineAuthenticationType [%ld]\n \ dwGuestAuthentication [%ld]\n \ dwIEEE8021xMaxStart [%ld]\n \ dwIEEE8021xStartPeriod [%ld]\n \ dwIEEE8021xAuthPeriod [%ld]\n \ dwIEEE8021xHeldPeriod [%ld]\n \ ", i, (PCHAR)Tmp->pbWirelessSSID, Tmp->dwEnable8021x, Tmp->dw8021xMode, Tmp->dwEAPType, Tmp->dwEAPDataLen, Tmp->dwMachineAuthentication, Tmp->dwMachineAuthenticationType, Tmp->dwGuestAuthentication, Tmp->dwIEEE8021xMaxStart, Tmp->dwIEEE8021xStartPeriod, Tmp->dwIEEE8021xAuthPeriod, Tmp->dwIEEE8021xHeldPeriod ); EapolTrace ("===================="); } return; } DWORD ElCopyPolicyList ( IN PEAPOL_POLICY_LIST pInList, OUT PEAPOL_POLICY_LIST *ppOutList ) { PEAPOL_POLICY_LIST pOutList = NULL; PEAPOL_POLICY_DATA pDataIn = NULL, pDataOut = NULL; DWORD i = 0; DWORD dwRetCode = NO_ERROR; do { pOutList = MALLOC(sizeof(EAPOL_POLICY_LIST)+ pInList->dwNumberOfItems*sizeof(EAPOL_POLICY_DATA)); if (pOutList == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } pOutList->dwNumberOfItems = pInList->dwNumberOfItems; for (i=0; idwNumberOfItems; i++) { pDataIn = &(pInList->EAPOLPolicy[i]); pDataOut = &(pOutList->EAPOLPolicy[i]); memcpy (pDataOut, pDataIn, sizeof(EAPOL_POLICY_DATA)); pDataOut->pbEAPData = NULL; pDataOut->dwEAPDataLen = 0; if (pDataIn->dwEAPDataLen) { if ((pDataOut->pbEAPData = MALLOC (pDataIn->dwEAPDataLen)) == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } memcpy (pDataOut->pbEAPData, pDataIn->pbEAPData, pDataIn->dwEAPDataLen); } pDataOut->dwEAPDataLen = pDataIn->dwEAPDataLen; } if (dwRetCode != NO_ERROR) { break; } } while (FALSE); if (dwRetCode != NO_ERROR) { if (pOutList != NULL) { ElFreePolicyList (pOutList); pOutList = NULL; } } *ppOutList = pOutList; return dwRetCode; } VOID ElFreePolicyList ( IN PEAPOL_POLICY_LIST pEAPOLList ) { DWORD dwIndex = 0; PEAPOL_POLICY_DATA pEAPOLData = NULL; if (pEAPOLList) { for (dwIndex = 0; dwIndex < pEAPOLList->dwNumberOfItems; dwIndex++) { pEAPOLData = &(pEAPOLList->EAPOLPolicy[dwIndex]); if (pEAPOLData->pbEAPData) { FREE (pEAPOLData->pbEAPData); } } FREE (pEAPOLList); } return; } BOOLEAN ElIsEqualEAPOLPolicyData ( IN PEAPOL_POLICY_DATA pData1, IN PEAPOL_POLICY_DATA pData2 ) { BOOLEAN fEqual = FALSE; DWORD dwStaticStructLen = 0; DWORD dwRetCode = NO_ERROR; do { dwStaticStructLen = FIELD_OFFSET (EAPOL_POLICY_DATA, dwEAPDataLen); if (memcmp ((PVOID)pData1, (PVOID)pData2, dwStaticStructLen) == 0) { if (pData1->dwEAPDataLen == pData2->dwEAPDataLen) { if (memcmp (pData1->pbEAPData, pData2->pbEAPData, pData1->dwEAPDataLen) == 0) { fEqual = TRUE; } } } } while (FALSE); return fEqual; } // // ElPolicyChange // // Description: // // Arguments: // pPCB - Current interface context // // Return values: // NO_ERROR - success // Other - error // DWORD ElPolicyChange ( IN EAPOL_POLICY_LIST *pEAPOLPolicyList ) { BYTE *pbData = NULL; DWORD dwEventStatus = 0; BOOLEAN fDecrWorkerThreadCount = FALSE; DWORD dwSizeOfList = 0; EAPOL_POLICY_LIST *pLocalPolicyList = NULL; DWORD dwRetCode = NO_ERROR; do { TRACE0 (ANY, "ElPolicyChange: Entered"); if (g_hEventTerminateEAPOL == NULL) { dwRetCode = ERROR_INVALID_STATE; break; } if (( dwEventStatus = WaitForSingleObject ( g_hEventTerminateEAPOL, 0)) == WAIT_FAILED) { dwRetCode = GetLastError (); break; } if (dwEventStatus == WAIT_OBJECT_0) { dwRetCode = ERROR_INVALID_STATE; break; } DbLogPCBEvent (DBLOG_CATEG_INFO, NULL, EAPOL_POLICY_CHANGE_NOTIFICATION); TRACE0 (ANY, "ElPolicyChange: Ready to accept policy"); InterlockedIncrement (&g_lWorkerThreads); fDecrWorkerThreadCount = TRUE; if ((dwRetCode = ElCopyPolicyList (pEAPOLPolicyList, &pLocalPolicyList)) != NO_ERROR) { TRACE1 (DEVICE, "ElPolicyChange: ElCopyPolicyList failed with error (%ld)", dwRetCode); break; } if (!QueueUserWorkItem ( (LPTHREAD_START_ROUTINE)ElPolicyChangeWorker, (PVOID)pLocalPolicyList, WT_EXECUTELONGFUNCTION)) { dwRetCode = GetLastError(); TRACE1 (DEVICE, "ElPolicyChange: ElPolicyChangeWorker failed with error %ld", dwRetCode); break; } else { fDecrWorkerThreadCount = FALSE; } } while (FALSE); if (dwRetCode != NO_ERROR) { TRACE1 (DEVICE, "ElPolicyChange: Completed with error (%ld)", dwRetCode); if (pLocalPolicyList != NULL) { ElFreePolicyList (pLocalPolicyList); } } if (fDecrWorkerThreadCount) { InterlockedDecrement (&g_lWorkerThreads); } return dwRetCode; } // // ElPolicyChangeWorker // // Description: // // Arguments: // pPCB - Current interface context // // Return values: // NO_ERROR - success // Other - error // DWORD WINAPI ElPolicyChangeWorker ( IN PVOID pvContext ) { BOOLEAN fLocked = FALSE; BOOLEAN fIdentical = FALSE; EAPOL_POLICY_LIST *pNewPolicyList = pvContext; EAPOL_POLICY_LIST *pReauthPolicyList = NULL; EAPOL_POLICY_LIST *pRestartPolicyList = NULL; DWORD dwRetCode = NO_ERROR; do { TRACE0 (ANY, "ElPolicyChangeWorker entered"); ACQUIRE_WRITE_LOCK (&g_PolicyLock); fLocked = TRUE; EapolTrace ("Old Policy = "); ElPrintPolicyList (g_pEAPOLPolicyList); EapolTrace ("New Policy = "); ElPrintPolicyList (pNewPolicyList); TRACE0 (ANY, "Entering ElVerifyPolicySettingsChange"); if ((dwRetCode = ElVerifyPolicySettingsChange ( pNewPolicyList, &fIdentical )) != NO_ERROR) { TRACE1 (ANY, "ElPolicyChangeWorker: ElVerifyPolicySettingsChange failed with error (%ld)", dwRetCode); break; } if (fIdentical) { TRACE0 (ANY, "ElPolicyChangeWorker: No change in policy settings"); break; } TRACE0 (ANY, "Entering ElProcessAddedPolicySettings"); if ((dwRetCode = ElProcessAddedPolicySettings ( pNewPolicyList, &pReauthPolicyList, &pRestartPolicyList )) != NO_ERROR) { TRACE1 (ANY, "ElProcessAddedPolicySettings failed with error %ld", dwRetCode); break; } TRACE0 (ANY, "Entering ElProcessChangedPolicySettings"); if ((dwRetCode = ElProcessChangedPolicySettings ( pNewPolicyList, &pReauthPolicyList, &pRestartPolicyList )) != NO_ERROR) { TRACE1 (ANY, "ElProcessChangedPolicySettings failed with error %ld", dwRetCode); break; } TRACE0 (ANY, "Entering ElProcessDeletedPolicySettings"); if ((dwRetCode = ElProcessDeletedPolicySettings ( pNewPolicyList, &pReauthPolicyList, &pRestartPolicyList )) != NO_ERROR) { TRACE1 (ANY, "ElProcessDeletedPolicySettings failed with error %ld", dwRetCode); break; } EapolTrace ("Policy setting requiring restart = "); ElPrintPolicyList (pRestartPolicyList); EapolTrace ("Policy setting requiring reauth = "); ElPrintPolicyList (pReauthPolicyList); TRACE0 (ANY, "Entering ElUpdateGlobalPolicySettings"); if ((dwRetCode = ElUpdateGlobalPolicySettings ( pNewPolicyList )) != NO_ERROR) { TRACE1 (ANY, "ElUpdateGlobalPolicySettings failed with error %ld", dwRetCode); break; } DbLogPCBEvent (DBLOG_CATEG_INFO, NULL, EAPOL_POLICY_UPDATED); EapolTrace ("Updated policy = "); ElPrintPolicyList (g_pEAPOLPolicyList); RELEASE_WRITE_LOCK (&g_PolicyLock); fLocked = FALSE; TRACE0 (ANY, "Entering ElProcessPolicySettings"); if ((dwRetCode = ElProcessPolicySettings ( pReauthPolicyList, pRestartPolicyList )) != NO_ERROR) { TRACE1 (ANY, "ElProcessPolicySettings failed with error %ld", dwRetCode); break; } } while (FALSE); if (fLocked) { RELEASE_WRITE_LOCK (&g_PolicyLock) } if (pReauthPolicyList != NULL) { ElFreePolicyList (pReauthPolicyList); } if (pRestartPolicyList != NULL) { ElFreePolicyList (pRestartPolicyList); } if (pNewPolicyList != NULL) { ElFreePolicyList (pNewPolicyList); } InterlockedDecrement (&g_lWorkerThreads); return dwRetCode; } DWORD ElVerifyPolicySettingsChange ( IN EAPOL_POLICY_LIST *pNewPolicyList, IN OUT BOOLEAN *pfIdentical ) { DWORD i = 0; DWORD dwRetCode = NO_ERROR; do { *pfIdentical = FALSE; if (g_pEAPOLPolicyList == NULL) { break; } if (pNewPolicyList->dwNumberOfItems == g_pEAPOLPolicyList->dwNumberOfItems) { for (i= 0; idwNumberOfItems; i++) { *pfIdentical = TRUE; if (!ElIsEqualEAPOLPolicyData (&g_pEAPOLPolicyList->EAPOLPolicy[i], &pNewPolicyList->EAPOLPolicy[i])) { *pfIdentical = FALSE; break; } } } } while (FALSE); return dwRetCode; } DWORD ElProcessAddedPolicySettings ( IN EAPOL_POLICY_LIST *pNewPolicyList, IN OUT PEAPOL_POLICY_LIST *ppReauthPolicyList, IN OUT PEAPOL_POLICY_LIST *ppRestartPolicyList ) { DWORD i = 0, j = 0, k = 0; BOOLEAN fFoundInOld = FALSE; DWORD dwRetCode = NO_ERROR; do { for (i=0; idwNumberOfItems; i++) { fFoundInOld = FALSE; if (g_pEAPOLPolicyList != NULL) for (j=0; jdwNumberOfItems; j++) { if (pNewPolicyList->EAPOLPolicy[i].dwWirelessSSIDLen == g_pEAPOLPolicyList->EAPOLPolicy[j].dwWirelessSSIDLen) { if (memcmp ((PVOID)pNewPolicyList->EAPOLPolicy[i].pbWirelessSSID, (PVOID)&g_pEAPOLPolicyList->EAPOLPolicy[j].pbWirelessSSID, pNewPolicyList->EAPOLPolicy[i].dwWirelessSSIDLen) == 0) { fFoundInOld = TRUE; } } } if (!fFoundInOld) { for (k=i+1; kdwNumberOfItems; k++) { if ((dwRetCode = ElAddToPolicyList ( ppRestartPolicyList, &pNewPolicyList->EAPOLPolicy[k] )) != NO_ERROR) { break; } } if (dwRetCode != NO_ERROR) { break; } if ((dwRetCode = ElAddToPolicyList ( ppReauthPolicyList, &pNewPolicyList->EAPOLPolicy[i] )) != NO_ERROR) { break; } break; } } } while (FALSE); return dwRetCode; } DWORD ElProcessChangedPolicySettings ( IN EAPOL_POLICY_LIST *pNewPolicyList, IN OUT PEAPOL_POLICY_LIST *ppReauthPolicyList, IN OUT PEAPOL_POLICY_LIST *ppRestartPolicyList ) { DWORD i = 0, j = 0, k = 0; BOOLEAN fChangedInNew = FALSE; DWORD dwRetCode = NO_ERROR; do { if (g_pEAPOLPolicyList == NULL) { TRACE0 (ANY, "ElProcessChangedPolicySettings: Global Policy List = NULL"); break; } for (i=0; idwNumberOfItems; i++) { fChangedInNew = FALSE; for (j=0; jdwNumberOfItems; j++) { if (g_pEAPOLPolicyList->EAPOLPolicy[i].dwWirelessSSIDLen == pNewPolicyList->EAPOLPolicy[j].dwWirelessSSIDLen) { if (memcmp ((PVOID)g_pEAPOLPolicyList->EAPOLPolicy[i].pbWirelessSSID, (PVOID)pNewPolicyList->EAPOLPolicy[j].pbWirelessSSID, g_pEAPOLPolicyList->EAPOLPolicy[i].dwWirelessSSIDLen) == 0) { if (!ElIsEqualEAPOLPolicyData (&g_pEAPOLPolicyList->EAPOLPolicy[i], &pNewPolicyList->EAPOLPolicy[j])) { fChangedInNew = TRUE; } } } } if (fChangedInNew) { for (k=i+1; kdwNumberOfItems; k++) { if ((dwRetCode = ElAddToPolicyList ( ppRestartPolicyList, &g_pEAPOLPolicyList->EAPOLPolicy[k] )) != NO_ERROR) { break; } } if (dwRetCode != NO_ERROR) { break; } if ((dwRetCode = ElAddToPolicyList ( ppReauthPolicyList, &g_pEAPOLPolicyList->EAPOLPolicy[i] )) != NO_ERROR) { break; } break; } } } while (FALSE); return dwRetCode; } DWORD ElProcessDeletedPolicySettings ( IN EAPOL_POLICY_LIST *pNewPolicyList, IN OUT PEAPOL_POLICY_LIST *ppReauthPolicyList, IN OUT PEAPOL_POLICY_LIST *ppRestartPolicyList ) { DWORD i = 0, j = 0, k = 0; BOOLEAN fFoundInNew = FALSE; DWORD dwRetCode = NO_ERROR; do { if (g_pEAPOLPolicyList == NULL) { TRACE0 (ANY, "ElProcessDeletedPolicySettings: Global Policy List = NULL"); break; } for (i=0; idwNumberOfItems; i++) { fFoundInNew = FALSE; for (j=0; jdwNumberOfItems; j++) { if (g_pEAPOLPolicyList->EAPOLPolicy[i].dwWirelessSSIDLen == pNewPolicyList->EAPOLPolicy[j].dwWirelessSSIDLen) { if (memcmp ((PVOID)g_pEAPOLPolicyList->EAPOLPolicy[i].pbWirelessSSID, (PVOID)pNewPolicyList->EAPOLPolicy[j].pbWirelessSSID, g_pEAPOLPolicyList->EAPOLPolicy[i].dwWirelessSSIDLen) == 0) { fFoundInNew = TRUE; } } } if (!fFoundInNew) { for (k=i; kdwNumberOfItems; k++) { if ((dwRetCode = ElAddToPolicyList ( ppRestartPolicyList, &g_pEAPOLPolicyList->EAPOLPolicy[k] )) != NO_ERROR) { break; } } break; } } } while (FALSE); return dwRetCode; } DWORD ElAddToPolicyList ( IN OUT PEAPOL_POLICY_LIST *ppList, IN EAPOL_POLICY_DATA *pData ) { DWORD i = 0; BOOLEAN fFoundInList = FALSE; DWORD dwNumberOfItems = 0; PEAPOL_POLICY_LIST pInList = NULL; PEAPOL_POLICY_LIST pOutList = NULL; PEAPOL_POLICY_DATA pDataIn = NULL, pDataOut = NULL; DWORD dwRetCode = NO_ERROR; do { if (*ppList) { dwNumberOfItems = (*ppList)->dwNumberOfItems; } else { dwNumberOfItems = 0; } for (i=0; iEAPOLPolicy[i].dwWirelessSSIDLen == pData->dwWirelessSSIDLen) { if (memcmp ((*ppList)->EAPOLPolicy[i].pbWirelessSSID, pData->pbWirelessSSID, pData->dwWirelessSSIDLen) == 0) { fFoundInList = TRUE; break; } } } if (!fFoundInList) { pInList = *ppList; pOutList = MALLOC(sizeof(EAPOL_POLICY_LIST)+ (dwNumberOfItems+1)*sizeof(EAPOL_POLICY_DATA)); if (pOutList == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } pOutList->dwNumberOfItems = dwNumberOfItems+1; // Copy the original list for (i=0; iEAPOLPolicy[i]); pDataOut = &(pOutList->EAPOLPolicy[i]); memcpy (pDataOut, pDataIn, sizeof(EAPOL_POLICY_DATA)); pDataOut->pbEAPData = NULL; pDataOut->dwEAPDataLen = 0; if (pDataIn->dwEAPDataLen) { if ((pDataOut->pbEAPData = MALLOC (pDataIn->dwEAPDataLen)) == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } memcpy (pDataOut->pbEAPData, pDataIn->pbEAPData, pDataIn->dwEAPDataLen); } pDataOut->dwEAPDataLen = pDataIn->dwEAPDataLen; } if (dwRetCode != NO_ERROR) { break; } // Copy the new item pDataIn = pData; pDataOut = &pOutList->EAPOLPolicy[dwNumberOfItems]; memcpy (pDataOut, pDataIn, sizeof(EAPOL_POLICY_DATA)); pDataOut->pbEAPData = NULL; pDataOut->dwEAPDataLen = 0; if (pDataIn->dwEAPDataLen) { if ((pDataOut->pbEAPData = MALLOC (pDataIn->dwEAPDataLen)) == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } memcpy (pDataOut->pbEAPData, pDataIn->pbEAPData, pDataIn->dwEAPDataLen); } pDataOut->dwEAPDataLen = pDataIn->dwEAPDataLen; if (*ppList) { ElFreePolicyList (*ppList); } *ppList = pOutList; } } while (FALSE); if (dwRetCode != NO_ERROR) { if (pOutList != NULL) { ElFreePolicyList (pOutList); } } return dwRetCode; } // // ElProcessPolicySettings // // Description: // // Arguments: // // Return values: // NO_ERROR - success // Other - error // DWORD ElProcessPolicySettings ( IN EAPOL_POLICY_LIST *pReauthList, IN EAPOL_POLICY_LIST *pRestartList ) { DWORD dwIndex = 0; EAPOL_PCB *pPCB = NULL; BOOLEAN fFoundInReauth = FALSE; BOOLEAN fFoundInRestart = FALSE; EAPOL_POLICY_DATA *pEAPOLPolicyData = NULL; EAPOL_ZC_INTF ZCData = {0}; DWORD dwRetCode = NO_ERROR; do { if (!(g_dwModulesStarted & ALL_MODULES_STARTED)) { dwRetCode = ERROR_INVALID_STATE; break; } ACQUIRE_WRITE_LOCK (&(g_PCBLock)); for (dwIndex = 0; dwIndexpNext) { ACQUIRE_WRITE_LOCK (&(pPCB->rwLock)); fFoundInRestart = fFoundInReauth = FALSE; if ((dwRetCode = ElFindPolicyData ( pPCB->pSSID?pPCB->pSSID->SsidLength:0, pPCB->pSSID?pPCB->pSSID->Ssid:NULL, pRestartList, &pEAPOLPolicyData )) == NO_ERROR) { fFoundInRestart = TRUE; } if ((dwRetCode = ElFindPolicyData ( pPCB->pSSID?pPCB->pSSID->SsidLength:0, pPCB->pSSID?pPCB->pSSID->Ssid:NULL, pReauthList, &pEAPOLPolicyData )) == NO_ERROR) { fFoundInReauth = TRUE; } if (fFoundInRestart) { #ifdef ZEROCONFIG_LINKED // Indicate hard-reset to WZC ZeroMemory ((PVOID)&ZCData, sizeof(EAPOL_ZC_INTF)); ZCData.dwAuthFailCount = 0; ZCData.PreviousAuthenticationType = 0; if ((dwRetCode = ElZeroConfigNotify ( 0, WZCCMD_HARD_RESET, pPCB->pwszDeviceGUID, &ZCData )) != NO_ERROR) { TRACE1 (ANY, "ElProcessPolicySettings: ElZeroConfigNotify failed with error %ld", dwRetCode); dwRetCode = NO_ERROR; } #endif // ZEROCONFIG_LINKED } if (fFoundInRestart || fFoundInReauth) { if ((dwRetCode = ElReAuthenticateInterface ( pPCB->pwszDeviceGUID )) != NO_ERROR) { TRACE2 (ANY, "ElProcessPolicySettings: ElReAuthenticateInterface failed for (%ws) with error (%ld)", pPCB->pwszDeviceGUID, dwRetCode); dwRetCode = NO_ERROR; } } RELEASE_WRITE_LOCK (&(pPCB->rwLock)); } dwRetCode = NO_ERROR; } RELEASE_WRITE_LOCK (&(g_PCBLock)); } while (FALSE); return dwRetCode; } DWORD ElUpdateGlobalPolicySettings ( IN EAPOL_POLICY_LIST *pNewPolicyList ) { DWORD dwSizeOfList = 0; EAPOL_POLICY_LIST *pTmpPolicyList = NULL; DWORD dwRetCode = NO_ERROR; do { if (pNewPolicyList == NULL) { TRACE0 (ANY, "ElUpdateGlobalPolicySettings: New Policy List = NULL"); break; } if ((dwRetCode = ElCopyPolicyList (pNewPolicyList, &pTmpPolicyList)) != NO_ERROR) { TRACE1 (ANY, "ElUpdateGlobalPolicySettings: ElCopyPolicyList failed with error (%ld)", dwRetCode); break; } ElFreePolicyList (g_pEAPOLPolicyList); g_pEAPOLPolicyList = pTmpPolicyList; } while (FALSE); return dwRetCode; } // // ElGetPolicyInterfaceParams // // Description: // // Arguments: // // Return values: // NO_ERROR - success // Other - error // DWORD ElGetPolicyInterfaceParams ( IN DWORD dwSizeOfSSID, IN BYTE *pbSSID, IN OUT EAPOL_POLICY_PARAMS *pEAPOLPolicyParams ) { EAPOL_POLICY_DATA *pEAPOLData = NULL; DWORD dwEapFlags = 0; BOOLEAN fLocked = FALSE; DWORD dwRetCode = NO_ERROR; do { ACQUIRE_WRITE_LOCK (&g_PolicyLock); fLocked = TRUE; if ((dwRetCode = ElFindPolicyData ( dwSizeOfSSID, pbSSID, g_pEAPOLPolicyList, &pEAPOLData )) != NO_ERROR) { if (dwRetCode != ERROR_FILE_NOT_FOUND) { TRACE1 (ANY, "ElGetPolicyInterfaceParams: ElFindPolicyData failed with error %ld", dwRetCode); } dwRetCode = ERROR_FILE_NOT_FOUND; break; } pEAPOLPolicyParams->IntfParams.dwEapType = pEAPOLData->dwEAPType; pEAPOLPolicyParams->IntfParams.dwSizeOfSSID = dwSizeOfSSID; memcpy (pEAPOLPolicyParams->IntfParams.bSSID, pbSSID, dwSizeOfSSID); dwEapFlags |= (pEAPOLData->dwEnable8021x?EAPOL_ENABLED:0); dwEapFlags |= (pEAPOLData->dwMachineAuthentication?EAPOL_MACHINE_AUTH_ENABLED:0); dwEapFlags |= (pEAPOLData->dwGuestAuthentication?EAPOL_GUEST_AUTH_ENABLED:0); pEAPOLPolicyParams->IntfParams.dwEapFlags = dwEapFlags; pEAPOLPolicyParams->IntfParams.dwVersion = EAPOL_CURRENT_VERSION;; pEAPOLPolicyParams->dwEAPOLAuthMode = pEAPOLData->dwMachineAuthenticationType; pEAPOLPolicyParams->dwSupplicantMode = pEAPOLData->dw8021xMode; pEAPOLPolicyParams->dwmaxStart = pEAPOLData->dwIEEE8021xMaxStart; pEAPOLPolicyParams->dwstartPeriod = pEAPOLData->dwIEEE8021xStartPeriod; pEAPOLPolicyParams->dwauthPeriod = pEAPOLData->dwIEEE8021xAuthPeriod; pEAPOLPolicyParams->dwheldPeriod = pEAPOLData->dwIEEE8021xHeldPeriod; RELEASE_WRITE_LOCK (&g_PolicyLock); fLocked = FALSE; } while (FALSE); if (fLocked) { RELEASE_WRITE_LOCK (&g_PolicyLock); } return dwRetCode; } // // ElGetPolicyCustomAuthData // // Description: // // Arguments: // // Return values: // NO_ERROR - success // ERROR_FILE_NOT_FOUND - No relevant Policy Data was found // Other - error // DWORD ElGetPolicyCustomAuthData ( IN DWORD dwEapTypeId, IN DWORD dwSizeOfSSID, IN BYTE *pbSSID, IN PBYTE *ppbConnInfoIn, IN DWORD *pdwInfoSizeIn, OUT PBYTE *ppbConnInfoOut, OUT DWORD *pdwInfoSizeOut ) { DWORD dwIndex = 0; HANDLE hLib = NULL; EAPOL_POLICY_DATA *pEAPOLData = NULL; RASEAPCREATECONNPROP pCreateConnPropFunc = NULL; EAPTLS_CONNPROP_ATTRIBUTE ConnProp[4] = {0}; PVOID pAuthDataIn = NULL; DWORD dwSizeDataIn = 0; PVOID pAuthDataOut = NULL; DWORD dwSizeDataOut = 0; BOOLEAN fLocked = FALSE; DWORD dwRetCode = NO_ERROR; do { ACQUIRE_WRITE_LOCK (&g_PolicyLock); fLocked = TRUE; if ((dwRetCode = ElFindPolicyData ( dwSizeOfSSID, pbSSID, g_pEAPOLPolicyList, &pEAPOLData )) != NO_ERROR) { if (dwRetCode != ERROR_FILE_NOT_FOUND) { TRACE1 (ANY, "ElGetPolicyCustomAuthData: ElFindPolicyData failed with error %ld", dwRetCode); } dwRetCode = ERROR_FILE_NOT_FOUND; break; } if (pEAPOLData) { if (pEAPOLData->dwEAPDataLen != 0) { if ((pAuthDataOut = MALLOC (pEAPOLData->dwEAPDataLen)) == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } memcpy (pAuthDataOut, pEAPOLData->pbEAPData, pEAPOLData->dwEAPDataLen); dwSizeDataOut = pEAPOLData->dwEAPDataLen; } } *ppbConnInfoOut = pAuthDataOut; *pdwInfoSizeOut = dwSizeDataOut; } while (FALSE); if (fLocked) { RELEASE_WRITE_LOCK (&g_PolicyLock); } return dwRetCode; } // // ElFindPolicyData // // Description: // // Arguments: // // Return values: // NO_ERROR - success // Other - error // DWORD ElFindPolicyData ( IN DWORD dwSizeOfSSID, IN BYTE *pbSSID, IN EAPOL_POLICY_LIST *pPolicyList, OUT PEAPOL_POLICY_DATA *ppEAPOLPolicyData ) { DWORD dwIndex = 0; DWORD dwRetCode = NO_ERROR; do { *ppEAPOLPolicyData = NULL; if (pPolicyList == NULL) { dwRetCode = ERROR_FILE_NOT_FOUND; break; } for (dwIndex=0; dwIndexdwNumberOfItems; dwIndex++) { if (pPolicyList->EAPOLPolicy[dwIndex].dwWirelessSSIDLen == dwSizeOfSSID) { if (memcmp (pbSSID, pPolicyList->EAPOLPolicy[dwIndex].pbWirelessSSID, dwSizeOfSSID) == 0) { *ppEAPOLPolicyData = &(pPolicyList->EAPOLPolicy[dwIndex]); break; } } } if (*ppEAPOLPolicyData == NULL) { dwRetCode = ERROR_FILE_NOT_FOUND; } } while (FALSE); return dwRetCode; }