397 lines
13 KiB
C++
397 lines
13 KiB
C++
#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;
|
|
}
|
|
|