|
|
#include <precomp.h>
#include "eapolcfg.h"
#define MALLOC(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (s))
#define FREE(p) HeapFree(GetProcessHeap(), 0, (p))
////////////////////////////////////////////////////////////////////////
// CEapolConfig related stuff
//
//+---------------------------------------------------------------------------
// constructor
CEapolConfig::CEapolConfig() { m_dwCtlFlags = 0; ZeroMemory(&m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS)); m_pListEapcfgs = NULL; }
//+---------------------------------------------------------------------------
// destructor
CEapolConfig::~CEapolConfig() { ZeroMemory(&m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS)); if (m_pListEapcfgs != NULL) { DtlDestroyList (m_pListEapcfgs, DestroyEapcfgNode); m_pListEapcfgs = NULL; } }
//+---------------------------------------------------------------------------
DWORD CEapolConfig::CopyEapolConfig(CEapolConfig *pEapolConfig) { DTLLIST *pListEapcfgs = NULL; DTLNODE *pCopyNode = NULL, *pInNode = NULL; DWORD dwErr = ERROR_SUCCESS;
if (pEapolConfig) { pListEapcfgs = ::ReadEapcfgList (EAPOL_MUTUAL_AUTH_EAP_ONLY); if (pListEapcfgs) { for (pCopyNode = DtlGetFirstNode(pListEapcfgs); pCopyNode; pCopyNode = DtlGetNextNode(pCopyNode)) { EAPCFG* pCopyEapcfg = (EAPCFG* )DtlGetData(pCopyNode); for (pInNode = DtlGetFirstNode(pEapolConfig->m_pListEapcfgs); pInNode; pInNode = DtlGetNextNode(pInNode)) { EAPCFG* pInEapcfg = (EAPCFG* )DtlGetData(pInNode); if (pCopyEapcfg->dwKey == pInEapcfg->dwKey) { if ((pCopyEapcfg->pData = (PBYTE) MALLOC (pInEapcfg->cbData)) == NULL) { dwErr = ERROR_NOT_ENOUGH_MEMORY; break; } memcpy (pCopyEapcfg->pData, pInEapcfg->pData, pInEapcfg->cbData); pCopyEapcfg->cbData = pInEapcfg->cbData; break; } } if (dwErr != NO_ERROR) { goto LExit; } } } m_pListEapcfgs = pListEapcfgs; memcpy (&m_EapolIntfParams, &pEapolConfig->m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS)); } else { dwErr = ERROR_INVALID_DATA; }
LExit: if (dwErr != ERROR_SUCCESS && pListEapcfgs != NULL) { DtlDestroyList (pListEapcfgs, DestroyEapcfgNode); } return dwErr; }
//+---------------------------------------------------------------------------
DWORD CEapolConfig::LoadEapolConfig(LPWSTR wszIntfGuid, PNDIS_802_11_SSID pndSsid) { DWORD dwErr = ERROR_SUCCESS; BYTE *pbData = NULL; DWORD cbData = 0; EAPOL_INTF_PARAMS EapolIntfParams; DTLLIST *pListEapcfgs = NULL;
// Initialize EAP package list
// Read the EAPCFG information from the registry and find the node
// selected in the entry, or the default, if none.
do { DTLNODE* pNode = NULL;
// Read the EAPCFG information from the registry and find the node
// selected in the entry, or the default, if none.
pListEapcfgs = ::ReadEapcfgList (EAPOL_MUTUAL_AUTH_EAP_ONLY);
if (pListEapcfgs) {
DTLNODE* pNodeEap; DWORD dwkey = 0;
// Read the EAP params for this interface
ZeroMemory ((BYTE *)&EapolIntfParams, sizeof(EAPOL_INTF_PARAMS)); EapolIntfParams.dwEapFlags = DEFAULT_EAP_STATE; EapolIntfParams.dwEapType = DEFAULT_EAP_TYPE; if (pndSsid) { EapolIntfParams.dwSizeOfSSID = pndSsid->SsidLength; memcpy (EapolIntfParams.bSSID, pndSsid->Ssid, pndSsid->SsidLength); } else { // If NULL SSID, this will get default EAPOL values
EapolIntfParams.dwSizeOfSSID = 1; } dwErr = WZCEapolGetInterfaceParams ( NULL, wszIntfGuid, &EapolIntfParams);
if (dwErr != ERROR_SUCCESS) break;
memcpy (&m_EapolIntfParams, &EapolIntfParams, sizeof(EAPOL_INTF_PARAMS));
// Read the EAP configuration info for all EAP packages
for (pNodeEap = DtlGetFirstNode(pListEapcfgs); pNodeEap; pNodeEap = DtlGetNextNode(pNodeEap)) { EAPCFG* pEapcfg = (EAPCFG* )DtlGetData(pNodeEap); ASSERT( pEapcfg );
dwErr = ERROR_SUCCESS; pbData = NULL;
cbData = 0;
// Get the size of the EAP blob
dwErr = WZCEapolGetCustomAuthData( NULL, wszIntfGuid, pEapcfg->dwKey, EapolIntfParams.dwSizeOfSSID, EapolIntfParams.bSSID, NULL, &cbData ); if (dwErr != ERROR_SUCCESS) { if ((EapolIntfParams.dwSizeOfSSID != 0) && (dwErr == ERROR_FILE_NOT_FOUND)) {
// The Last Used SSID did not have a connection
// blob created. Call again for size of blob with
// NULL SSID
EapolIntfParams.dwSizeOfSSID = 0;
// Get the size of the EAP blob
dwErr = WZCEapolGetCustomAuthData ( NULL, wszIntfGuid, pEapcfg->dwKey, 0, NULL, NULL, &cbData ); }
if (dwErr == ERROR_BUFFER_TOO_SMALL) { if (cbData <= 0) { // No EAP blob stored in the registry
pbData = NULL;
// Will continue processing for errors
// Not exit
dwErr = ERROR_SUCCESS;
} else { // Allocate memory to hold the blob
pbData = (PBYTE) MALLOC (cbData);
if (pbData == NULL) { dwErr = ERROR_SUCCESS; continue; } ZeroMemory (pbData, cbData);
dwErr = WZCEapolGetCustomAuthData ( NULL, wszIntfGuid, pEapcfg->dwKey, EapolIntfParams.dwSizeOfSSID, EapolIntfParams.bSSID, pbData, &cbData );
if (dwErr != ERROR_SUCCESS) { FREE ( pbData ); dwErr = ERROR_SUCCESS; continue; } } } else { dwErr = ERROR_SUCCESS; continue; } } else { dwErr = ERROR_SUCCESS; }
if (pEapcfg->pData != NULL) { FREE ( pEapcfg->pData ); } pEapcfg->pData = (UCHAR *)pbData; pEapcfg->cbData = cbData; }
m_pListEapcfgs = pListEapcfgs; } else { dwErr = ERROR_INVALID_DATA; }
} while (FALSE);
return dwErr; }
//+---------------------------------------------------------------------------
DWORD CEapolConfig::SaveEapolConfig(LPWSTR wszIntfGuid, PNDIS_802_11_SSID pndSsid) { WCHAR *pwszLastUsedSSID = NULL; DWORD dwEapFlags = 0; DWORD dwErrOverall = ERROR_SUCCESS; DWORD dwErr = ERROR_SUCCESS;
// Save the EAP configuration data into the registry
DTLNODE* pNodeEap = NULL;
dwErr = ERROR_SUCCESS;
// Save data for all EAP packages in the registry
if (m_pListEapcfgs == NULL) { return ERROR_SUCCESS; } if (pndSsid) { m_EapolIntfParams.dwSizeOfSSID = pndSsid->SsidLength; memcpy (m_EapolIntfParams.bSSID, pndSsid->Ssid, pndSsid->SsidLength); }
for (pNodeEap = DtlGetFirstNode(m_pListEapcfgs); pNodeEap; pNodeEap = DtlGetNextNode(pNodeEap)) { EAPCFG* pcfg = (EAPCFG* )DtlGetData(pNodeEap); if (pcfg == NULL) { continue; }
dwErr = ERROR_SUCCESS;
// ignore error and continue with next
dwErr = WZCEapolSetCustomAuthData ( NULL, wszIntfGuid, pcfg->dwKey, m_EapolIntfParams.dwSizeOfSSID, m_EapolIntfParams.bSSID, pcfg->pData, pcfg->cbData);
if (dwErr != ERROR_SUCCESS) { dwErrOverall = dwErr; dwErr = ERROR_SUCCESS; } }
if (m_dwCtlFlags & EAPOL_CTL_LOCKED) m_EapolIntfParams.dwEapFlags &= ~EAPOL_ENABLED;
dwErr = WZCEapolSetInterfaceParams ( NULL, wszIntfGuid, &m_EapolIntfParams);
if (dwErrOverall != ERROR_SUCCESS) { dwErr = dwErrOverall; }
return dwErr; }
//+---------------------------------------------------------------------------
BOOL CEapolConfig::Is8021XEnabled() { return (IS_EAPOL_ENABLED(m_EapolIntfParams.dwEapFlags)); } //+---------------------------------------------------------------------------
VOID CEapolConfig::Set8021XState(BOOLEAN fSet) { if (fSet) m_EapolIntfParams.dwEapFlags |= EAPOL_ENABLED; else m_EapolIntfParams.dwEapFlags &= ~EAPOL_ENABLED; }
|