windows-nt/Source/XPSP1/NT/net/layer2svc/wlsnp/nfaa.cpp
2020-09-26 16:20:57 +08:00

848 lines
23 KiB
C++

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2001.
//
// File: Nfaa.cpp
//
// Contents: Wireless Policy Snapin - IEEE 8021.x property page for each PS.
//
//
// History: TaroonM
// 10/30/01
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "NFAa.h"
#include "wzcsapi.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPS8021XPropPage property page
IMPLEMENT_DYNCREATE(CPS8021XPropPage, CWirelessBasePage)
CPS8021XPropPage::CPS8021XPropPage(UINT nIDTemplate) : CWirelessBasePage(nIDTemplate)
{
//{{AFX_DATA_INIT(CPS8021XPropPage)
m_dwEnable8021x = FALSE;
m_dwValidateServerCertificate = FALSE;
m_dwMachineAuthentication = FALSE;
m_dwGuestAuthentication = FALSE;
dwEAPUpdated = 0;
pListEapcfgs = NULL;
m_bHasApplied = FALSE;
//}}AFX_DATA_INIT
}
CPS8021XPropPage::CPS8021XPropPage() : CWirelessBasePage(CPS8021XPropPage::IDD)
{
//{{AFX_DATA_INIT(CPS8021XPropPage)
m_dwEnable8021x = FALSE;
m_dwValidateServerCertificate = FALSE;
m_dwMachineAuthentication = FALSE;
m_dwGuestAuthentication = FALSE;
dwEAPUpdated = 0;
pListEapcfgs = NULL;
m_bHasApplied = FALSE;
//}}AFX_DATA_INIT
}
CPS8021XPropPage::~CPS8021XPropPage()
{
EAPCFG* pEapcfg = NULL;
DTLNODE *pNodeEap = NULL;
if (pListEapcfgs) {
// Delete the data allocated using AllocPolMem
for (pNodeEap = DtlGetFirstNode(pListEapcfgs);
pNodeEap;
pNodeEap = DtlGetNextNode(pNodeEap)
)
{
pEapcfg = (EAPCFG* )DtlGetData(pNodeEap);
ASSERT( pEapcfg );
if (pEapcfg->pData) {
FreePolMem(pEapcfg->pData);
}
pEapcfg->pData = NULL;
pEapcfg->cbData = 0;
}
DtlDestroyList (pListEapcfgs, DestroyEapcfgNode);
}
pListEapcfgs = NULL;
}
void CPS8021XPropPage::DoDataExchange(CDataExchange* pDX)
{
CWirelessBasePage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPS8021XPropPage)
DDX_Check(pDX, IDC_ENABLE_8021X, m_dwEnable8021x);
DDX_Control(pDX, IDC_COMBO_8021X_MODE, m_cb8021xMode);
DDX_Check(pDX, IDC_MACHINE_AUTHENTICATION, m_dwMachineAuthentication);
DDX_Check(pDX, IDC_GUEST_AUTHENTICATION, m_dwGuestAuthentication);
DDX_Control(pDX, IDC_COMBO_MC_AUTH_TYPE, m_cbMachineAuthenticationType);
DDX_Text(pDX, IDC_IEEE8021X_MAX_START, m_dwIEEE8021xMaxStart);
DDX_Text(pDX, IDC_IEEE8021X_START_PERIOD, m_dwIEEE8021xStartPeriod);
DDX_Text(pDX, IDC_IEEE8021X_AUTH_PERIOD, m_dwIEEE8021xAuthPeriod);
DDX_Text(pDX, IDC_IEEE8021X_HELD_PERIOD, m_dwIEEE8021xHeldPeriod);
DDX_Control(pDX, IDC_EAP_TYPE_COMBO, m_cbEapType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPS8021XPropPage, CWirelessBasePage)
//{{AFX_MSG_MAP(CPS8021XPropPage)
ON_CBN_SELENDOK(IDC_COMBO_8021X_MODE, OnSel8021xMode)
ON_BN_CLICKED(IDC_ENABLE_8021X, OnCheck8021x)
ON_CBN_SELENDOK(IDC_COMBO_MC_AUTH_TYPE, OnSelMachineAuthenticationType)
ON_BN_CLICKED(IDC_GUEST_AUTHENTICATION, OnCheckGuestAuthentication)
ON_BN_CLICKED(IDC_MACHINE_AUTHENTICATION, OnCheckMachineAuthentication)
ON_EN_CHANGE(IDC_IEEE8021X_MAX_START,OnIEEE8021xParams)
ON_EN_CHANGE(IDC_IEEE8021X_START_PERIOD,OnIEEE8021xParams)
ON_EN_CHANGE(IDC_IEEE8021X_HELD_PERIOD,OnIEEE8021xParams)
ON_EN_CHANGE(IDC_IEEE8021X_AUTH_PERIOD,OnIEEE8021xParams)
ON_CBN_SELENDOK(IDC_EAP_TYPE_COMBO, OnSelEapType)
ON_BN_CLICKED(IDC_EAP_CONFIGURE, OnProperties)
ON_WM_HELPINFO()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPS8021XPropPage message handlers
BOOL CPS8021XPropPage::OnInitDialog()
{
DWORD dwIEEE8021xMaxStart;
DWORD dwIEEE8021xStartPeriod;
DWORD dwIEEE8021xAuthPeriod;
DWORD dwIEEE8021xHeldPeriod;
CString pszIEEE8021xMaxStart;
CString pszIEEE8021xStartPeriod;
CString pszIEEE8021xAuthPeriod;
CString pszIEEE8021xHeldPeriod;
CString pszTemp;
DWORD dwEapIndex;
DWORD dw8021xModeIndex;
DWORD dwMachineAuthenticationTypeIndex;
DWORD dwCertTypeIndex;
DWORD dwEAPType = 0;
DWORD dwEAPDataLen = 0;
LPBYTE pbEAPData = NULL;
DTLNODE* pOriginalEapcfgNode = NULL;
BYTE *pbData = NULL;
DWORD cbData = 0;
DTLNODE* pNode = NULL;
DWORD i = 0;
DWORD dwEAPSel = 0;
m_bHasApplied = FALSE;
CWirelessBasePage::OnInitDialog();
ASSERT( NULL != WirelessPS() );
// get data from storage
PWIRELESS_PS_DATA pWirelessPSData = NULL;
pWirelessPSData = WirelessPS();
dwEAPType = pWirelessPSData->dwEapType;
dwEAPDataLen = pWirelessPSData->dwEAPDataLen;
pbEAPData = pWirelessPSData->pbEAPData;
// Initialize EAP package list
// Read the EAPCFG information from the registry and find the node
// selected in the entry, or the default, if none.
pListEapcfgs = NULL;
pListEapcfgs = ::ReadEapcfgList (EAPOL_MUTUAL_AUTH_EAP_ONLY);
if (pListEapcfgs)
{
for (pNode = DtlGetFirstNode(pListEapcfgs);
pNode;
pNode = DtlGetNextNode(pNode)
)
{
EAPCFG* pEapcfg = (EAPCFG* )DtlGetData(pNode);
ASSERT( pEapcfg );
cbData = 0;
pbData = NULL;
i = m_cbEapType.AddString(pEapcfg->pszFriendlyName);
m_cbEapType.SetItemDataPtr(i, pNode);
if (pEapcfg->dwKey == dwEAPType) {
cbData = dwEAPDataLen;
if (dwEAPDataLen) {
pbData = (LPBYTE) AllocPolMem(dwEAPDataLen);
if (!pbData) {
return FALSE;
}
memcpy(pbData, pbEAPData, dwEAPDataLen);
}
dwEAPSel = i;
}
pEapcfg->pData = pbData;
pEapcfg->cbData = cbData;
}
// Choose the EAP name that will appear in the combo box
m_cbEapType.SetCurSel(dwEAPSel);
}
m_dwIEEE8021xMaxStart =
pWirelessPSData->dwIEEE8021xMaxStart;
m_dwIEEE8021xStartPeriod =
pWirelessPSData->dwIEEE8021xStartPeriod;
m_dwIEEE8021xAuthPeriod =
pWirelessPSData->dwIEEE8021xAuthPeriod;
m_dwIEEE8021xHeldPeriod =
pWirelessPSData->dwIEEE8021xHeldPeriod;
m_dwGuestAuthentication =
pWirelessPSData->dwGuestAuthentication ? TRUE : FALSE;
m_dwEnable8021x =
pWirelessPSData->dwEnable8021x ? TRUE : FALSE;
pszTemp.LoadString(IDS_8021X_MODE_NO_TRANSMIT);
m_cb8021xMode.AddString(pszTemp);
pszTemp.LoadString(IDS_8021X_MODE_NAS_TRANSMIT);
m_cb8021xMode.AddString(pszTemp);
pszTemp.LoadString(IDS_8021X_MODE_TRANSMIT);
m_cb8021xMode.AddString(pszTemp);
switch (pWirelessPSData->dw8021xMode)
{
case WIRELESS_8021X_MODE_NO_TRANSMIT_EAPOLSTART_WIRED:
dw8021xModeIndex = 0;
break;
case WIRELESS_8021X_MODE_NAS_TRANSMIT_EAPOLSTART_WIRED:
dw8021xModeIndex = 1;
break;
case WIRELESS_8021X_MODE_TRANSMIT_EAPOLSTART_WIRED:
dw8021xModeIndex = 2;
break;
default:
dw8021xModeIndex = 0;
break;
}
m_cb8021xMode.SetCurSel(dw8021xModeIndex);
m_dwMachineAuthentication =
pWirelessPSData->dwMachineAuthentication ? TRUE : FALSE;
pszTemp.LoadString(IDS_MC_AUTH_TYPE_MC_NO_USER);
m_cbMachineAuthenticationType.AddString(pszTemp);
pszTemp.LoadString(IDS_MC_AUTH_TYPE_USER_DONTCARE_MC);
m_cbMachineAuthenticationType.AddString(pszTemp);
pszTemp.LoadString(IDS_MC_AUTH_TYPE_MC_ONLY);
m_cbMachineAuthenticationType.AddString(pszTemp);
switch (pWirelessPSData->dwMachineAuthenticationType)
{
case WIRELESS_MC_AUTH_TYPE_MC_NO_USER:
dwMachineAuthenticationTypeIndex = 0;
break;
case WIRELESS_MC_AUTH_TYPE_USER_DONTCARE_MC:
dwMachineAuthenticationTypeIndex = 1;
break;
case WIRELESS_MC_AUTH_TYPE_MC_ONLY:
dwMachineAuthenticationTypeIndex = 2;
break;
default:
dwMachineAuthenticationTypeIndex = 0;
break;
}
m_cbMachineAuthenticationType.SetCurSel(dwMachineAuthenticationTypeIndex);
DisplayEnable8021x();
if (m_bReadOnly) {
DisableControls();
}
// set radio correctly
UpdateData (FALSE);
// set radio controled edits correctly
//OnRadioAdapterType();
// OK, we can start paying attention to modifications made via dlg controls now.
// This should be the last call before returning from OnInitDialog.
OnFinishInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void
CPS8021XPropPage::DisplayEnable8021x()
{
if(m_dwEnable8021x) {
SAFE_ENABLEWINDOW(IDC_COMBO_8021X_MODE, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_MODE, TRUE);
SAFE_ENABLEWINDOW(IDC_EAP_TYPE_COMBO, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_EAP_TYPE, TRUE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_MAX_START, TRUE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_START_PERIOD, TRUE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_HELD_PERIOD, TRUE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_AUTH_PERIOD, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_MAX_START, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_START_PERIOD, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_HELD_PERIOD, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_PERIOD, TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_PARAMS, TRUE);
DisplayEapType();
} else {
SAFE_ENABLEWINDOW(IDC_COMBO_8021X_MODE,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_MODE,FALSE);
SAFE_ENABLEWINDOW(IDC_EAP_TYPE_COMBO,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_EAP_TYPE, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_MAX_START, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_START_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_HELD_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_AUTH_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_MAX_START, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_START_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_HELD_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_PARAMS, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,FALSE);
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,FALSE);
SAFE_ENABLEWINDOW(IDC_EAP_CONFIGURE, FALSE);
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
}
return;
}
void
CPS8021XPropPage::DisplayEapType()
{
DWORD dwEapIndex = 0;
DTLNODE *pNode = NULL;
EAPCFG *pEapcfg = NULL;
DWORD dwEAPType = 0;
dwEapIndex = m_cbEapType.GetCurSel();
pNode = (DTLNODE *) m_cbEapType.GetItemDataPtr(dwEapIndex);
ASSERT( pNode );
pEapcfg = (EAPCFG* )DtlGetData( pNode );
ASSERT( pEapcfg );
dwEAPType = pEapcfg->dwKey;
switch (dwEAPType) {
case EAP_TYPE_MD5:
// dwEapType = WIRELESS_EAP_TYPE_MD5;
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,FALSE);
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,FALSE);
SAFE_ENABLEWINDOW(IDC_EAP_CONFIGURE, FALSE);
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
break;
default :
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,TRUE);
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,TRUE);
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,TRUE);
SAFE_ENABLEWINDOW(IDC_EAP_CONFIGURE, TRUE);
DisplayMachineAuthentication();
break;
}
}
void
CPS8021XPropPage::DisplayMachineAuthentication()
{
if (m_dwMachineAuthentication) {
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,TRUE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE, TRUE);
} else {
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
}
}
BOOL CPS8021XPropPage::OnWizardFinish()
{
// just transfer to our OnApply, as it does the right stuff
if (OnApply())
{
// go ahead and finish
return TRUE;
}
// don't allow us to finish
return FALSE;
}
LRESULT CPS8021XPropPage::OnWizardNext()
{
// just transfer to our OnApply, as it does the right stuff
if (ControlDataToWirelessPS())
{
// go ahead and move to next page
return CWirelessBasePage::OnWizardNext();
}
// don't allow us to go on to the next page
return -1;
}
BOOL CPS8021XPropPage::OnApply()
{
if (!m_bReadOnly) {
// Save data from page
if (!m_bHasApplied)
{
ControlDataToWirelessPS();
}
}
// ok, everything is cool
return CWirelessBasePage::OnApply();
}
void CPS8021XPropPage::OnCheck8021x()
{
UpdateData(TRUE);
SetModified();
DisplayEnable8021x();
}
void CPS8021XPropPage::OnSel8021xMode()
{
UpdateData(TRUE);
SetModified();
}
void CPS8021XPropPage::OnSelCertType()
{
UpdateData(TRUE);
SetModified();
}
void CPS8021XPropPage::OnCheckValidateServerCert()
{
UpdateData(TRUE);
SetModified();
//DisableWindow(m_hwnd8021xCheck);
}
void CPS8021XPropPage::OnSelMachineAuthenticationType()
{
UpdateData(TRUE);
SetModified();
}
void CPS8021XPropPage::OnCheckGuestAuthentication()
{
UpdateData (TRUE);
SetModified();
}
void CPS8021XPropPage::OnCheckMachineAuthentication()
{
UpdateData (TRUE);
SetModified();
DisplayMachineAuthentication();
}
void CPS8021XPropPage::OnIEEE8021xParams()
{
UpdateData (TRUE);
SetModified();
}
void CPS8021XPropPage::OnSelEapType()
{
UpdateData(TRUE);
SetModified();
dwEAPUpdated = 1;
DisplayEapType();
}
BOOL CPS8021XPropPage::OnHelpInfo(HELPINFO* pHelpInfo)
{
if (pHelpInfo->iContextType == HELPINFO_WINDOW)
{
DWORD* pdwHelp = (DWORD*) &g_aHelpIDs_IDD_8021X_PROPERTY_PAGE[0];
::WinHelp ((HWND)pHelpInfo->hItemHandle,
c_szWlsnpHelpFile,
HELP_WM_HELP,
(DWORD_PTR)(LPVOID)pdwHelp);
}
return CWirelessBasePage::OnHelpInfo(pHelpInfo);
}
BOOL CPS8021XPropPage::ControlDataToWirelessPS()
{
PWIRELESS_PS_DATA pWirelessPSData = NULL;
LPWSTR pszNewInterfaceName = NULL;
DWORD dwIEEE8021xMaxStart;
DWORD dwIEEE8021xStartPeriod;
DWORD dwIEEE8021xAuthPeriod;
DWORD dwIEEE8021xHeldPeriod;
CString pszIEEE8021xMaxStart;
CString pszIEEE8021xStartPeriod;
CString pszIEEE8021xAuthPeriod;
CString pszIEEE8021xHeldPeriod;
DWORD dwEnable8021x;
DWORD dw8021xMode;
DWORD dwEapType;
DWORD dwCertificateType;
DWORD dwValidateServerCertificate;
DWORD dwMachineAuthentication;
DWORD dwMachineAuthenticationType;
DWORD dwGuestAuthentication;
DWORD dwEapIndex;
DWORD dw8021xModeIndex;
DWORD dwMachineAuthenticationTypeIndex;
DWORD dwCertificateTypeIndex;
DTLNODE *pNode = NULL;
EAPCFG *pEapcfg = NULL;
pWirelessPSData = WirelessPS();
UpdateData (TRUE);
dwEnable8021x =
m_dwEnable8021x ? 1 : 0;
dw8021xModeIndex = m_cb8021xMode.GetCurSel();
switch (dw8021xModeIndex) {
case 0 :
dw8021xMode =
WIRELESS_8021X_MODE_NO_TRANSMIT_EAPOLSTART_WIRED;
break;
case 1 :
dw8021xMode =
WIRELESS_8021X_MODE_NAS_TRANSMIT_EAPOLSTART_WIRED;
break;
case 2 :
dw8021xMode =
WIRELESS_8021X_MODE_TRANSMIT_EAPOLSTART_WIRED;
break;
}
dwEapIndex = m_cbEapType.GetCurSel();
pNode = (DTLNODE *) m_cbEapType.GetItemDataPtr(dwEapIndex);
ASSERT( pNode );
pEapcfg = (EAPCFG* )DtlGetData( pNode );
ASSERT( pEapcfg );
dwEapType = pEapcfg->dwKey;
if (dwEAPUpdated) {
// since pEapcfg->pData is created by us, copy the pointer as is.
if (pWirelessPSData->pbEAPData) {
FreePolMem(pWirelessPSData->pbEAPData);
}
pWirelessPSData->dwEAPDataLen = pEapcfg->cbData;
pWirelessPSData->pbEAPData = pEapcfg->pData;
pEapcfg->cbData = 0;
pEapcfg->pData = NULL;
}
dwCertificateTypeIndex = m_cbCertificateType.GetCurSel();
switch (dwCertificateTypeIndex) {
case 0 :
dwCertificateType =
WIRELESS_CERT_TYPE_SMARTCARD;
break;
case 1 :
dwCertificateType =
WIRELESS_CERT_TYPE_MC_CERT;
break;
}
dwValidateServerCertificate =
m_dwValidateServerCertificate ? 1 : 0;
dwMachineAuthentication =
m_dwMachineAuthentication ? 1 : 0;
dwMachineAuthenticationTypeIndex = m_cbMachineAuthenticationType.GetCurSel();
switch (dwMachineAuthenticationTypeIndex)
{
case 0 :
dwMachineAuthenticationType =
WIRELESS_MC_AUTH_TYPE_MC_NO_USER;
break;
case 1 :
dwMachineAuthenticationType =
WIRELESS_MC_AUTH_TYPE_USER_DONTCARE_MC;
break;
case 2 :
dwMachineAuthenticationType =
WIRELESS_MC_AUTH_TYPE_MC_ONLY;
break;
}
dwGuestAuthentication =
m_dwGuestAuthentication ? 1 : 0;
pWirelessPSData->dwEnable8021x = dwEnable8021x;
pWirelessPSData->dw8021xMode = dw8021xMode;
pWirelessPSData->dwEapType = dwEapType;
pWirelessPSData->dwMachineAuthentication = dwMachineAuthentication;
pWirelessPSData->dwMachineAuthenticationType = dwMachineAuthenticationType;
pWirelessPSData->dwGuestAuthentication = dwGuestAuthentication;
pWirelessPSData->dwIEEE8021xMaxStart =
m_dwIEEE8021xMaxStart;
pWirelessPSData->dwIEEE8021xStartPeriod =
m_dwIEEE8021xStartPeriod;
pWirelessPSData->dwIEEE8021xAuthPeriod =
m_dwIEEE8021xAuthPeriod;
pWirelessPSData->dwIEEE8021xHeldPeriod =
m_dwIEEE8021xHeldPeriod;
m_bHasApplied = TRUE;
return TRUE;
}
void
CPS8021XPropPage::Initialize (
PWIRELESS_PS_DATA pWirelessPSData,
CComponentDataImpl* pComponentDataImpl,
BOOL dwFlags = WLSTORE_READWRITE
)
{
m_bReadOnly = dwFlags & WLSTORE_READONLY;
CWirelessBasePage::Initialize(pWirelessPSData, pComponentDataImpl);
}
void CPS8021XPropPage::DisableControls()
{
SAFE_ENABLEWINDOW(IDC_ENABLE_8021X, FALSE);
SAFE_ENABLEWINDOW(IDC_COMBO_8021X_MODE,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_MODE,FALSE);
SAFE_ENABLEWINDOW(IDC_EAP_TYPE_COMBO,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_EAP_TYPE, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_MAX_START, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_START_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_HELD_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_IEEE8021X_AUTH_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_MAX_START, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_START_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_HELD_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_PERIOD, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_8021X_PARAMS, FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_CERT_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_MACHINE_AUTHENTICATION,FALSE);
SAFE_ENABLEWINDOW(IDC_GUEST_AUTHENTICATION,FALSE);
SAFE_ENABLEWINDOW(IDC_COMBO_MC_AUTH_TYPE,FALSE);
SAFE_ENABLEWINDOW(IDC_STATIC_AUTH_TYPE,FALSE);
}
DWORD
CPS8021XPropPage::OnProperties(
)
{
DWORD dwError = 0;
DTLNODE* pNode = NULL;
EAPCFG* pEapcfg = NULL;
RASEAPINVOKECONFIGUI pInvokeConfigUi;
RASEAPFREE pFreeConfigUIData;
HINSTANCE h;
BYTE* pbEAPData = NULL;
DWORD cbEAPData = 0;
HWND hWnd;
LPBYTE pbNewEAPData = NULL;
DWORD dwEapTypeIndex = 0;
// Look up the selected package configuration and load the associated
// configuration DLL.
dwEapTypeIndex = m_cbEapType.GetCurSel();
pNode = (DTLNODE *) m_cbEapType.GetItemDataPtr(dwEapTypeIndex);
if (!pNode)
{
return E_UNEXPECTED;
}
pEapcfg = (EAPCFG* )DtlGetData( pNode );
ASSERT( pEapcfg );
if (!pEapcfg) {
return E_UNEXPECTED;
}
h = NULL;
if (!(h = LoadLibrary( pEapcfg->pszConfigDll ))
|| !(pInvokeConfigUi =
(RASEAPINVOKECONFIGUI )GetProcAddress(
h, "RasEapInvokeConfigUI" ))
|| !(pFreeConfigUIData =
(RASEAPFREE) GetProcAddress(
h, "RasEapFreeMemory" )))
{
// Cannot load configuration DLL
if (h)
{
FreeLibrary( h );
}
return E_FAIL;
}
// Call the configuration DLL to popup it's custom configuration UI.
pbEAPData = NULL;
cbEAPData = 0;
hWnd = GetParent()->m_hWnd;
dwError = pInvokeConfigUi(
pEapcfg->dwKey,
hWnd,
0,
pEapcfg->pData,
pEapcfg->cbData,
&pbEAPData,
&cbEAPData
);
/*TAROON* User hitting cancel is also an error */
if (dwError)
{
FreeLibrary( h );
return E_FAIL;
}
if (pbEAPData && cbEAPData)
{
// Copy it into the eap node
pbNewEAPData = (LPBYTE) AllocPolMem(cbEAPData);
if (!pbNewEAPData)
{
dwError = GetLastError();
return(dwError);
}
memcpy(pbNewEAPData, pbEAPData, cbEAPData);
}
pFreeConfigUIData( pbEAPData );
if (pEapcfg->pData) {
FreePolMem(pEapcfg->pData);
}
pEapcfg->pData = pbNewEAPData;
pEapcfg->cbData = cbEAPData;
dwEAPUpdated = 1;
FreeLibrary( h );
return dwError;
}
void
CPS8021XPropPage::OnCancel()
{
EAPCFG* pEapcfg = NULL;
DTLNODE *pNodeEap = NULL;
if (pListEapcfgs) {
// Delete the data allocated using AllocPolMem
for (pNodeEap = DtlGetFirstNode(pListEapcfgs);
pNodeEap;
pNodeEap = DtlGetNextNode(pNodeEap)
)
{
pEapcfg = (EAPCFG* )DtlGetData(pNodeEap);
ASSERT( pEapcfg );
if (pEapcfg->pData) {
FreePolMem(pEapcfg->pData);
}
pEapcfg->pData = NULL;
pEapcfg->cbData = 0;
}
DtlDestroyList (pListEapcfgs, DestroyEapcfgNode);
}
pListEapcfgs = NULL;
}