//---------------------------------------------------------------------------- // // 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; }