|
|
#include "pch.h"
#pragma hdrstop
#include "connutil.h"
#include "ncnetcon.h"
#include "ncperms.h"
#include "ncui.h"
#include "xpsp1res.h"
#include "lanui.h"
#include "eapolui.h"
#include "util.h"
#include "lanhelp.h"
#include "wzcprops.h"
#include "wzcpage.h"
#include "wzcui.h"
#include "wzcsapi.h"
////////////////////////////////////////////////////////////////////////
// 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) { DtlDestroyList (m_pListEapcfgs, DestroyEapcfgNode); } m_pListEapcfgs = NULL; }
//+---------------------------------------------------------------------------
DWORD CEapolConfig::CopyEapolConfig(CEapolConfig *pEapolConfig) { DTLLIST *pListEapcfgs = NULL; DTLNODE *pCopyNode = NULL, *pInNode = NULL; DWORD dwRetCode = 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) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; break; } memcpy (pCopyEapcfg->pData, pInEapcfg->pData, pInEapcfg->cbData); pCopyEapcfg->cbData = pInEapcfg->cbData; break; } } if (dwRetCode != NO_ERROR) { goto LExit; } } } m_pListEapcfgs = pListEapcfgs; memcpy (&m_EapolIntfParams, &pEapolConfig->m_EapolIntfParams, sizeof(EAPOL_INTF_PARAMS)); } else { dwRetCode = ERROR_INVALID_DATA; }
LExit: if (dwRetCode != ERROR_SUCCESS) { if (pListEapcfgs) { DtlDestroyList (pListEapcfgs, DestroyEapcfgNode); } }
return dwRetCode; }
//+---------------------------------------------------------------------------
DWORD CEapolConfig::LoadEapolConfig(LPWSTR wszIntfGuid, PNDIS_802_11_SSID pndSsid) { BYTE *pbData = NULL; DWORD cbData = 0; EAPOL_INTF_PARAMS EapolIntfParams; DTLLIST *pListEapcfgs = NULL; HRESULT hr = S_OK;
// 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; } hr = HrElGetInterfaceParams ( wszIntfGuid, &EapolIntfParams ); if (FAILED (hr)) { TraceTag (ttidLanUi, "HrElGetInterfaceParams failed with error %ld", LresFromHr(hr)); break; }
TraceTag (ttidLanUi, "HrElGetInterfaceParams: Got EAPtype=(%ld), EAPState =(%ld)", EapolIntfParams.dwEapType, EapolIntfParams.dwEapFlags);
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 );
hr = S_OK; pbData = NULL;
TraceTag (ttidLanUi, "Calling HrElGetCustomAuthData for EAP %ld", pEapcfg->dwKey);
cbData = 0;
// Get the size of the EAP blob
hr = HrElGetCustomAuthData ( wszIntfGuid, pEapcfg->dwKey, EapolIntfParams.dwSizeOfSSID, EapolIntfParams.bSSID, NULL, &cbData ); if (!SUCCEEDED(hr)) { if ((EapolIntfParams.dwSizeOfSSID != 0) && (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))) {
TraceTag (ttidLanUi, "HrElGetCustomAuthData: SSID!= NULL, not found blob for SSID");
// 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
hr = HrElGetCustomAuthData ( wszIntfGuid, pEapcfg->dwKey, 0, NULL, NULL, &cbData ); }
if (hr == E_OUTOFMEMORY) { if (cbData <= 0) { // No EAP blob stored in the registry
TraceTag (ttidLanUi, "HrElGetCustomAuthData: No blob stored in reg at all"); pbData = NULL;
// Will continue processing for errors
// Not exit
hr = S_OK;
} else { TraceTag (ttidLanUi, "HrElGetCustomAuthData: Found auth blob in registry");
// Allocate memory to hold the blob
pbData = (PBYTE) MALLOC (cbData);
if (pbData == NULL) { hr = S_OK; TraceTag (ttidLanUi, "HrElGetCustomAuthData: Error in memory allocation for EAP blob"); continue; } ZeroMemory (pbData, cbData);
hr = HrElGetCustomAuthData ( wszIntfGuid, pEapcfg->dwKey, EapolIntfParams.dwSizeOfSSID, EapolIntfParams.bSSID, pbData, &cbData );
if (!SUCCEEDED(hr)) { TraceTag (ttidLanUi, "HrElGetCustomAuthData: HrElGetCustomAuthData failed with %ld", LresFromHr(hr)); FREE ( pbData ); hr = S_OK; continue; }
TraceTag (ttidLanUi, "HrElGetCustomAuthData: HrElGetCustomAuthData successfully got blob of length %ld" , cbData); } } else { TraceTag (ttidLanUi, "HrElGetCustomAuthData: Not got ERROR_NOT_ENOUGH_MEMORY error; Unknown error !!!"); hr = S_OK; continue; } } else { // HrElGetCustomAuthData will always return
// error with cbData = 0
hr = S_OK; }
if (pEapcfg->pData != NULL) { FREE ( pEapcfg->pData ); } pEapcfg->pData = (UCHAR *)pbData; pEapcfg->cbData = cbData; }
m_pListEapcfgs = pListEapcfgs; } else { hr = E_FAIL; }
} while (FALSE);
return LresFromHr(hr); }
//+---------------------------------------------------------------------------
DWORD CEapolConfig::SaveEapolConfig(LPWSTR wszIntfGuid, PNDIS_802_11_SSID pndSsid) { WCHAR *pwszLastUsedSSID = NULL; DWORD dwEapFlags = 0; HRESULT hrOverall = S_OK; HRESULT hr = S_OK;
// Save the EAP configuration data into the registry
DTLNODE* pNodeEap = NULL;
hr = S_OK;
// Save data for all EAP packages in the registry
if (m_pListEapcfgs == NULL) { return LresFromHr(S_OK); } 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; }
hr = S_OK;
// ignore error and continue with next
hr = HrElSetCustomAuthData ( wszIntfGuid, pcfg->dwKey, m_EapolIntfParams.dwSizeOfSSID, m_EapolIntfParams.bSSID, pcfg->pData, pcfg->cbData);
if (FAILED (hr)) { TraceTag (ttidLanUi, "HrElSetCustomAuthData failed"); hrOverall = hr; hr = S_OK; } }
if (m_dwCtlFlags & EAPOL_CTL_LOCKED) m_EapolIntfParams.dwEapFlags &= ~EAPOL_ENABLED;
hr = HrElSetInterfaceParams ( wszIntfGuid, &m_EapolIntfParams ); if (FAILED(hr)) { TraceTag (ttidLanUi, "HrElSetInterfaceParams enabled failed with error %ld", LresFromHr(hr)); hrOverall = hr; }
if (hrOverall != S_OK) { hr = hrOverall; }
return LresFromHr(hr); }
//+---------------------------------------------------------------------------
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; }
|