|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: cvdetail.cpp
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include <dbgdef.h>
extern HINSTANCE HinstDll; extern HMODULE HmodRichEdit;
static const HELPMAP helpmap[] = { {IDC_SHOW_DETAILS_COMBO, IDH_CERTVIEW_DETAILS_SHOW_COMBO}, {IDC_SAVE_CERTIFICATE_BUTTON, IDH_CERTVIEW_DETAILS_SAVECERT_BUTTON}, {IDC_ITEM_LIST, IDH_CERTVIEW_DETAILS_ITEM_LIST}, {IDC_EDIT_PROPERTIES_BUTTON, IDH_CERTVIEW_GENERAL_EDITPROPERTIES_BUTTON}, {IDC_DETAIL_EDIT, IDH_CERTVIEW_DETAILS_ITEM_EDIT} };
//////////////////////////////////////////////////////////////////////////////////////
// This function will take a HWND for a list view and a certinfo struct and display
// all the V1 fields of the cert in the list view
//////////////////////////////////////////////////////////////////////////////////////
static void DisplayV1Fields(HWND hWndListView, PCERT_INFO pCertInfo, DWORD *index) { LPWSTR pwszText; LPWSTR pwszPubKey; WCHAR szFieldText[_MAX_PATH]; // used for calls to LoadString only
WCHAR szKeySize[32]; LV_ITEMW lvI; DWORD dwKeySize; char szVersion[32]; void *pTemp;
//
// set up the fields in the list view item struct that don't change from item to item
//
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.pszText = szFieldText; lvI.iSubItem = 0; lvI.iImage = IMAGE_V1; lvI.lParam = (LPARAM)NULL;
//
// version
//
lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ADV_VERSION, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); wsprintfA(szVersion, "V%d", pCertInfo->dwVersion+1); if (NULL != (pwszText = CertUIMkWStr(szVersion))) { lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// serial number
//
if (FormatSerialNoString(&pwszText, &(pCertInfo->SerialNumber))) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ADV_SER_NUM, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(TRUE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// signature algorithm
//
if (FormatAlgorithmString(&pwszText, &(pCertInfo->SignatureAlgorithm))) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ADV_SIG_ALG, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// issuer
//
LoadStringU(HinstDll, IDS_ADV_ISSUER, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); if (FormatDNNameString(&pwszText, pCertInfo->Issuer.pbData, pCertInfo->Issuer.cbData, TRUE)) { lvI.iItem = (*index)++; lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); if (FormatDNNameString(&pwszText, pCertInfo->Issuer.pbData, pCertInfo->Issuer.cbData, FALSE)) { ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); free(pwszText); } }
//
// not before
//
if (FormatDateString(&pwszText, pCertInfo->NotBefore, TRUE, TRUE, hWndListView)) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ADV_NOTBEFORE, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// not after
//
if (FormatDateString(&pwszText, pCertInfo->NotAfter, TRUE, TRUE, hWndListView)) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ADV_NOTAFTER, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// subject
//
LoadStringU(HinstDll, IDS_ADV_SUBJECT, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); if (FormatDNNameString(&pwszText, pCertInfo->Subject.pbData, pCertInfo->Subject.cbData, TRUE)) { lvI.iItem = (*index)++; lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); if (FormatDNNameString(&pwszText, pCertInfo->Subject.pbData, pCertInfo->Subject.cbData, FALSE)) { ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); free(pwszText); } }
//
// public key
//
if (FormatAlgorithmString(&pwszText, &(pCertInfo->SubjectPublicKeyInfo.Algorithm))) { WCHAR temp[32];
lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ADV_PUBKEY, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText);
dwKeySize = CertGetPublicKeyLength(X509_ASN_ENCODING, &(pCertInfo->SubjectPublicKeyInfo)); _itow(dwKeySize, szKeySize, 10); wcscpy(temp, L" ("); wcscat(temp, szKeySize); wcscat(temp, L" Bits)"); pTemp = realloc(pwszText, ((wcslen(pwszText) + wcslen(temp) + 1 ) * sizeof(WCHAR))); if (pTemp == NULL) { free(pwszText); return; } pwszText = (LPWSTR) pTemp; wcscat(pwszText, temp);
FormatMemBufToString( &pwszPubKey, pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData);
lvI.lParam = (LPARAM) MakeListDisplayHelper(TRUE, pwszPubKey, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); free(pwszText); } }
//////////////////////////////////////////////////////////////////////////////////////
// This function will take a HWND for a list view and a pointer to a cert contexxt and
// display all the properties tagged to the cert in the list view
//////////////////////////////////////////////////////////////////////////////////////
static void DisplayProperties(HWND hWndListView, PCCERT_CONTEXT pCertContext, DWORD *index) { DWORD i; WCHAR szFieldText[_MAX_PATH]; // used for calls to LoadString only
LPWSTR pwszText; LV_ITEMW lvI; BYTE hash[20]; DWORD hashSize = ARRAYSIZE(hash); DWORD cbText; CRYPT_KEY_PROV_INFO *pKeyInfo = NULL; DWORD cbKeyInfo = 0; HCRYPTPROV hCryptProv; HCRYPTKEY hCryptKey; DWORD dwTemp; PCCRYPT_OID_INFO pThumbprintAlgorithm; DWORD dwAlgID = CALG_SHA1;
//
// set up the fields in the list view item struct that don't change from item to item
//
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.pszText = szFieldText; lvI.iSubItem = 0; lvI.iImage = IMAGE_PROPERTY;
//
// thumbprint algorithm
//
if (NULL != (pThumbprintAlgorithm = CryptFindOIDInfo( CRYPT_OID_INFO_ALGID_KEY, &dwAlgID, CRYPT_HASH_ALG_OID_GROUP_ID)) && (NULL != (pwszText = AllocAndCopyWStr(pThumbprintAlgorithm->pwszName)))) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_THUMBPRINT_ALGORITHM, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// thumbprint
//
CertGetCertificateContextProperty( pCertContext, CERT_SHA1_HASH_PROP_ID, hash, &hashSize); if (FormatMemBufToString(&pwszText, hash, ARRAYSIZE(hash))) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_THUMBPRINT, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(TRUE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// friendly name
//
cbText = 0; if (CertGetCertificateContextProperty( pCertContext, CERT_FRIENDLY_NAME_PROP_ID, NULL, &cbText) && (NULL != (pwszText = (LPWSTR) malloc(cbText)))) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_CERTIFICATE_NAME, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); CertGetCertificateContextProperty( pCertContext, CERT_FRIENDLY_NAME_PROP_ID, pwszText, &cbText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// description
//
cbText = 0; if (CertGetCertificateContextProperty( pCertContext, CERT_DESCRIPTION_PROP_ID, NULL, &cbText) && (NULL != (pwszText = (LPWSTR) malloc(cbText)))) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_DESCRIPTION, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); CertGetCertificateContextProperty( pCertContext, CERT_DESCRIPTION_PROP_ID, pwszText, &cbText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); }
//
// enhanced key usage
//
if (FormatEnhancedKeyUsageString(&pwszText, pCertContext, TRUE, TRUE)) { lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_ENHANCED_KEY_USAGE, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); FormatEnhancedKeyUsageString(&pwszText, pCertContext, TRUE, FALSE); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszText); free(pwszText); }
//
// extended error information
//
cbText = 0; if (CertGetCertificateContextProperty( pCertContext, CERT_EXTENDED_ERROR_INFO_PROP_ID, NULL, &cbText) && (cbText / sizeof(WCHAR) > 1) && (NULL != (pwszText = (LPWSTR) malloc(cbText * 2)))) { DWORD cchText = cbText / sizeof(WCHAR);
if (!CertGetCertificateContextProperty( pCertContext, CERT_EXTENDED_ERROR_INFO_PROP_ID, pwszText, &cbText) || (cchText != cbText / sizeof(WCHAR)) || (pwszText[cchText - 1] != L'\0')) { free(pwszText); } else { // Force an extra L'\n' between lines by converting L'\r' to L'\n'
//
// Create a duplicate version of the error information where L'\r'
// is converted to L' ' and L'\n' is converted to L','.
LPWSTR pwszSingleLineText = pwszText + cchText;
for (i = 0; i < cchText; i++) { if (pwszText[i] == L'\r') { pwszText[i] = L'\n'; pwszSingleLineText[i] = L' '; } else if (pwszText[i] == L'\n') { if (pwszText[i+1] == L'\0') { pwszSingleLineText[i] = L'\0'; break; } else { pwszSingleLineText[i] = L','; } } else { pwszSingleLineText[i] = pwszText[i]; } }
lvI.iItem = (*index)++; LoadStringU(HinstDll, IDS_EXTENDED_ERROR_INFO, szFieldText, ARRAYSIZE(szFieldText)); lvI.cchTextMax = wcslen(szFieldText); lvI.lParam = (LPARAM) MakeListDisplayHelper(FALSE, pwszText, NULL, 0); ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, (*index)-1 , 1, pwszSingleLineText); } }
//
// private key
//
/*if (CertGetCertificateContextProperty( pCertContext,
CERT_KEY_PROV_INFO_PROP_ID, NULL, &cbKeyInfo)) { if (NULL == (pKeyInfo = (CRYPT_KEY_PROV_INFO *) malloc(cbKeyInfo))) { return; } if (!CertGetCertificateContextProperty( pCertContext, CERT_KEY_PROV_INFO_PROP_ID, pKeyInfo, &cbKeyInfo)) { return; }
if (CryptAcquireContextU( &hCryptProv, pKeyInfo->pwszContainerName, pKeyInfo->pwszProvName, pKeyInfo->dwProvType, pKeyInfo->dwFlags)) { if (CryptGetUserKey(hCryptProv, pKeyInfo->dwKeySpec, &hCryptKey)) {
} }
free(pKeyInfo); }*/
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
INT_PTR APIENTRY ViewPageDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { DWORD i; PROPSHEETPAGE *ps; PCCERT_CONTEXT pccert; CERT_VIEW_HELPER *pviewhelp; WCHAR rgwch[CRYPTUI_MAX_STRING_SIZE]; HIMAGELIST hIml; HWND hWndListView; HWND hwnd; LV_COLUMNW lvC; WCHAR szText[CRYPTUI_MAX_STRING_SIZE]; LV_ITEMW lvI; LPNMLISTVIEW pnmv; CRYPTUI_WIZ_EXPORT_INFO ExportInfo; DWORD dwCertAccessProperty; DWORD cb; WCHAR errorString[CRYPTUI_MAX_STRING_SIZE]; WCHAR errorTitle[CRYPTUI_MAX_STRING_SIZE];
switch ( msg ) { case WM_INITDIALOG: //
// save the pviewhelp struct in DWL_USER so it can always be accessed
//
ps = (PROPSHEETPAGE *) lParam; pviewhelp = (CERT_VIEW_HELPER *) (ps->lParam); pccert = pviewhelp->pcvp->pCertContext; SetWindowLongPtr(hwndDlg, DWLP_USER, (DWORD_PTR) pviewhelp); pviewhelp->hwndDetailPage = hwndDlg;
//
// clear the text in the detail edit box
//
CryptUISetRicheditTextW(hwndDlg, IDC_DETAIL_EDIT, L""); //
// initialize the combo box with it's strings
//
LoadStringU(HinstDll, IDS_ALL_FIELDS, szText, ARRAYSIZE(szText)); SendDlgItemMessageU(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_INSERTSTRING, 0, (LPARAM) szText); LoadStringU(HinstDll, IDS_V1_FIELDS_ONLY, szText, ARRAYSIZE(szText)); SendDlgItemMessageU(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_INSERTSTRING, 1, (LPARAM) szText); LoadStringU(HinstDll, IDS_EXTENSIONS_ONLY, szText, ARRAYSIZE(szText)); SendDlgItemMessageU(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_INSERTSTRING, 2, (LPARAM) szText); LoadStringU(HinstDll, IDS_CRITICAL_EXTENSIONS_ONLY, szText, ARRAYSIZE(szText)); SendDlgItemMessageU(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_INSERTSTRING, 3, (LPARAM) szText); LoadStringU(HinstDll, IDS_PROPERTIES_ONLY, szText, ARRAYSIZE(szText)); SendDlgItemMessageU(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_INSERTSTRING, 4, (LPARAM) szText); SendDlgItemMessageU(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_SETCURSEL, 0, (LPARAM) NULL);
//
// get the handle of the list view control
//
hWndListView = GetDlgItem(hwndDlg, IDC_ITEM_LIST);
//
// initialize the image list for the list view, load the icons,
// then add the image list to the list view
//
hIml = ImageList_LoadImage(HinstDll, MAKEINTRESOURCE(IDB_PROPLIST), 0, 4, RGB(0,128,128), IMAGE_BITMAP, 0); if (hIml != NULL) { ListView_SetImageList(hWndListView, hIml, LVSIL_SMALL); }
//
// initialize the columns in the list view
//
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvC.fmt = LVCFMT_LEFT; // Left-align the column.
lvC.cx = 171; // Width of the column, in pixels.
lvC.pszText = szText; // The text for the column.
// Add the columns. They are loaded from a string table.
for (i = 0; i <= 1; i++) { lvC.iSubItem = i; LoadStringU(HinstDll, IDS_FIELD + i, szText, ARRAYSIZE(szText));
if (ListView_InsertColumnU(hWndListView, i, &lvC) == -1) { // error
} }
//
// add all the certificate fields to the list box
//
i = 0; DisplayV1Fields(hWndListView, pccert->pCertInfo, &i); DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, FALSE, &i); DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, TRUE, &i); DisplayProperties(hWndListView, pccert, &i);
//
// set the style in the list view so that it highlights an entire line
//
SendMessageA(hWndListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
//
// for the "Edit Properties" button, get the CERT_ACCESS_STATE_PROP_ID
// and check it
//
cb = sizeof(DWORD); CertGetCertificateContextProperty( pccert, CERT_ACCESS_STATE_PROP_ID, (void *) &dwCertAccessProperty, &cb);
if (pviewhelp->pcvp->dwFlags & CRYPTUI_ENABLE_EDITPROPERTIES) { EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_PROPERTIES_BUTTON), TRUE); } else if (pviewhelp->pcvp->dwFlags & CRYPTUI_DISABLE_EDITPROPERTIES) { EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_PROPERTIES_BUTTON), FALSE); } else { EnableWindow( GetDlgItem(hwndDlg, IDC_EDIT_PROPERTIES_BUTTON), (dwCertAccessProperty & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG)); }
return TRUE;
case WM_MY_REINITIALIZE:
//
// send a message to the combo box that selection has chaged, it will then
// update everything for us
//
SendMessage( hwndDlg, WM_COMMAND, (WPARAM) MAKELONG(IDC_SHOW_DETAILS_COMBO, LBN_SELCHANGE), (LPARAM) GetDlgItem(hwndDlg, IDC_SHOW_DETAILS_COMBO));
return TRUE;
case WM_NOTIFY:
pviewhelp = (CERT_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); pccert = pviewhelp->pcvp->pCertContext;
switch (((NMHDR FAR *) lParam)->code) { case PSN_SETACTIVE: break;
case PSN_APPLY: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)TRUE); break;
case PSN_KILLACTIVE: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)FALSE); return TRUE;
case PSN_RESET: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)FALSE); break;
case PSN_QUERYCANCEL: pviewhelp->fCancelled = TRUE; return FALSE;
case PSN_HELP: pviewhelp = (CERT_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); if (FIsWin95) { //WinHelpA(hwndDlg, (LPSTR) pviewhelp->pcvp->szHelpFileName,
// HELP_CONTEXT, pviewhelp->pcvp->dwHelpId);
} else { //WinHelpW(hwndDlg, pviewhelp->pcvp->szHelpFileName, HELP_CONTEXT,
// pviewhelp->pcvp->dwHelpId);
} return TRUE;
case LVN_ITEMCHANGING: if ((((NMHDR FAR *) lParam)->idFrom) != IDC_ITEM_LIST) { break; }
pnmv = (LPNMLISTVIEW) lParam;
if (pnmv->uNewState & LVIS_SELECTED) { DisplayHelperTextInEdit( GetDlgItem(hwndDlg, IDC_ITEM_LIST), hwndDlg, IDC_DETAIL_EDIT, pnmv->iItem); }
return TRUE;
case NM_CLICK: if ((((NMHDR FAR *) lParam)->idFrom) != IDC_ITEM_LIST) { break; }
DisplayHelperTextInEdit( GetDlgItem(hwndDlg, IDC_ITEM_LIST), hwndDlg, IDC_DETAIL_EDIT, -1);
return TRUE;
case NM_SETFOCUS:
switch (((NMHDR FAR *) lParam)->idFrom) {
case IDC_ITEM_LIST: if (NULL == (hWndListView = GetDlgItem(hwndDlg, IDC_ITEM_LIST))) break;
if ((ListView_GetItemCount(hWndListView) != 0) && (ListView_GetNextItem(hWndListView, -1, LVNI_SELECTED) == -1)) { memset(&lvI, 0, sizeof(lvI)); lvI.mask = LVIF_STATE; lvI.iItem = 0; lvI.state = LVIS_FOCUSED | LVIS_SELECTED; lvI.stateMask = LVIS_FOCUSED | LVIS_SELECTED; ListView_SetItem(hWndListView, &lvI); }
break; } break; }
break;
case WM_COMMAND:
pviewhelp = (CERT_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); pccert = pviewhelp->pcvp->pCertContext;
switch (LOWORD(wParam)) { case IDC_SAVE_CERTIFICATE_BUTTON:
memset(&ExportInfo, 0, sizeof(ExportInfo)); ExportInfo.dwSize = sizeof(ExportInfo); ExportInfo.dwSubjectChoice = CRYPTUI_WIZ_EXPORT_CERT_CONTEXT; ExportInfo.pCertContext = pviewhelp->pcvp->pCertContext; CryptUIWizExport(0, hwndDlg, NULL, &ExportInfo, NULL);
break;
case IDC_EDIT_PROPERTIES_BUTTON: if (HIWORD(wParam) == BN_CLICKED) { CRYPTUI_VIEWCERTIFICATEPROPERTIES_STRUCT csp; BOOL fPropertiesChanged;
memset(&csp, 0, sizeof(csp)); csp.dwSize = sizeof(csp); csp.hwndParent = hwndDlg; csp.dwFlags = 0; csp.pCertContext = pviewhelp->pcvp->pCertContext; csp.cStores = pviewhelp->pcvp->cStores; csp.rghStores = pviewhelp->pcvp->rghStores; csp.cPropSheetPages = 0; csp.rgPropSheetPages = NULL;
CryptUIDlgViewCertificateProperties(&csp, &fPropertiesChanged);
//
// if properties were actually changed, then set the flag
// to our caller, and refresh our state
//
if (fPropertiesChanged) { //
// if the WinVerifyTrust state was passed in, then the view
// cannot be refreshed, so alert the user
//
if (pviewhelp->pcvp->pCryptProviderData != NULL) { LoadStringU(HinstDll, IDS_NO_REFRESH, errorString, ARRAYSIZE(errorString)); if (pviewhelp->pcvp->szTitle != NULL) { MessageBoxU(hwndDlg, errorString, pviewhelp->pcvp->szTitle, MB_OK | MB_ICONWARNING); } else { LoadStringU(HinstDll, IDS_VIEW_TITLE, errorTitle, ARRAYSIZE(errorTitle)); MessageBoxU(hwndDlg, errorString, errorTitle, MB_OK | MB_ICONWARNING); } }
if (pviewhelp->pfPropertiesChanged != NULL) { *(pviewhelp->pfPropertiesChanged) = TRUE; }
//
// since the editing of properties changed major stuff, we need
// to redo the trust work and then reset the display
//
BuildChain(pviewhelp, NULL);
SendMessage(hwndDlg, WM_MY_REINITIALIZE, (WPARAM) 0, (LPARAM) 0); if (pviewhelp->hwndGeneralPage != NULL) { SendMessage(pviewhelp->hwndGeneralPage, WM_MY_REINITIALIZE, (WPARAM) 0, (LPARAM) 0); } if (pviewhelp->hwndHierarchyPage != NULL) { SendMessage(pviewhelp->hwndHierarchyPage, WM_MY_REINITIALIZE, (WPARAM) 0, (LPARAM) 0); } } return TRUE; } break;
case IDC_SHOW_DETAILS_COMBO: if (HIWORD(wParam) == LBN_SELCHANGE) { DWORD curSel = (DWORD)SendDlgItemMessageA(hwndDlg, IDC_SHOW_DETAILS_COMBO, CB_GETCURSEL, 0, (LPARAM) NULL); hWndListView = GetDlgItem(hwndDlg, IDC_ITEM_LIST);
//
// get all the items in the list view and free the lParam
// associated with each of them (lParam is the helper sruct)
//
memset(&lvI, 0, sizeof(lvI)); lvI.iItem = ListView_GetItemCount(hWndListView) - 1; lvI.mask = LVIF_PARAM; while (lvI.iItem >= 0) { if (ListView_GetItemU(hWndListView, &lvI)) { FreeListDisplayHelper((PLIST_DISPLAY_HELPER) lvI.lParam); } lvI.iItem--; } ListView_DeleteAllItems(hWndListView);
CryptUISetRicheditTextW(hwndDlg, IDC_DETAIL_EDIT, L"");
i = 0;
switch (curSel) { case 0: DisplayV1Fields(hWndListView, pccert->pCertInfo, &i); DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, FALSE, &i); DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, TRUE, &i); DisplayProperties(hWndListView, pccert, &i); break; case 1: DisplayV1Fields(hWndListView, pccert->pCertInfo, &i); break; case 2: DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, FALSE, &i); DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, TRUE, &i); break; case 3: DisplayExtensions(hWndListView, pccert->pCertInfo->cExtension, pccert->pCertInfo->rgExtension, TRUE, &i); break; case 4: DisplayProperties(hWndListView, pccert, &i); break; }
return TRUE; } break;
case IDHELP: pviewhelp = (CERT_VIEW_HELPER *) GetWindowLongPtr(hwndDlg, DWLP_USER); if (FIsWin95) { //WinHelpA(hwndDlg, (LPSTR) pviewhelp->pcvp->szHelpFileName,
// HELP_CONTEXT, pviewhelp->pcvp->dwHelpId);
} else { //WinHelpW(hwndDlg, pviewhelp->pcvp->szHelpFileName, HELP_CONTEXT,
// pviewhelp->pcvp->dwHelpId);
} return TRUE; } break;
case WM_DESTROY:
//
// get all the items in the list view and free the lParam
// associated with each of them (lParam is the helper sruct)
//
hWndListView = GetDlgItem(hwndDlg, IDC_ITEM_LIST);
memset(&lvI, 0, sizeof(lvI)); lvI.iItem = ListView_GetItemCount(hWndListView) - 1; lvI.mask = LVIF_PARAM; while (lvI.iItem >= 0) { if (ListView_GetItemU(hWndListView, &lvI)) { FreeListDisplayHelper((PLIST_DISPLAY_HELPER) lvI.lParam); } lvI.iItem--; }
break; case WM_HELP: case WM_CONTEXTMENU: if (msg == WM_HELP) { hwnd = GetDlgItem(hwndDlg, ((LPHELPINFO)lParam)->iCtrlId); } else { hwnd = (HWND) wParam; }
if ((hwnd != GetDlgItem(hwndDlg, IDC_SHOW_DETAILS_COMBO)) && (hwnd != GetDlgItem(hwndDlg, IDC_SAVE_CERTIFICATE_BUTTON)) && (hwnd != GetDlgItem(hwndDlg, IDC_ITEM_LIST)) && (hwnd != GetDlgItem(hwndDlg, IDC_EDIT_PROPERTIES_BUTTON)) && (hwnd != GetDlgItem(hwndDlg, IDC_DETAIL_EDIT))) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)TRUE); return TRUE; } else { return OnContextHelp(hwndDlg, msg, wParam, lParam, helpmap); } }
return FALSE; }
|