//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: genpage.cpp // //-------------------------------------------------------------------------- // genpage.cpp : implementation file // #include "stdafx.h" #include "certca.h" #include "tfcprop.h" #include "genpage.h" // sddl.h requires this value to be at least // 0x0500. Bump it up if necessary. NOTE: This // 'bump' comes after all other H files that may // be sensitive to this value. #if(_WIN32_WINNT < 0x500) #undef _WIN32_WINNT #define _WIN32_WINNT 0x0500 #endif #include #include "helparr.h" #define __dwFILE__ __dwFILE_CAPESNPN_GENPAGE_CPP__ #define DURATION_INDEX_YEARS 0 #define DURATION_INDEX_MONTHS 1 #define DURATION_INDEX_WEEKS 2 #define DURATION_INDEX_DAYS 3 void myDisplayError(HWND hwnd, HRESULT hr, UINT id) { CString cstrTitle, cstrFullText; cstrTitle.LoadString(IDS_SNAPIN_NAME); if (hr != S_OK) { WCHAR const *pwszError = myGetErrorMessageText(hr, TRUE); cstrFullText = pwszError; // Free the buffer if (NULL != pwszError) { LocalFree(const_cast(pwszError)); } } if (id != -1) { CString cstrMsg; cstrMsg.LoadString(id); cstrFullText += cstrMsg; } ::MessageBoxW(hwnd, cstrFullText, cstrTitle, MB_OK | MB_ICONERROR); } ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// // replacement for DoDataExchange BOOL CAutoDeletePropPage::UpdateData(BOOL fSuckFromDlg /*= TRUE*/) { if (fSuckFromDlg) { // m_cstrModuleName.FromWindow(GetDlgItem(m_hWnd, IDC_MODULENAME)); } else { // m_cstrModuleName.ToWindow(GetDlgItem(m_hWnd, IDC_MODULENAME)); } return TRUE; } // replacement for BEGIN_MESSAGE_MAP BOOL CAutoDeletePropPage::OnCommand(WPARAM wParam, LPARAM lParam) { /* switch(LOWORD(wParam)) { default: return FALSE; break; } */ return TRUE; } ///////////////////////////////////////////////////////////////////// // Constructor CAutoDeletePropPage::CAutoDeletePropPage(UINT uIDD) : PropertyPage(uIDD) { m_prgzHelpIDs = NULL; m_autodeleteStuff.cWizPages = 1; // Number of pages in wizard m_autodeleteStuff.pfnOriginalPropSheetPageProc = m_psp.pfnCallback; m_psp.dwFlags |= PSP_USECALLBACK; m_psp.pfnCallback = S_PropSheetPageProc; m_psp.lParam = reinterpret_cast(this); } CAutoDeletePropPage::~CAutoDeletePropPage() { } ///////////////////////////////////////////////////////////////////// void CAutoDeletePropPage::SetCaption(LPCTSTR pszCaption) { m_strCaption = pszCaption; // Copy the caption m_psp.pszTitle = m_strCaption; // Set the title m_psp.dwFlags |= PSP_USETITLE; } ///////////////////////////////////////////////////////////////////// void CAutoDeletePropPage::SetCaption(UINT uStringID) { VERIFY(m_strCaption.LoadString(uStringID)); SetCaption(m_strCaption); } ///////////////////////////////////////////////////////////////////// void CAutoDeletePropPage::SetHelp(LPCTSTR szHelpFile, const DWORD rgzHelpIDs[]) { //szHelpFile == NULL; // TRUE => No help file supplied (meaning no help) //rgzHelpIDs == NULL; // TRUE => No help at all m_strHelpFile = szHelpFile; m_prgzHelpIDs = rgzHelpIDs; } ///////////////////////////////////////////////////////////////////// void CAutoDeletePropPage::EnableDlgItem(INT nIdDlgItem, BOOL fEnable) { ASSERT(IsWindow(::GetDlgItem(m_hWnd, nIdDlgItem))); ::EnableWindow(::GetDlgItem(m_hWnd, nIdDlgItem), fEnable); } ///////////////////////////////////////////////////////////////////// BOOL CAutoDeletePropPage::OnSetActive() { HWND hwndParent = ::GetParent(m_hWnd); ASSERT(IsWindow(hwndParent)); ::PropSheet_SetWizButtons(hwndParent, PSWIZB_FINISH); return PropertyPage::OnSetActive(); } ///////////////////////////////////////////////////////////////////// void CAutoDeletePropPage::OnContextHelp(HWND hwnd) { if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty()) return; ASSERT(IsWindow(hwnd)); if(HasContextHelp(GetDlgCtrlID(hwnd))) { ::WinHelp( hwnd, m_strHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)m_prgzHelpIDs); } return; } ///////////////////////////////////////////////////////////////////// void CAutoDeletePropPage::OnHelp(LPHELPINFO pHelpInfo) { if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty()) return; if (pHelpInfo != NULL && pHelpInfo->iContextType == HELPINFO_WINDOW && HasContextHelp(pHelpInfo->iCtrlId)) { // Display context help for a control ::WinHelp((HWND)pHelpInfo->hItemHandle, m_strHelpFile, HELP_WM_HELP, (ULONG_PTR)(LPVOID)m_prgzHelpIDs); } return; } ///////////////////////////////////////////////////////////////////// bool CAutoDeletePropPage::HasContextHelp(int nDlgItem) { const DWORD * pdwHelpIDs; for(pdwHelpIDs = m_prgzHelpIDs; *pdwHelpIDs; pdwHelpIDs += 2) { if(nDlgItem == *pdwHelpIDs) return true; } return false; } ///////////////////////////////////////////////////////////////////// // S_PropSheetPageProc() // // Static member function used to delete the CAutoDeletePropPage object // when wizard terminates // UINT CALLBACK CAutoDeletePropPage::S_PropSheetPageProc( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp) { ASSERT(ppsp != NULL); CAutoDeletePropPage *pThis; pThis = reinterpret_cast(ppsp->lParam); ASSERT(pThis != NULL); BOOL fDefaultRet; switch (uMsg) { case PSPCB_RELEASE: fDefaultRet = FALSE; if (--(pThis->m_autodeleteStuff.cWizPages) <= 0) { // Remember callback on stack since "this" will be deleted LPFNPSPCALLBACK pfnOrig = pThis->m_autodeleteStuff.pfnOriginalPropSheetPageProc; delete pThis; if (pfnOrig) return (pfnOrig)(hwnd, uMsg, ppsp); else return fDefaultRet; } break; case PSPCB_CREATE: fDefaultRet = TRUE; // do not increase refcount, PSPCB_CREATE may or may not be called // depending on whether the page was created. PSPCB_RELEASE can be // depended upon to be called exactly once per page however. break; } // switch if (pThis->m_autodeleteStuff.pfnOriginalPropSheetPageProc) return (pThis->m_autodeleteStuff.pfnOriginalPropSheetPageProc)(hwnd, uMsg, ppsp); else return fDefaultRet; } // CAutoDeletePropPage::S_PropSheetPageProc() ////////////////////////////// // hand-hewn pages //// // 1 /////////////////////////////////////////// // CCertTemplateGeneralPage ///////////////////////////////////////////////////////////////////////////// // CCertTemplateGeneralPage property page CCertTemplateGeneralPage::CCertTemplateGeneralPage(HCERTTYPE hCertType, UINT uIDD) : CAutoDeletePropPage(uIDD), m_hCertType(hCertType) { m_hConsoleHandle = NULL; m_bUpdate = FALSE; SetHelp(CAPESNPN_HELPFILENAME , g_aHelpIDs_IDD_CERTIFICATE_TEMPLATE_PROPERTIES_GENERAL_PAGE); } CCertTemplateGeneralPage::~CCertTemplateGeneralPage() { } // replacement for DoDataExchange BOOL CCertTemplateGeneralPage::UpdateData(BOOL fSuckFromDlg /*= TRUE*/) { if (fSuckFromDlg) { // m_cstrModuleName.FromWindow(GetDlgItem(m_hWnd, IDC_MODULENAME)); } else { // m_cstrModuleName.ToWindow(GetDlgItem(m_hWnd, IDC_MODULENAME)); } return TRUE; } // replacement for BEGIN_MESSAGE_MAP BOOL CCertTemplateGeneralPage::OnCommand(WPARAM wParam, LPARAM lParam) { /* switch(LOWORD(wParam)) { default: return FALSE; break; } */ return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CCertTemplateGeneralPage message handlers void CCertTemplateGeneralPage::OnDestroy() { // Note - This needs to be called only once. // If called more than once, it will gracefully return an error. if (m_hConsoleHandle) MMCFreeNotifyHandle(m_hConsoleHandle); m_hConsoleHandle = NULL; CAutoDeletePropPage::OnDestroy(); } void CCertTemplateGeneralPage::SetItemTextWrapper(UINT nID, int *piItem, BOOL fDoInsert, BOOL *pfFirstUsageItem) { CString szOtherInfoName; if (fDoInsert) { szOtherInfoName.LoadString(nID); if (!(*pfFirstUsageItem)) { ListView_NewItem(m_hwndOtherInfoList, *piItem, L""); } else { *pfFirstUsageItem = FALSE; } ListView_SetItemText(m_hwndOtherInfoList, *piItem, 1, (LPWSTR)(LPCWSTR)szOtherInfoName); (*piItem)++; } } BOOL CCertTemplateGeneralPage::OnInitDialog() { // does parent init and UpdateData call CAutoDeletePropPage::OnInitDialog(); m_hwndPurposesList = GetDlgItem(m_hWnd, IDC_PURPOSE_LIST); m_hwndOtherInfoList = GetDlgItem(m_hWnd, IDC_OTHER_INFO_LIST); int i=0; CString **aszUsages = NULL; DWORD cNumUsages; WCHAR **pszNameArray = NULL; CString szOtherInfoName; CRYPT_BIT_BLOB *pBitBlob; BOOL fPublicKeyUsageCritical; BOOL bKeyUsageFirstItem = TRUE; BOOL fCA; BOOL fPathLenConstraint; DWORD dwPathLenConstraint; WCHAR szNumberString[256]; CString szAll; BOOL fEKUCritical; DWORD dwFlags; HRESULT hr; // // get the name of the certificate template and set it in the dialog // if((S_OK == CAGetCertTypeProperty(m_hCertType, CERTTYPE_PROP_FRIENDLY_NAME, &pszNameArray)) && (pszNameArray != NULL)) { SendMessage(GetDlgItem(m_hWnd, IDC_CERTIFICATE_TEMPLATE_NAME), EM_SETSEL, 0, -1); SendMessage(GetDlgItem(m_hWnd, IDC_CERTIFICATE_TEMPLATE_NAME), EM_REPLACESEL, FALSE, (LPARAM)(LPCWSTR)pszNameArray[0]); CAFreeCertTypeProperty(m_hCertType, pszNameArray); } // // get the list of purposes for this certificate template and // add all of them to the list in the dialog // ListView_NewColumn(m_hwndPurposesList, 0, 200); if(!MyGetEnhancedKeyUsages(m_hCertType, NULL, &cNumUsages, &fEKUCritical, FALSE)) { return FALSE; } if (cNumUsages == 0) { szAll.LoadString(IDS_ALL); ListView_NewItem(m_hwndPurposesList, i, szAll); } else { aszUsages = new CString*[cNumUsages]; if(!aszUsages) return FALSE; if(!MyGetEnhancedKeyUsages(m_hCertType, aszUsages, &cNumUsages, &fEKUCritical, FALSE)) { delete[] aszUsages; return FALSE; } for (i=0; i<(LONG)cNumUsages; i++) { ListView_NewItem(m_hwndPurposesList, i, *(aszUsages[i])); delete(aszUsages[i]); } delete[] aszUsages; } ListView_SetColumnWidth(m_hwndPurposesList, 0, LVSCW_AUTOSIZE); // // add the other certificate type info // ListView_NewColumn(m_hwndOtherInfoList, 0, 200); ListView_NewColumn(m_hwndOtherInfoList, 1, 200); // // add include email address flag to other certificate type info // szOtherInfoName.LoadString(IDS_INCLUDE_EMAIL_ADDRESS); i = 0; ListView_NewItem(m_hwndOtherInfoList, i, szOtherInfoName); hr = CAGetCertTypeFlags(m_hCertType, &dwFlags); if (FAILED(hr)) { return FALSE; } if (dwFlags & CT_FLAG_ADD_EMAIL) szOtherInfoName.LoadString(IDS_YES); else szOtherInfoName.LoadString(IDS_NO); ListView_SetItemText(m_hwndOtherInfoList, i++, 1, (LPWSTR)(LPCWSTR)szOtherInfoName); // // add key usages to other certificate type info // if (MyGetKeyUsages(m_hCertType, &pBitBlob, &fPublicKeyUsageCritical)) { szOtherInfoName.LoadString(IDS_PUBLIC_KEY_USAGE_LIST); ListView_NewItem(m_hwndOtherInfoList, i, szOtherInfoName); if (pBitBlob->cbData >= 1) { SetItemTextWrapper( IDS_DIGITAL_SIGNATURE_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_DIGITAL_SIGNATURE_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_NON_REPUDIATION_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_NON_REPUDIATION_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_KEY_ENCIPHERMENT_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_KEY_ENCIPHERMENT_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_DATA_ENCIPHERMENT_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_DATA_ENCIPHERMENT_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_KEY_AGREEMENT_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_KEY_AGREEMENT_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_KEY_CERT_SIGN_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_KEY_CERT_SIGN_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_OFFLINE_CRL_SIGN_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_OFFLINE_CRL_SIGN_KEY_USAGE, &bKeyUsageFirstItem); SetItemTextWrapper( IDS_ENCIPHER_ONLY_KEY_USAGE, &i, pBitBlob->pbData[0] & CERT_ENCIPHER_ONLY_KEY_USAGE, &bKeyUsageFirstItem); } if (pBitBlob->cbData >= 2) { SetItemTextWrapper( IDS_DECIPHER_ONLY_KEY_USAGE, &i, pBitBlob->pbData[1] & CERT_DECIPHER_ONLY_KEY_USAGE, &bKeyUsageFirstItem); } szOtherInfoName.LoadString(IDS_PUBLIC_KEY_USAGE_CRITICAL); ListView_NewItem(m_hwndOtherInfoList, i, szOtherInfoName); if (fPublicKeyUsageCritical) szOtherInfoName.LoadString(IDS_YES); else szOtherInfoName.LoadString(IDS_NO); ListView_SetItemText(m_hwndOtherInfoList, i++, 1, (LPWSTR)(LPCWSTR)szOtherInfoName); delete[]((BYTE *)pBitBlob); } // // maybe we should add a display of whether this is a ca cert or not // /* if (MyGetBasicConstraintInfo(m_hCertType, &fCA, &fPathLenConstraint, &dwPathLenConstraint)) { } */ ListView_SetColumnWidth(m_hwndOtherInfoList, 0, LVSCW_AUTOSIZE); ListView_SetColumnWidth(m_hwndOtherInfoList, 1, LVSCW_AUTOSIZE); return TRUE; } BOOL CCertTemplateGeneralPage::OnApply() { DWORD dwRet; if (m_bUpdate == TRUE) { m_bUpdate = FALSE; } return CAutoDeletePropPage::OnApply(); } ///////////////////////////////////////////////////////////////////////////// // CCertTemplateSelectDialog property page CCertTemplateSelectDialog::CCertTemplateSelectDialog(HWND hParent) : m_hCAInfo(NULL) { SetHelp(CAPESNPN_HELPFILENAME , g_aHelpIDs_IDD_SELECT_CERTIFICATE_TEMPLATE); } CCertTemplateSelectDialog::~CCertTemplateSelectDialog() { } // replacement for DoDataExchange BOOL CCertTemplateSelectDialog::UpdateData(BOOL fSuckFromDlg /*= TRUE*/) { if (fSuckFromDlg) { // m_cstrModuleName.FromWindow(GetDlgItem(m_hWnd, IDC_MODULENAME)); } else { // m_cstrModuleName.ToWindow(GetDlgItem(m_hWnd, IDC_MODULENAME)); } return TRUE; } // replacement for BEGIN_MESSAGE_MAP BOOL CCertTemplateSelectDialog::OnCommand(WPARAM wParam, LPARAM lParam) { /* switch(LOWORD(wParam)) { default: return FALSE; break; } */ return TRUE; } BOOL CCertTemplateSelectDialog::OnNotify(UINT idCtrl, NMHDR* pnmh) { switch(idCtrl) { case IDC_CERTIFICATE_TYPE_LIST: if (LVN_ITEMCHANGED == pnmh->code) { OnSelChange(pnmh); break; } else if (NM_DBLCLK == pnmh->code) { SendMessage(m_hDlg, WM_COMMAND, IDOK, NULL); break; } default: return FALSE; } return TRUE; } BOOL CertTypeAlreadyExists(WCHAR *szCertTypeName, WCHAR **aszCertTypesCurrentlySupported) { int i = 0; // // if there are no cert types then obvisously this one doesn't already exist // if (aszCertTypesCurrentlySupported == NULL) { return FALSE; } while (aszCertTypesCurrentlySupported[i] != NULL) { if (wcscmp(szCertTypeName, aszCertTypesCurrentlySupported[i]) == 0) { return TRUE; } i++; } return FALSE; } ///////////////////////////////////////////////////////////////////// void CCertTemplateSelectDialog::SetHelp(LPCTSTR szHelpFile, const DWORD rgzHelpIDs[]) { //szHelpFile == NULL; // TRUE => No help file supplied (meaning no help) //rgzHelpIDs == NULL; // TRUE => No help at all m_strHelpFile = szHelpFile; m_prgzHelpIDs = rgzHelpIDs; } ///////////////////////////////////////////////////////////////////// void CCertTemplateSelectDialog::OnContextHelp(HWND hwnd) { if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty()) return; ASSERT(IsWindow(hwnd)); if(HasContextHelp(GetDlgCtrlID(hwnd))) { ::WinHelp( hwnd, m_strHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)m_prgzHelpIDs); } return; } ///////////////////////////////////////////////////////////////////// void CCertTemplateSelectDialog::OnHelp(LPHELPINFO pHelpInfo) { if (m_prgzHelpIDs == NULL || m_strHelpFile.IsEmpty()) return; if (pHelpInfo != NULL && pHelpInfo->iContextType == HELPINFO_WINDOW && HasContextHelp(pHelpInfo->iCtrlId)) { // Display context help for a control ::WinHelp((HWND)pHelpInfo->hItemHandle, m_strHelpFile, HELP_WM_HELP, (ULONG_PTR)(LPVOID)m_prgzHelpIDs); } return; } ///////////////////////////////////////////////////////////////////// bool CCertTemplateSelectDialog::HasContextHelp(int nDlgItem) { const DWORD * pdwHelpIDs; for(pdwHelpIDs = m_prgzHelpIDs; *pdwHelpIDs; pdwHelpIDs += 2) { if(nDlgItem == *pdwHelpIDs) return true; } return false; } int CALLBACK CertTemplCompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { BOOL fSortAscending = (BOOL)lParamSort; HCERTTYPE hCertTypeLeft = (HCERTTYPE)lParam1; HCERTTYPE hCertTypeRight = (HCERTTYPE)lParam2; WCHAR ** ppwszFriendlyNameLeft = NULL; WCHAR ** ppwszFriendlyNameRight = NULL; int nRet; CAGetCertTypeProperty( hCertTypeLeft, CERTTYPE_PROP_FRIENDLY_NAME, &ppwszFriendlyNameLeft); CAGetCertTypeProperty( hCertTypeRight, CERTTYPE_PROP_FRIENDLY_NAME, &ppwszFriendlyNameRight); if(!ppwszFriendlyNameLeft || !ppwszFriendlyNameLeft[0] || !ppwszFriendlyNameRight || !ppwszFriendlyNameRight[0]) return 0; // couldn't figure it out nRet = wcscmp(ppwszFriendlyNameLeft[0], ppwszFriendlyNameRight[0]); CAFreeCertTypeProperty( hCertTypeLeft, ppwszFriendlyNameLeft); CAFreeCertTypeProperty( hCertTypeRight, ppwszFriendlyNameRight); return nRet; } ///////////////////////////////////////////////////////////////////////////// // CCertTemplateSelectDialog message handlers BOOL CCertTemplateSelectDialog::OnInitDialog(HWND hDlg) { // does parent init and UpdateData call m_hwndCertTypeList = GetDlgItem(hDlg, IDC_CERTIFICATE_TYPE_LIST); CString szColumnHeading; HRESULT hr; HCERTTYPE hCertTypeNext; HCERTTYPE hCertTypePrev; WCHAR ** aszCertTypeName; WCHAR ** aszCertTypeCN; int i = 0; CString szUsageString; DWORD dwVersion; m_hDlg = hDlg; ::SetWindowLong(m_hDlg, GWL_EXSTYLE, ::GetWindowLong(m_hDlg, GWL_EXSTYLE) | WS_EX_CONTEXTHELP); ListView_SetExtendedListViewStyle(GetDlgItem(m_hDlg, IDC_CERTIFICATE_TYPE_LIST), LVS_EX_FULLROWSELECT); hr = myRetrieveCATemplateList(m_hCAInfo, FALSE, m_TemplateList); if(S_OK != hr) { MyErrorBox(hDlg, IDS_CERTTYPE_INFO_FAIL ,IDS_SNAPIN_NAME, hr); return TRUE; } HIMAGELIST hImgList = ImageList_LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_16x16), 16, 1, RGB(255, 0, 255)); ListView_SetImageList(m_hwndCertTypeList, hImgList, LVSIL_SMALL); szColumnHeading.LoadString(IDS_COLUMN_NAME); ListView_NewColumn(m_hwndCertTypeList, 0, 200, szColumnHeading); szColumnHeading.LoadString(IDS_COLUMN_INTENDED_PURPOSE); ListView_NewColumn(m_hwndCertTypeList, 1, 200, szColumnHeading); hr = CAEnumCertTypes(CT_ENUM_USER_TYPES | CT_ENUM_MACHINE_TYPES | CT_FLAG_NO_CACHE_LOOKUP, &hCertTypeNext ); // display error in getting 1st element if (hr != S_OK) { MyErrorBox(hDlg, IDS_CERTTYPE_INFO_FAIL ,IDS_SNAPIN_NAME, hr); return TRUE; } else if (hCertTypeNext == NULL) { myDisplayError(hDlg, S_OK, IDS_NO_TEMPLATES); } while ((hCertTypeNext != NULL) && (!FAILED(hr))) { // // get the CN of the cert type being processed, and if it already // exists in the list of currently supported types then move on // to the next one // hr = CAGetCertTypeProperty( hCertTypeNext, CERTTYPE_PROP_DN, &aszCertTypeCN); _PrintIfErrorStr(hr, "CAGetCertTypeProperty", CERTTYPE_PROP_DN); if(hr == S_OK) { hr = CAGetCertTypePropertyEx ( hCertTypeNext, CERTTYPE_PROP_SCHEMA_VERSION, &dwVersion); _PrintIfErrorStr( hr, "CAGetCertTypeProperty", CERTTYPE_PROP_SCHEMA_VERSION); if(S_OK == hr && (m_fAdvancedServer || dwVersion==CERTTYPE_SCHEMA_VERSION_1)) { if((aszCertTypeCN != NULL) && (aszCertTypeCN[0] != NULL) && (_wcsicmp(aszCertTypeCN[0], wszCERTTYPE_CA) != 0) && (!m_TemplateList.TemplateExistsName(aszCertTypeCN[0]))) { // // the cert type is not already supported so add it to the list of choices // hr = CAGetCertTypeProperty( hCertTypeNext, CERTTYPE_PROP_FRIENDLY_NAME, &aszCertTypeName); _PrintIfErrorStr( hr, "CAGetCertTypeProperty", CERTTYPE_PROP_FRIENDLY_NAME); if (S_OK == hr && NULL != aszCertTypeName) { if (NULL != aszCertTypeName[0]) { if (!GetIntendedUsagesString( hCertTypeNext, &szUsageString) || szUsageString == L"") { szUsageString.LoadString(IDS_ALL); } LVITEM lvItem; lvItem.mask = LVIF_IMAGE | LVIF_TEXT; // nImage - the certificate template image is #2 lvItem.iImage = 2; lvItem.iSubItem = 0; lvItem.pszText = aszCertTypeName[0]; lvItem.iItem = ListView_NewItem( m_hwndCertTypeList, i, aszCertTypeName[0], (LPARAM) hCertTypeNext); // set other attribs ListView_SetItem(m_hwndCertTypeList, &lvItem); ListView_SetItemText( m_hwndCertTypeList, i++, 1, (LPWSTR) (LPCTSTR) szUsageString); } CAFreeCertTypeProperty(hCertTypeNext, aszCertTypeName); } } } CAFreeCertTypeProperty( hCertTypeNext, aszCertTypeCN); } hCertTypePrev = hCertTypeNext; hCertTypeNext = NULL; hr = CAEnumNextCertType(hCertTypePrev, &hCertTypeNext); } ListView_SetColumnWidth(m_hwndCertTypeList, 0, LVSCW_AUTOSIZE); ListView_SetColumnWidth(m_hwndCertTypeList, 1, LVSCW_AUTOSIZE); ListView_SortItems(m_hwndCertTypeList, CertTemplCompareFunc, TRUE); UpdateData(FALSE); return TRUE; } void CCertTemplateSelectDialog::OnDestroy() { int i = 0; int iCount = ListView_GetItemCount(m_hwndCertTypeList); for (i=0; iDeleteImageList(); } void CCertTemplateSelectDialog::OnSelChange(NMHDR * pNotifyStruct/*, LRESULT * result*/) { LPNMLISTVIEW pListItem = (LPNMLISTVIEW) pNotifyStruct; if (pListItem->uNewState & LVIS_SELECTED) { } } void CCertTemplateSelectDialog::OnOK() { int i; HRESULT hr; UINT cSelectedItems; HCERTTYPE hSelectedCertType; int itemIndex; cSelectedItems = ListView_GetSelectedCount(m_hwndCertTypeList); if (cSelectedItems != 0) { // // get each selected item and add its cert type to the array // itemIndex = ListView_GetNextItem(m_hwndCertTypeList, -1, LVNI_ALL | LVNI_SELECTED); while (itemIndex != -1) { HCERTTYPE hCT = (HCERTTYPE)ListView_GetItemData(m_hwndCertTypeList, itemIndex); hr = myAddToCATemplateList(m_hCAInfo, m_TemplateList, hCT, FALSE); if(FAILED(hr)) return; itemIndex = ListView_GetNextItem(m_hwndCertTypeList, itemIndex, LVNI_ALL | LVNI_SELECTED); } hr = UpdateCATemplateList(m_hDlg, m_hCAInfo, m_TemplateList); if (S_OK != hr) { if ((HRESULT) ERROR_CANCELLED != hr) { MyErrorBox(m_hDlg, IDS_FAILED_CA_UPDATE ,IDS_SNAPIN_NAME, hr); } // Set the old values back. itemIndex = ListView_GetNextItem(m_hwndCertTypeList, -1, LVNI_ALL | LVNI_SELECTED); while (itemIndex != -1) { HCERTTYPE hCT = (HCERTTYPE)ListView_GetItemData(m_hwndCertTypeList, itemIndex); myRemoveFromCATemplateList(m_hCAInfo, m_TemplateList, hCT); itemIndex = ListView_GetNextItem(m_hwndCertTypeList, itemIndex, LVNI_ALL | LVNI_SELECTED); } } } } void CCertTemplateSelectDialog::SetCA(HCAINFO hCAInfo, bool fAdvancedServer) { m_hCAInfo = hCAInfo; m_fAdvancedServer = fAdvancedServer; } INT_PTR SelectCertTemplateDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CCertTemplateSelectDialog* pParam; switch(uMsg) { case WM_INITDIALOG: { // remember PRIVATE_DLGPROC_QUERY_LPARAM SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); pParam = (CCertTemplateSelectDialog*)lParam; return pParam->OnInitDialog(hwndDlg); break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; pParam->OnOK(); EndDialog(hwndDlg, LOWORD(wParam)); break; case IDCANCEL: pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; //pParam->OnCancel(); EndDialog(hwndDlg, LOWORD(wParam)); break; default: pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; return pParam->OnCommand(wParam, lParam); break; } case WM_NOTIFY: pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; return pParam->OnNotify((int)wParam, (NMHDR*)lParam); break; case WM_DESTROY: pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; pParam->OnDestroy(); break; case WM_HELP: { pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; pParam->OnHelp((LPHELPINFO) lParam); break; } case WM_CONTEXTMENU: { pParam = (CCertTemplateSelectDialog*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if (pParam == NULL) break; pParam->OnContextHelp((HWND)wParam); break; } default: break; } return 0; }