Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

946 lines
28 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: view.cpp
//
//--------------------------------------------------------------------------
#include "global.hxx"
#include <dbgdef.h>
extern HINSTANCE HinstDll;
extern HMODULE HmodRichEdit;
#define SPECIAL_NO_COM_FLAG 0x8000
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewCertificateW(PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pcvp, BOOL *pfPropertiesChanged)
{
int cPages = 3;
UINT cDefaultPages = 0;
BOOL fRetValue = FALSE;
HRESULT hr;
PROPSHEETPAGEW * ppage = NULL;
INT_PTR ret;
WCHAR rgwch[CRYPTUI_MAX_STRING_SIZE];
char rgch[CRYPTUI_MAX_STRING_SIZE];
CERT_VIEW_HELPER viewhelp;
DWORD i;
CRYPTUI_INITDIALOG_STRUCT *pInitDlgStruct;
//
// it doesn't matter what this action is as long as it is a valid action, it is just used for
// freeing the WinVerifyTrust state
//
GUID gAction = WINTRUST_ACTION_GENERIC_CERT_VERIFY;
//
// We use the common controls -- so make sure they have been loaded
//
if (CommonInit() == FALSE)
{
return FALSE;
}
if (pcvp->dwSize != sizeof(CRYPTUI_VIEWCERTIFICATE_STRUCTW)) {
SetLastError(E_INVALIDARG);
return FALSE;
}
memset(&viewhelp, 0, sizeof(CERT_VIEW_HELPER));
viewhelp.pcvp = pcvp;
viewhelp.hwndGeneralPage = NULL;
viewhelp.hwndDetailPage = NULL;
viewhelp.hwndHierarchyPage = NULL;
viewhelp.pfPropertiesChanged = pfPropertiesChanged;
viewhelp.fIgnoreUntrustedRoot = (pcvp->dwFlags & CRYPTUI_ACCEPT_DECLINE_STYLE) ||
(pcvp->dwFlags & CRYPTUI_IGNORE_UNTRUSTED_ROOT);
viewhelp.fWarnUntrustedRoot = (pcvp->dwFlags & CRYPTUI_WARN_UNTRUSTED_ROOT);
viewhelp.fWarnRemoteTrust = (pcvp->dwFlags & CRYPTUI_WARN_REMOTE_TRUST);
//
// set the properties changed flag to FALSE initially, it will be set
// to TRUE if the user edits properties and actually changes them
//
if (viewhelp.pfPropertiesChanged != NULL)
{
*(viewhelp.pfPropertiesChanged) = FALSE;
}
//
// Initialize the CCertifcateBitmap class that is used in the general page
//
viewhelp.pCCertBmp = new (CCertificateBmp);
if (viewhelp.pCCertBmp == NULL)
{
SetLastError(E_OUTOFMEMORY);
return FALSE;
}
//
// this will calculate the initial usages that the cert in question is allowed
//
BuildChain(&viewhelp, NULL);
//
// set the BOOL that turns COM off if the special flag is set
//
viewhelp.fNoCOM = (pcvp->dwFlags & SPECIAL_NO_COM_FLAG);
//
// Build up the list of pages we are going to use in the dialog
//
ppage = (PROPSHEETPAGEW *) malloc((cPages+pcvp->cPropSheetPages) * sizeof(PROPSHEETPAGEW));
if (ppage == NULL) {
SetLastError(E_OUTOFMEMORY);
goto Exit;
}
memset(ppage, 0, cPages * sizeof(PROPSHEETPAGEW));
ppage[0].dwSize = sizeof(ppage[0]);
ppage[0].dwFlags = 0;
ppage[0].hInstance = HinstDll;
ppage[0].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CERTPROP_GENERAL);
ppage[0].hIcon = 0;
ppage[0].pszTitle = NULL;
ppage[0].pfnDlgProc = ViewPageGeneral;
ppage[0].lParam = (LPARAM) &viewhelp;
ppage[0].pfnCallback = 0;
ppage[0].pcRefParent = NULL;
cPages = 1;
if (!(pcvp->dwFlags & CRYPTUI_HIDE_DETAILPAGE)) {
ppage[cPages].dwSize = sizeof(ppage[0]);
ppage[cPages].dwFlags = 0;
ppage[cPages].hInstance = HinstDll;
ppage[cPages].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CERTPROP_DETAILS);
ppage[cPages].hIcon = 0;
ppage[cPages].pszTitle = NULL;
ppage[cPages].pfnDlgProc = ViewPageDetails;
ppage[cPages].lParam = (LPARAM) &viewhelp;
ppage[cPages].pfnCallback = 0;
ppage[cPages].pcRefParent = NULL;
cPages += 1;
}
if (!(pcvp->dwFlags & CRYPTUI_HIDE_HIERARCHYPAGE) &&
!(pcvp->dwFlags & CRYPTUI_ACCEPT_DECLINE_STYLE)) {
ppage[cPages].dwSize = sizeof(ppage[0]);
ppage[cPages].dwFlags = 0;
ppage[cPages].hInstance = HinstDll;
ppage[cPages].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CERTPROP_HIERARCHY);
ppage[cPages].hIcon = 0;
ppage[cPages].pszTitle = NULL;
ppage[cPages].pfnDlgProc = ViewPageHierarchy;
ppage[cPages].lParam = (LPARAM) &viewhelp;
ppage[cPages].pfnCallback = 0;
ppage[cPages].pcRefParent = NULL;
cPages += 1;
}
cDefaultPages = (UINT) cPages;
//
// Copy over the users pages
//
memcpy(&ppage[cPages], pcvp->rgPropSheetPages,
pcvp->cPropSheetPages * sizeof(PROPSHEETPAGEW));
//
// set the lParam for each of the callers property pages to
// be a pointer to a CRYPTUI_INITDIALOG_STRUCT structure
//
for (i=0; i<pcvp->cPropSheetPages; i++)
{
pInitDlgStruct = (CRYPTUI_INITDIALOG_STRUCT *) malloc(sizeof(CRYPTUI_INITDIALOG_STRUCT));
if (pInitDlgStruct == NULL)
{
SetLastError(E_OUTOFMEMORY);
return FALSE;
}
pInitDlgStruct->lParam = pcvp->rgPropSheetPages[i].lParam;
pInitDlgStruct->pCertContext = pcvp->pCertContext;
ppage[cPages].lParam = (LPARAM) pInitDlgStruct;
cPages++;
}
if (FIsWin95) {
PROPSHEETHEADERA hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvp->hwndParent != NULL) ? pcvp->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvp->szTitle != NULL) {
hdr.pszCaption = CertUIMkMBStr(pcvp->szTitle);
}
else {
LoadStringA(HinstDll, IDS_VIEW_TITLE, rgch, sizeof(rgch));
hdr.pszCaption = (LPSTR) rgch;
}
hdr.nPages = cPages;
hdr.nStartPage = (pcvp->nStartPage & 0x8000) ? ((UINT)(pcvp->nStartPage & ~0x8000)) + cDefaultPages : pcvp->nStartPage;
hdr.ppsp = ConvertToPropPageA(ppage, cPages);
if (hdr.ppsp == NULL)
{
if ((pcvp->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
goto Exit;
}
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetA(&hdr);
if ((pcvp->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
FreePropSheetPagesA((PROPSHEETPAGEA *) hdr.ppsp, cPages);
}
else
{
PROPSHEETHEADERW hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvp->hwndParent != NULL) ? pcvp->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvp->szTitle != NULL) {
hdr.pszCaption = pcvp->szTitle;
}
else {
LoadStringW(HinstDll, IDS_VIEW_TITLE, rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = (pcvp->nStartPage & 0x8000) ? ((UINT)(pcvp->nStartPage & ~0x8000)) + cDefaultPages : pcvp->nStartPage;
hdr.ppsp = (PROPSHEETPAGEW *) ppage;
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetW(&hdr);
}
//
// free the CRYPTUI_INITDIALOG_STRUCT structures
//
for (i=0; i<pcvp->cPropSheetPages; i++)
{
free((void *) ppage[i+cPages-1].lParam);
}
//
// free the WinVerifyTrust state if we need to
//
if (viewhelp.fFreeWTD)
{
viewhelp.sWTD.dwStateAction = WTD_STATEACTION_CLOSE;
WinVerifyTrustEx(NULL, &gAction, &viewhelp.sWTD);
}
//
// free all the usages that were allocated by
//
for (i=0; i<viewhelp.cUsages; i++)
{
free(viewhelp.rgUsages[i]);
}
if (viewhelp.rgUsages != NULL)
{
free(viewhelp.rgUsages);
}
if (viewhelp.pwszErrorString != NULL)
{
free(viewhelp.pwszErrorString);
}
if (viewhelp.fCancelled)
{
SetLastError(ERROR_CANCELLED);
}
fRetValue = (ret >= 1);
Exit:
if (viewhelp.pCCertBmp)
delete(viewhelp.pCCertBmp);
if (ppage)
free(ppage);
if (pcvp->dwFlags & CRYPTUI_ACCEPT_DECLINE_STYLE)
return (viewhelp.fAccept);
else
return fRetValue;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewCertificateA(PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pcvp, BOOL *pfPropertiesChanged)
{
BOOL fRet;
CRYPTUI_VIEWCERTIFICATE_STRUCTW cvpW;
memcpy(&cvpW, pcvp, sizeof(cvpW));
if (!ConvertToPropPageW(
pcvp->rgPropSheetPages,
pcvp->cPropSheetPages,
&(cvpW.rgPropSheetPages)))
{
return FALSE;
}
cvpW.szTitle = CertUIMkWStr(pcvp->szTitle);
fRet = CryptUIDlgViewCertificateW(&cvpW, pfPropertiesChanged);
if (cvpW.szTitle != NULL)
free((void *)cvpW.szTitle);
FreePropSheetPagesW((LPPROPSHEETPAGEW) cvpW.rgPropSheetPages, cvpW.cPropSheetPages);
return fRet;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewCTLW(PCCRYPTUI_VIEWCTL_STRUCTW pcvctl)
{
int cPages = 2;
BOOL fRetValue = FALSE;
HRESULT hr;
PROPSHEETPAGEW * ppage = NULL;
INT_PTR ret;
WCHAR rgwch[100];
CTL_VIEW_HELPER viewhelp;
DWORD i;
CRYPTUI_VIEWSIGNATURES_STRUCTW cvs;
PROPSHEETPAGEW * prghExtraPages;
DWORD cExtraPages;
// We use the common controls -- so make sure they have been loaded
if (CommonInit() == FALSE)
{
return FALSE;
}
if (pcvctl->dwSize != sizeof(CRYPTUI_VIEWCTL_STRUCTW)) {
SetLastError(E_INVALIDARG);
return FALSE;
}
//
memset(&viewhelp, 0, sizeof(CTL_VIEW_HELPER));
viewhelp.pcvctl = pcvctl;
viewhelp.hExtraStore = CertOpenStore(
CERT_STORE_PROV_MSG,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
NULL,
NULL,
(const void *) pcvctl->pCTLContext->hCryptMsg);
//
// Build up the list of pages we are going to use in the dialog
//
ppage = (PROPSHEETPAGEW *) malloc((cPages+pcvctl->cPropSheetPages) * sizeof(PROPSHEETPAGEW));
if (ppage == NULL) {
goto Exit;
}
memset(ppage, 0, cPages * sizeof(PROPSHEETPAGEW));
ppage[0].dwSize = sizeof(ppage[0]);
ppage[0].dwFlags = 0;
ppage[0].hInstance = HinstDll;
ppage[0].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CTL_GENERAL);
ppage[0].hIcon = 0;
ppage[0].pszTitle = NULL;
ppage[0].pfnDlgProc = ViewPageCTLGeneral;
ppage[0].lParam = (LPARAM) &viewhelp;
ppage[0].pfnCallback = 0;
ppage[0].pcRefParent = NULL;
cPages = 1;
//
// if the subject usage is for a catalog file, then display that page instead of CTL page
//
if (fIsCatalogFile(&(pcvctl->pCTLContext->pCtlInfo->SubjectUsage)))
{
ppage[cPages].dwSize = sizeof(ppage[0]);
ppage[cPages].dwFlags = 0;
ppage[cPages].hInstance = HinstDll;
ppage[cPages].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CATALOGFILE);
ppage[cPages].hIcon = 0;
ppage[cPages].pszTitle = NULL;
ppage[cPages].pfnDlgProc = ViewPageCatalogEntries;
ppage[cPages].lParam = (LPARAM) &viewhelp;
ppage[cPages].pfnCallback = 0;
ppage[cPages].pcRefParent = NULL;
cPages += 1;
}
else
{
if (!(pcvctl->dwFlags & CRYPTUI_HIDE_TRUSTLIST_PAGE))
{
ppage[cPages].dwSize = sizeof(ppage[0]);
ppage[cPages].dwFlags = 0;
ppage[cPages].hInstance = HinstDll;
ppage[cPages].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CTL_TRUSTLIST);
ppage[cPages].hIcon = 0;
ppage[cPages].pszTitle = NULL;
ppage[cPages].pfnDlgProc = ViewPageCTLTrustList;
ppage[cPages].lParam = (LPARAM) &viewhelp;
ppage[cPages].pfnCallback = 0;
ppage[cPages].pcRefParent = NULL;
cPages += 1;
}
}
//
// Copy over the users pages
//
memcpy(&ppage[cPages], pcvctl->rgPropSheetPages,
pcvctl->cPropSheetPages * sizeof(PROPSHEETPAGEW));
cPages += pcvctl->cPropSheetPages;
if (FIsWin95)
{
PROPSHEETHEADERA hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvctl->hwndParent != NULL) ? pcvctl->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvctl->szTitle != NULL)
{
hdr.pszCaption = CertUIMkMBStr(pcvctl->szTitle);
}
else if (fIsCatalogFile(&(pcvctl->pCTLContext->pCtlInfo->SubjectUsage)))
{
LoadStringA(HinstDll, IDS_CATALOG_TITLE, (LPSTR) rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = (LPSTR) rgwch;
}
else
{
LoadStringA(HinstDll, IDS_CTLVIEW_TITLE, (LPSTR) rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = (LPSTR) rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = 0;
hdr.ppsp = ConvertToPropPageA(ppage, cPages);
if (hdr.ppsp == NULL)
{
if ((pcvctl->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
goto Exit;
}
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetA(&hdr);
if ((pcvctl->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
FreePropSheetPagesA((PROPSHEETPAGEA *) hdr.ppsp, cPages);
}
else {
PROPSHEETHEADERW hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvctl->hwndParent != NULL) ? pcvctl->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvctl->szTitle != NULL)
{
hdr.pszCaption = pcvctl->szTitle;
}
else if (fIsCatalogFile(&(pcvctl->pCTLContext->pCtlInfo->SubjectUsage)))
{
LoadStringW(HinstDll, IDS_CATALOG_TITLE, rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = rgwch;
}
else
{
LoadStringW(HinstDll, IDS_CTLVIEW_TITLE, rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = 0;
hdr.ppsp = (PROPSHEETPAGEW *) ppage;
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetW(&hdr);
}
CertCloseStore(viewhelp.hExtraStore, 0);
if (viewhelp.fCancelled)
{
SetLastError(ERROR_CANCELLED);
}
fRetValue = (ret >= 1);
Exit:
if (ppage)
free(ppage);
return fRetValue;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewCTLA(PCCRYPTUI_VIEWCTL_STRUCTA pcvctl)
{
BOOL fRet;
CRYPTUI_VIEWCTL_STRUCTW cvctlW;
memcpy(&cvctlW, pcvctl, sizeof(cvctlW));
if (!ConvertToPropPageW(
pcvctl->rgPropSheetPages,
pcvctl->cPropSheetPages,
&(cvctlW.rgPropSheetPages)))
{
return FALSE;
}
cvctlW.szTitle = CertUIMkWStr(pcvctl->szTitle);
fRet = CryptUIDlgViewCTLW(&cvctlW);
if (cvctlW.szTitle != NULL)
free((void *)cvctlW.szTitle);
FreePropSheetPagesW((LPPROPSHEETPAGEW) cvctlW.rgPropSheetPages, cvctlW.cPropSheetPages);
return fRet;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewCRLW(PCCRYPTUI_VIEWCRL_STRUCTW pcvcrl)
{
int cPages = 2;
BOOL fRetValue = FALSE;
HRESULT hr;
PROPSHEETPAGEW * ppage = NULL;
INT_PTR ret;
WCHAR rgwch[CRYPTUI_MAX_STRING_SIZE];
CRL_VIEW_HELPER viewhelp;
DWORD i;
// We use the common controls -- so make sure they have been loaded
if (CommonInit() == FALSE)
{
return FALSE;
}
if (pcvcrl->dwSize != sizeof(CRYPTUI_VIEWCRL_STRUCTW)) {
SetLastError(E_INVALIDARG);
return FALSE;
}
//
memset(&viewhelp, 0, sizeof(CRL_VIEW_HELPER));
viewhelp.pcvcrl = pcvcrl;
//
// Build up the list of pages we are going to use in the dialog
//
ppage = (PROPSHEETPAGEW *) malloc((cPages+pcvcrl->cPropSheetPages) * sizeof(PROPSHEETPAGEW));
if (ppage == NULL) {
goto Exit;
}
memset(ppage, 0, cPages * sizeof(PROPSHEETPAGEW));
ppage[0].dwSize = sizeof(ppage[0]);
ppage[0].dwFlags = 0;
ppage[0].hInstance = HinstDll;
ppage[0].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CRL_GENERAL);
ppage[0].hIcon = 0;
ppage[0].pszTitle = NULL;
ppage[0].pfnDlgProc = ViewPageCRLGeneral;
ppage[0].lParam = (LPARAM) &viewhelp;
ppage[0].pfnCallback = 0;
ppage[0].pcRefParent = NULL;
cPages = 1;
if (!(pcvcrl->dwFlags & CRYPTUI_HIDE_REVOCATIONLIST_PAGE)) {
ppage[cPages].dwSize = sizeof(ppage[0]);
ppage[cPages].dwFlags = 0;
ppage[cPages].hInstance = HinstDll;
ppage[cPages].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_CRL_REVOCATIONLIST);
ppage[cPages].hIcon = 0;
ppage[cPages].pszTitle = NULL;
ppage[cPages].pfnDlgProc = ViewPageCRLRevocationList;
ppage[cPages].lParam = (LPARAM) &viewhelp;
ppage[cPages].pfnCallback = 0;
ppage[cPages].pcRefParent = NULL;
cPages += 1;
}
//
// Copy over the users pages
//
memcpy(&ppage[cPages], pcvcrl->rgPropSheetPages,
pcvcrl->cPropSheetPages * sizeof(PROPSHEETPAGEW));
cPages += pcvcrl->cPropSheetPages;
if (FIsWin95) {
PROPSHEETHEADERA hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvcrl->hwndParent != NULL) ? pcvcrl->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvcrl->szTitle != NULL) {
hdr.pszCaption = CertUIMkMBStr(pcvcrl->szTitle);
}
else {
LoadStringA(HinstDll, IDS_CRLVIEW_TITLE, (LPSTR) rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = (LPSTR) rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = 0;
hdr.ppsp = ConvertToPropPageA(ppage, cPages);
if (hdr.ppsp == NULL)
{
if ((pcvcrl->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
goto Exit;
}
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetA(&hdr);
if ((pcvcrl->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
FreePropSheetPagesA((PROPSHEETPAGEA *) hdr.ppsp, cPages);
}
else {
PROPSHEETHEADERW hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvcrl->hwndParent != NULL) ? pcvcrl->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvcrl->szTitle != NULL) {
hdr.pszCaption = pcvcrl->szTitle;
}
else {
LoadStringW(HinstDll, IDS_CRLVIEW_TITLE, rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = 0;
hdr.ppsp = (PROPSHEETPAGEW *) ppage;
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetW(&hdr);
}
if (viewhelp.fCancelled)
{
SetLastError(ERROR_CANCELLED);
}
fRetValue = (ret >= 1);
Exit:
if (ppage)
free(ppage);
return fRetValue;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewCRLA(PCCRYPTUI_VIEWCRL_STRUCTA pcvcrl)
{
BOOL fRet;
CRYPTUI_VIEWCRL_STRUCTW cvcrlW;
memcpy(&cvcrlW, pcvcrl, sizeof(cvcrlW));
if (!ConvertToPropPageW(
pcvcrl->rgPropSheetPages,
pcvcrl->cPropSheetPages,
&(cvcrlW.rgPropSheetPages)))
{
return FALSE;
}
cvcrlW.szTitle = CertUIMkWStr(pcvcrl->szTitle);
fRet = CryptUIDlgViewCRLW(&cvcrlW);
if (cvcrlW.szTitle != NULL)
free((void *)cvcrlW.szTitle);
FreePropSheetPagesW((LPPROPSHEETPAGEW) cvcrlW.rgPropSheetPages, cvcrlW.cPropSheetPages);
return fRet;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewSignerInfoW(PCCRYPTUI_VIEWSIGNERINFO_STRUCTW pcvsi)
{
int cPages = 2;
BOOL fRetValue = FALSE;
HRESULT hr;
PROPSHEETPAGEW * ppage = NULL;
INT_PTR ret;
WCHAR rgwch[CRYPTUI_MAX_STRING_SIZE];
SIGNER_VIEW_HELPER viewhelp;
DWORD i;
// We use the common controls -- so make sure they have been loaded
if (CommonInit() == FALSE)
{
return FALSE;
}
if (pcvsi->dwSize != sizeof(CRYPTUI_VIEWSIGNERINFO_STRUCTW)) {
SetLastError(E_INVALIDARG);
return FALSE;
}
//
memset(&viewhelp, 0, sizeof(SIGNER_VIEW_HELPER));
viewhelp.pcvsi = pcvsi;
if (pcvsi->dwFlags & CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_SIGNERINFO_PRIVATE)
{
viewhelp.pPrivate = (PCERT_VIEWSIGNERINFO_PRIVATE) pcvsi->dwReserved;
}
else if (pcvsi->dwFlags & CRYPTUI_VIEWSIGNERINFO_RESERVED_FIELD_IS_ERROR_CODE)
{
viewhelp.dwInheritedError = (DWORD) pcvsi->dwReserved;
}
viewhelp.fPrivateAllocated = FALSE;
viewhelp.hExtraStore = CertOpenStore(
CERT_STORE_PROV_MSG,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
NULL,
NULL,
(const void *) pcvsi->hMsg);
//
// Build up the list of pages we are going to use in the dialog
//
ppage = (PROPSHEETPAGEW *) malloc((cPages+pcvsi->cPropSheetPages) * sizeof(PROPSHEETPAGEW));
if (ppage == NULL) {
goto Exit;
}
memset(ppage, 0, cPages * sizeof(PROPSHEETPAGEW));
ppage[0].dwSize = sizeof(ppage[0]);
ppage[0].dwFlags = 0;
ppage[0].hInstance = HinstDll;
ppage[0].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_SIGNER_GENERAL_DIALOG);
ppage[0].hIcon = 0;
ppage[0].pszTitle = NULL;
ppage[0].pfnDlgProc = ViewPageSignerGeneral;
ppage[0].lParam = (LPARAM) &viewhelp;
ppage[0].pfnCallback = 0;
ppage[0].pcRefParent = NULL;
cPages = 1;
if (!(pcvsi->dwFlags & CRYPTUI_HIDE_TRUSTLIST_PAGE)) {
ppage[cPages].dwSize = sizeof(ppage[0]);
ppage[cPages].dwFlags = 0;
ppage[cPages].hInstance = HinstDll;
ppage[cPages].pszTemplate = (LPWSTR) MAKEINTRESOURCE(IDD_SIGNER_ADVANCED_DIALOG);
ppage[cPages].hIcon = 0;
ppage[cPages].pszTitle = NULL;
ppage[cPages].pfnDlgProc = ViewPageSignerAdvanced;
ppage[cPages].lParam = (LPARAM) &viewhelp;
ppage[cPages].pfnCallback = 0;
ppage[cPages].pcRefParent = NULL;
cPages += 1;
}
//
// Copy over the users pages
//
memcpy(&ppage[cPages], pcvsi->rgPropSheetPages,
pcvsi->cPropSheetPages * sizeof(PROPSHEETPAGEW));
cPages += pcvsi->cPropSheetPages;
if (FIsWin95) {
PROPSHEETHEADERA hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvsi->hwndParent != NULL) ? pcvsi->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvsi->szTitle != NULL) {
hdr.pszCaption = CertUIMkMBStr(pcvsi->szTitle);
}
else {
LoadStringA(HinstDll, IDS_SIGNERVIEW_TITLE, (LPSTR) rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = (LPSTR) rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = 0;
hdr.ppsp = ConvertToPropPageA(ppage, cPages);
if (hdr.ppsp == NULL)
{
if ((pcvsi->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
goto Exit;
}
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetA(&hdr);
if ((pcvsi->szTitle != NULL) && (hdr.pszCaption != NULL))
{
free((void *)hdr.pszCaption);
}
FreePropSheetPagesA((PROPSHEETPAGEA *) hdr.ppsp, cPages);
}
else {
PROPSHEETHEADERW hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.dwSize = sizeof(hdr);
hdr.dwFlags = PSH_USECALLBACK | PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
hdr.hwndParent = (pcvsi->hwndParent != NULL) ? pcvsi->hwndParent : GetDesktopWindow();
hdr.hInstance = HinstDll;
hdr.hIcon = NULL;
if (pcvsi->szTitle != NULL) {
hdr.pszCaption = pcvsi->szTitle;
}
else {
LoadStringW(HinstDll, IDS_SIGNERVIEW_TITLE, rgwch, ARRAYSIZE(rgwch));
hdr.pszCaption = rgwch;
}
hdr.nPages = cPages;
hdr.nStartPage = 0;
hdr.ppsp = (PROPSHEETPAGEW *) ppage;
hdr.pfnCallback = HidePropSheetCancelButtonCallback;
ret = CryptUIPropertySheetW(&hdr);
}
CertCloseStore(viewhelp.hExtraStore, 0);
if (viewhelp.fCancelled)
{
SetLastError(ERROR_CANCELLED);
}
fRetValue = (ret >= 1);
Exit:
if (ppage)
free(ppage);
return fRetValue;
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI
CryptUIDlgViewSignerInfoA(PCCRYPTUI_VIEWSIGNERINFO_STRUCTA pcvsi)
{
BOOL fRet;
CRYPTUI_VIEWSIGNERINFO_STRUCTW cvsiW;
memcpy(&cvsiW, pcvsi, sizeof(cvsiW));
if (!ConvertToPropPageW(
pcvsi->rgPropSheetPages,
pcvsi->cPropSheetPages,
&(cvsiW.rgPropSheetPages)))
{
return FALSE;
}
cvsiW.szTitle = CertUIMkWStr(pcvsi->szTitle);
fRet = CryptUIDlgViewSignerInfoW(&cvsiW);
if (cvsiW.szTitle)
free((void *)cvsiW.szTitle);
FreePropSheetPagesW((LPPROPSHEETPAGEW) cvsiW.rgPropSheetPages, cvsiW.cPropSheetPages);
return fRet;
}