//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: viewsigs.cpp // //-------------------------------------------------------------------------- #include "global.hxx" #include extern HINSTANCE HinstDll; extern HMODULE HmodRichEdit; static const HELPMAP helpmap[] = { {IDC_SIGNATURES_SIG_LIST, IDH_DIGSIG_PROPSHEET_LIST}, {IDC_SIGNATURES_DETAILS_BUTTON, IDH_DIGSIG_PROPSHEET_DETAIL} }; ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static PCRYPTUI_VIEWSIGNATURES_STRUCTW AllocAndCopyViewSignaturesStruct(PCCRYPTUI_VIEWSIGNATURES_STRUCTW pcvs) { PCRYPTUI_VIEWSIGNATURES_STRUCTW pStruct; DWORD i; if (NULL == (pStruct = (PCRYPTUI_VIEWSIGNATURES_STRUCTW) malloc(sizeof(CRYPTUI_VIEWSIGNATURES_STRUCTW)))) { return NULL; } memcpy(pStruct, pcvs, sizeof(CRYPTUI_VIEWSIGNATURES_STRUCTW)); if (pcvs->szFileName != NULL) { if (NULL == (pStruct->szFileName = AllocAndCopyWStr((LPWSTR) pcvs->szFileName))) { free(pStruct); return NULL; } } if (NULL == (pStruct->rghStores = (HCERTSTORE *) malloc(sizeof(HCERTSTORE)*pcvs->cStores))) { if (pStruct->szFileName) { free((void *) pStruct->szFileName); } free(pStruct); return NULL; } if (pcvs->choice == EncodedMessage_Chosen) { if (NULL == (pStruct->u.EncodedMessage.pbData = (BYTE *) malloc(pcvs->u.EncodedMessage.cbData))) { free(pStruct->rghStores); if (pStruct->szFileName) { free((void *) pStruct->szFileName); } free(pStruct); return NULL; } memcpy( pStruct->u.EncodedMessage.pbData, pcvs->u.EncodedMessage.pbData, pcvs->u.EncodedMessage.cbData); } else { pStruct->u.hMsg = CryptMsgDuplicate(pcvs->u.hMsg); } pStruct->cPropSheetPages = 0; pStruct->rgPropSheetPages = NULL; for (i=0; icStores; i++) { pStruct->rghStores[i] = CertDuplicateStore(pcvs->rghStores[i]); } return pStruct; } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static void FreeViewSignaturesStruct(PCRYPTUI_VIEWSIGNATURES_STRUCTW pcvs) { DWORD i; if (pcvs->choice == EncodedMessage_Chosen) { free(pcvs->u.EncodedMessage.pbData); } else { CryptMsgClose(pcvs->u.hMsg); } if (pcvs->szFileName) { free((void *) pcvs->szFileName); } for (i=0; icStores; i++) { CertCloseStore(pcvs->rghStores[i], 0); } free(pcvs->rghStores); free(pcvs); } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static PCMSG_SIGNER_INFO GetSignerInfo(HCRYPTMSG hMsg, DWORD index) { DWORD cbEncodedSigner = 0; BYTE *pbEncodedSigner = NULL; PCMSG_SIGNER_INFO pSignerInfo = NULL; DWORD cbSignerInfo = 0; // // get the encoded signer BLOB // CryptMsgGetParam(hMsg, CMSG_ENCODED_SIGNER, index, NULL, &cbEncodedSigner); if (cbEncodedSigner == 0) { return NULL; } if (NULL == (pbEncodedSigner = (PBYTE) malloc(cbEncodedSigner))) { return NULL; } if (!CryptMsgGetParam(hMsg, CMSG_ENCODED_SIGNER, index, pbEncodedSigner, &cbEncodedSigner)) { free(pbEncodedSigner); return NULL; } // // decode the EncodedSigner info // if(!CryptDecodeObject(PKCS_7_ASN_ENCODING|CRYPT_ASN_ENCODING, PKCS7_SIGNER_INFO, pbEncodedSigner, cbEncodedSigner, 0, NULL, &cbSignerInfo)) { free(pbEncodedSigner); return NULL; } if (NULL == (pSignerInfo = (PCMSG_SIGNER_INFO) malloc(cbSignerInfo))) { free(pbEncodedSigner); return NULL; } if (!CryptDecodeObject(PKCS_7_ASN_ENCODING|CRYPT_ASN_ENCODING, PKCS7_SIGNER_INFO, pbEncodedSigner, cbEncodedSigner, 0, pSignerInfo, &cbSignerInfo)) { free(pbEncodedSigner); free(pSignerInfo); return NULL; } free(pbEncodedSigner); return(pSignerInfo); } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// static void DisplaySignatures(HWND hWndListView, PCERT_VIEWSIGNATURES_HELPER pviewhelp) { PCMSG_SIGNER_INFO pSignerInfo; DWORD cbCounterSignerInfo; PCCERT_CONTEXT pCertContext = NULL; DWORD i; WCHAR szNameText[CRYPTUI_MAX_STRING_SIZE]; WCHAR szEmailText[CRYPTUI_MAX_STRING_SIZE]; LV_ITEMW lvI; int itemIndex = 0; LPWSTR pszTimeText; HCRYPTMSG hMsg; // // set up the fields in the list view item struct that don't change from item to item // memset(&lvI, 0, sizeof(lvI)); lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.pszText = szNameText; // // If the encoded message was passed in the use CryptMsg to crack the encoded PKCS7 Signed Message // if (pviewhelp->pcvs->choice == EncodedMessage_Chosen) { if (!(hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL))) { return; } if (!CryptMsgUpdate(hMsg, pviewhelp->pcvs->u.EncodedMessage.pbData, pviewhelp->pcvs->u.EncodedMessage.cbData, TRUE)) // fFinal { CryptMsgClose(hMsg); return; } } else { hMsg = pviewhelp->pcvs->u.hMsg; } // // get the signer info struct for each signer // i = 0; while (NULL != (pSignerInfo = GetSignerInfo(hMsg, i++))) { // // find the signers cert // pCertContext = GetSignersCert( pSignerInfo, pviewhelp->hExtraStore, pviewhelp->pcvs->cStores, pviewhelp->pcvs->rghStores); // // get the signers name // if (!(pCertContext && CertGetNameStringW( pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0,//CERT_NAME_ISSUER_FLAG, NULL, szNameText, ARRAYSIZE(szNameText)))) { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szNameText, ARRAYSIZE(szNameText)); } // // get the signers email // if (!(pCertContext && (CertGetNameStringW( pCertContext, CERT_NAME_EMAIL_TYPE, 0,//CERT_NAME_ISSUER_FLAG, NULL, szEmailText, ARRAYSIZE(szEmailText)) != 1))) { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szEmailText, ARRAYSIZE(szEmailText)); } pszTimeText = AllocAndReturnTimeStampersTimes(pSignerInfo, NULL, hWndListView); // // add the item to the list view // lvI.iSubItem = 0; lvI.cchTextMax = wcslen(szNameText); lvI.lParam = (LPARAM) pSignerInfo; lvI.iItem = itemIndex++; ListView_InsertItemU(hWndListView, &lvI); ListView_SetItemTextU(hWndListView, itemIndex-1 , 1, szEmailText); if (pszTimeText != NULL) { ListView_SetItemTextU(hWndListView, itemIndex-1 , 2, pszTimeText); free(pszTimeText); } else { LoadStringU(HinstDll, IDS_NOTAVAILABLE, szEmailText, ARRAYSIZE(szEmailText)); ListView_SetItemTextU(hWndListView, itemIndex-1 , 2, szEmailText); } } if (pviewhelp->pcvs->choice == EncodedMessage_Chosen) { CryptMsgClose(hMsg); } } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// BOOL fUseCTLSigning(PCERT_VIEWSIGNATURES_HELPER pviewhelp) { BOOL fCTL = FALSE; CERT_BLOB blob; PCCTL_CONTEXT pCTLContext=NULL; if (pviewhelp->pcvs->choice == EncodedMessage_Chosen) { blob.cbData = pviewhelp->pcvs->u.EncodedMessage.cbData; blob.pbData = pviewhelp->pcvs->u.EncodedMessage.pbData; if (CryptQueryObject( CERT_QUERY_OBJECT_BLOB, &blob, CERT_QUERY_CONTENT_FLAG_CTL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, NULL, NULL, (const void **)&pCTLContext) && !fIsCatalogFile(&(pCTLContext->pCtlInfo->SubjectUsage))) { fCTL = TRUE; } } else { if (CryptQueryObject( CERT_QUERY_OBJECT_FILE, pviewhelp->pcvs->szFileName, CERT_QUERY_CONTENT_FLAG_CTL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, NULL, NULL, (const void **)&pCTLContext) && !fIsCatalogFile(&(pCTLContext->pCtlInfo->SubjectUsage))) { fCTL = TRUE; } } if(pCTLContext) { CertFreeCTLContext(pCTLContext); } return fCTL; } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// INT_PTR APIENTRY ViewPageViewSignatures(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { PROPSHEETPAGE * ps; PCRYPTUI_VIEWSIGNATURES_STRUCTW pcvs = NULL; HWND hWndListView; LV_COLUMNW lvC; LPNMLISTVIEW pnmv; PCERT_VIEWSIGNATURES_HELPER pviewhelp; WCHAR szText[CRYPTUI_MAX_STRING_SIZE]; int listIndex; LV_ITEMW lvI; DWORD i; HWND hwnd; switch ( msg ) { case WM_INITDIALOG: // // save the pviewhelp struct in DWLP_USER so it can always be accessed // ps = (PROPSHEETPAGE *) lParam; pviewhelp = (PCERT_VIEWSIGNATURES_HELPER) ps->lParam; pcvs = (PCRYPTUI_VIEWSIGNATURES_STRUCTW) pviewhelp->pcvs; SetWindowLongPtr(hwndDlg, DWLP_USER, (DWORD_PTR) pviewhelp); // // initially nothing is selected, so disable the details button // EnableWindow(GetDlgItem(hwndDlg, IDC_SIGNATURES_DETAILS_BUTTON), FALSE); // // get the handle of the list view control // hWndListView = GetDlgItem(hwndDlg, IDC_SIGNATURES_SIG_LIST); // // 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.pszText = szText; // The text for the column. lvC.iSubItem = 0; // Add the columns. They are loaded from a string table. lvC.cx = 100; LoadStringU(HinstDll, IDS_NAME, szText, ARRAYSIZE(szText)); if (ListView_InsertColumnU(hWndListView, 0, &lvC) == -1) { // error } lvC.cx = 100; LoadStringU(HinstDll, IDS_EMAIL, szText, ARRAYSIZE(szText)); if (ListView_InsertColumnU(hWndListView, 1, &lvC) == -1) { // error } lvC.cx = 125; LoadStringU(HinstDll, IDS_TIMESTAMP_TIME, szText, ARRAYSIZE(szText)); if (ListView_InsertColumnU(hWndListView, 2, &lvC) == -1) { // error } // // set the style in the list view so that it highlights an entire line // SendMessageA(hWndListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); DisplaySignatures(hWndListView, pviewhelp); return TRUE; case WM_NOTIFY: pviewhelp = (PCERT_VIEWSIGNATURES_HELPER) GetWindowLongPtr(hwndDlg, DWLP_USER); pcvs = (PCRYPTUI_VIEWSIGNATURES_STRUCTW) pviewhelp->pcvs; switch (((NMHDR FAR *) lParam)->code) { case PSN_SETACTIVE: break; case PSN_APPLY: break; case PSN_KILLACTIVE: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)FALSE); return TRUE; case PSN_RESET: SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)FALSE); break; case PSN_HELP: if (FIsWin95) { //WinHelpA(hwndDlg, (LPSTR) pcvs->szHelpFileName, // HELP_CONTEXT, pcvs->dwHelpId); } else { //WinHelpW(hwndDlg, pcvs->szHelpFileName, HELP_CONTEXT, // pcvs->dwHelpId); } return TRUE; case NM_DBLCLK: switch (((NMHDR FAR *) lParam)->idFrom) { case IDC_SIGNATURES_SIG_LIST: if (IsWindowEnabled(GetDlgItem(hwndDlg, IDC_SIGNATURES_DETAILS_BUTTON))) { SendMessage( hwndDlg, WM_COMMAND, MAKELONG(IDC_SIGNATURES_DETAILS_BUTTON, BN_CLICKED), (LPARAM) GetDlgItem(hwndDlg, IDC_SIGNATURES_DETAILS_BUTTON)); } break; } break; case LVN_ITEMCHANGED: if ((((NMHDR FAR *) lParam)->idFrom) != IDC_SIGNATURES_SIG_LIST) { break; } // // if an item is selected, then enable the details button, otherwise // disable it // EnableWindow( GetDlgItem(hwndDlg, IDC_SIGNATURES_DETAILS_BUTTON), (ListView_GetSelectedCount( GetDlgItem(hwndDlg,IDC_SIGNATURES_SIG_LIST)) == 0) ? FALSE : TRUE); break; case NM_CLICK: if ((((NMHDR FAR *) lParam)->idFrom) != IDC_SIGNATURES_SIG_LIST) { break; } hWndListView = GetDlgItem(hwndDlg, IDC_SIGNATURES_SIG_LIST); // // make sure something is selected by getting the current selection // listIndex = ListView_GetNextItem( hWndListView, -1, LVNI_SELECTED ); break; case NM_SETFOCUS: switch (((NMHDR FAR *) lParam)->idFrom) { case IDC_SIGNATURES_SIG_LIST: hWndListView = GetDlgItem(hwndDlg, IDC_SIGNATURES_SIG_LIST); 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; lvI.stateMask = LVIS_FOCUSED; ListView_SetItem(hWndListView, &lvI); } break; } break; } break; case WM_COMMAND: pviewhelp = (PCERT_VIEWSIGNATURES_HELPER) GetWindowLongPtr(hwndDlg, DWLP_USER); pcvs = (PCRYPTUI_VIEWSIGNATURES_STRUCTW) pviewhelp->pcvs; switch (LOWORD(wParam)) { case IDHELP: if (FIsWin95) { //WinHelpA(hwndDlg, (LPSTR) pcvs->szHelpFileName, // HELP_CONTEXT, pcvs->dwHelpId); } else { //WinHelpW(hwndDlg, pcvs->szHelpFileName, HELP_CONTEXT, // pcvs->dwHelpId); } return TRUE; case IDC_SIGNATURES_DETAILS_BUTTON: if (HIWORD(wParam) == BN_CLICKED) { CRYPTUI_VIEWSIGNERINFO_STRUCTW cvsi; CERT_VIEWSIGNERINFO_PRIVATE cvsiPrivate; CRYPT_PROVIDER_DEFUSAGE cryptProviderDefUsage; WINTRUST_DATA WTD; //BOOL fDefault; HCRYPTMSG hMsg; hWndListView = GetDlgItem(hwndDlg, IDC_SIGNATURES_SIG_LIST); // // get the selected item and its lParam which is a signer info // listIndex = ListView_GetNextItem( hWndListView, -1, LVNI_SELECTED ); memset(&lvI, 0, sizeof(lvI)); lvI.iItem = listIndex; lvI.mask = LVIF_PARAM; if (!ListView_GetItemU(hWndListView, &lvI)) { return FALSE; } // // If the encoded message was passed in the use CryptMsg to crack the encoded PKCS7 Signed Message // if (pviewhelp->pcvs->choice == EncodedMessage_Chosen) { if (!(hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL))) { return TRUE; } if (!CryptMsgUpdate(hMsg, pviewhelp->pcvs->u.EncodedMessage.pbData, pviewhelp->pcvs->u.EncodedMessage.cbData, TRUE)) // fFinal { CryptMsgClose(hMsg); return TRUE; } } else { hMsg = pviewhelp->pcvs->u.hMsg; } memset(&cvsi, 0, sizeof(cvsi)); cvsi.dwSize = sizeof(cvsi); cvsi.pSignerInfo = (PCMSG_SIGNER_INFO) lvI.lParam; cvsi.hwndParent = hwndDlg; cvsi.hMsg = hMsg; cvsi.pszOID = fUseCTLSigning(pviewhelp) ? szOID_KP_CTL_USAGE_SIGNING : szOID_PKIX_KP_CODE_SIGNING; cvsi.cStores = pcvs->cStores; cvsi.rghStores = pcvs->rghStores; // // if there was a file name passed in then fill out the // information in the private struct about which signer to display // if (pcvs->szFileName != NULL) { BuildWinVTrustState( pcvs->szFileName, NULL, 0, NULL, fUseCTLSigning(pviewhelp) ? szOID_KP_CTL_USAGE_SIGNING : szOID_PKIX_KP_CODE_SIGNING, &cvsiPrivate, &cryptProviderDefUsage, &WTD);//, //&fDefault); cvsiPrivate.idxSigner = listIndex; cvsiPrivate.fCounterSigner = FALSE; cvsiPrivate.idxCounterSigner = 0; cvsiPrivate.dwInheritedError = 0; cvsi.dwFlags |= CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_SIGNERINFO_PRIVATE; cvsi.dwReserved = (DWORD_PTR) &cvsiPrivate; } CryptUIDlgViewSignerInfoW(&cvsi); if (pcvs->szFileName != NULL) { FreeWinVTrustState( pcvs->szFileName, NULL, 0, NULL, szOID_PKIX_KP_CODE_SIGNING, &cryptProviderDefUsage, &WTD);//, //&fDefault); } if (pviewhelp->pcvs->choice == EncodedMessage_Chosen) { CryptMsgClose(hMsg); } } break; } break; case WM_DESTROY: LVITEMW lvItem; pviewhelp = (PCERT_VIEWSIGNATURES_HELPER) GetWindowLongPtr(hwndDlg, DWLP_USER); // // 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_SIGNATURES_SIG_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)) { free((void *) 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_SIGNATURES_SIG_LIST)) && (hwnd != GetDlgItem(hwndDlg, IDC_SIGNATURES_DETAILS_BUTTON))) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LRESULT)TRUE); return TRUE; } else { return OnContextHelp(hwndDlg, msg, wParam, lParam, helpmap); } break; } return FALSE; } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// UINT CALLBACK ViewSigsPropPageCallback( HWND hWnd, UINT uMsg, LPPROPSHEETPAGEW ppsp) { CERT_VIEWSIGNATURES_HELPER *pviewhelp = (CERT_VIEWSIGNATURES_HELPER *) ppsp->lParam; if (pviewhelp->pcvs->pPropPageCallback != NULL) { (*(pviewhelp->pcvs->pPropPageCallback))(hWnd, uMsg, pviewhelp->pcvs->pvCallbackData); } if (uMsg == PSPCB_RELEASE) { if (pviewhelp->fSelfCleanup) { if (pviewhelp->hExtraStore) CertCloseStore(pviewhelp->hExtraStore, 0); FreeViewSignaturesStruct(pviewhelp->pcvs); free(pviewhelp); } } return TRUE; } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// BOOL WINAPI CryptUIGetViewSignaturesPagesW( PCCRYPTUI_VIEWSIGNATURES_STRUCTW pcvs, PROPSHEETPAGEW **prghPropPages, DWORD *pcPropPages ) { BOOL fRetValue = TRUE; HRESULT hr; WCHAR rgwch[CRYPTUI_MAX_STRING_SIZE]; char rgch[CRYPTUI_MAX_STRING_SIZE]; CERT_VIEWSIGNATURES_HELPER *pviewhelp; PCRYPTUI_VIEWSIGNATURES_STRUCTW pNewcvs; CRYPT_DATA_BLOB EncodedMsg; if (pcvs->dwSize != sizeof(CRYPTUI_VIEWSIGNATURES_STRUCTW)) { SetLastError(E_INVALIDARG); return FALSE; } if (!CommonInit()) { return FALSE; } if (NULL == (pNewcvs = AllocAndCopyViewSignaturesStruct(pcvs))) { return FALSE; } if (NULL == (pviewhelp = (CERT_VIEWSIGNATURES_HELPER *) malloc(sizeof(CERT_VIEWSIGNATURES_HELPER)))) { FreeViewSignaturesStruct(pNewcvs); return FALSE; } *pcPropPages = 1; // // initialize the helper struct // memset (pviewhelp, 0, sizeof(CERT_VIEWSIGNATURES_HELPER)); pviewhelp->pcvs = pNewcvs; pviewhelp->fSelfCleanup = TRUE; if (pcvs->choice == EncodedMessage_Chosen) { EncodedMsg.pbData = pcvs->u.EncodedMessage.pbData; EncodedMsg.cbData = pcvs->u.EncodedMessage.cbData; pviewhelp->hExtraStore = CertOpenStore( CERT_STORE_PROV_PKCS7, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, NULL, NULL, (const void *) &EncodedMsg); } else { pviewhelp->hExtraStore = CertOpenStore( CERT_STORE_PROV_MSG, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, NULL, NULL, (const void *) pcvs->u.hMsg); } // // Build up the list of pages we are going to use in the dialog // *prghPropPages = (PROPSHEETPAGEW *) malloc((*pcPropPages) * sizeof(PROPSHEETPAGEW)); if (*prghPropPages == NULL) { FreeViewSignaturesStruct(pNewcvs); return FALSE; } memset(*prghPropPages, 0, (*pcPropPages) * sizeof(PROPSHEETPAGEW)); (*prghPropPages)[0].dwSize = sizeof((*prghPropPages)[0]); (*prghPropPages)[0].dwFlags = PSP_USECALLBACK; (*prghPropPages)[0].hInstance = HinstDll; (*prghPropPages)[0].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_SIGNATURES_GENERAL_DIALOG); (*prghPropPages)[0].hIcon = 0; (*prghPropPages)[0].pszTitle = NULL; (*prghPropPages)[0].pfnDlgProc = ViewPageViewSignatures; (*prghPropPages)[0].lParam = (LPARAM) pviewhelp; (*prghPropPages)[0].pfnCallback = ViewSigsPropPageCallback; (*prghPropPages)[0].pcRefParent = NULL; *pcPropPages = 1; return fRetValue; } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// BOOL WINAPI CryptUIGetViewSignaturesPagesA( PCCRYPTUI_VIEWSIGNATURES_STRUCTA pcvs, PROPSHEETPAGEA **prghPropPages, DWORD *pcPropPages ) { CRYPTUI_VIEWSIGNATURES_STRUCTW cvsW; BOOL fRet; memcpy(&cvsW, pcvs, sizeof(cvsW)); if (pcvs->szFileName != NULL) { cvsW.szFileName = CertUIMkWStr(pcvs->szFileName); } fRet = (CryptUIGetViewSignaturesPagesW( &cvsW, (PROPSHEETPAGEW**) prghPropPages, pcPropPages)); if (cvsW.szFileName != NULL) { free((void *) cvsW.szFileName); } return(fRet); } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// BOOL WINAPI CryptUIFreeViewSignaturesPagesW( PROPSHEETPAGEW *rghPropPages, DWORD cPropPages ) { free(rghPropPages); return TRUE; } ////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////// BOOL WINAPI CryptUIFreeViewSignaturesPagesA( PROPSHEETPAGEA *rghPropPages, DWORD cPropPages ) { return (CryptUIFreeViewSignaturesPagesW((PROPSHEETPAGEW *) rghPropPages, cPropPages)); }