windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/ui/wizards/wzrdpvk.h
2020-09-26 16:20:57 +08:00

805 lines
28 KiB
C++

//--------------------------------------------------------------
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: wzrdpvk.h
//
// Contents: The private include file for cryptext.dll.
//
// History: 16-09-1997 xiaohs created
//
//--------------------------------------------------------------
#ifndef WZRDPVK_H
#define WZRDPVK_H
#include <windows.h>
#include <stddef.h>
#include <malloc.h>
#include <shellapi.h>
#include <shlobj.h>
#include <string.h>
#include <objbase.h>
#include <windowsx.h>
#include <lmcons.h>
#include <prsht.h>
#include <stdlib.h>
#include <search.h>
#include <commctrl.h>
#include <rpc.h>
#include <commdlg.h>
#include <objsel.h>
#include "wincrypt.h"
#include "unicode.h"
#include "unicode5.h"
#include "crtem.h"
#include "certcli.h"
#include "certrpc.h"
#include "cryptui.h"
#include "lenroll.h"
#include "pfx.h"
#include "wintrust.h"
#include "signer.h"
#include "dbgdef.h"
#include "keysvc.h"
#include "keysvcc.h"
#include "certsrv.h"
#include "resource.h"
#include "internal.h"
#include "certca.h"
#ifdef __cplusplus
extern "C" {
#endif
//global data
extern HINSTANCE g_hmodThisDll;
#define MAX_STRING_SIZE 512
#define MAX_TITLE_LENGTH 200
#define g_dwMsgAndCertEncodingType PKCS_7_ASN_ENCODING | X509_ASN_ENCODING
#define g_wszTimeStamp L"http://timestamp.verisign.com/scripts/timstamp.dll"
// Macros to allow for easier definition of locally scoped functions
// and data. In the example below, observe that the helper function
// "functionHelper" does not pollute the gobal namespace, yet still
// provides a procedural abstraction for use within "function".
//
// Example:
//
// void function() {
// LocalScope(HelperScope):
// void functionHelper() {
// // Do something here.
// }
// EndLocalScope;
//
// while (...) {
// ...
// local.functionHelper();
// }
// }
//
#define LocalScope(ScopeName) struct ScopeName##TheLocalScope { public
#define EndLocalScope } local
// Simple error-handling macros.
//
// Same as _JumpCondition, but with a third parameter, expr.
// Expr is not used in the macro, and is executed for side effects only.
#define _JumpConditionWithExpr(condition, label, expr) if (condition) { expr; goto label; } else { }
// A macro for the common test & goto instruction combination:
#define _JumpCondition(condition, label) if (condition) { goto label; } else { }
//-----------------------------------------------------------------------
// ENROLL_PURPOSE_INFO
//
//------------------------------------------------------------------------
typedef struct _ENROLL_PURPOSE_INFO
{
LPSTR pszOID;
LPWSTR pwszName;
BOOL fSelected;
BOOL fFreeOID;
BOOL fFreeName;
}ENROLL_PURPOSE_INFO;
//-----------------------------------------------------------------------
// ENROLL_OID_INFO
//
//------------------------------------------------------------------------
typedef struct _ENROLL_OID_INFO
{
LPWSTR pwszName;
BOOL fSelected;
LPSTR pszOID;
}ENROLL_OID_INFO;
//-----------------------------------------------------------------------
// ENROLL_CERT_TYPE_INFO
//
//------------------------------------------------------------------------
typedef struct _ENROLL_CERT_TYPE_INFO
{
LPWSTR pwszDNName; //the fully distinguished DN name of the cert type
LPWSTR pwszCertTypeName;
BOOL fSelected;
PCERT_EXTENSIONS pCertTypeExtensions;
DWORD dwKeySpec;
DWORD dwMinKeySize;
DWORD dwRASignature;
DWORD dwCSPCount; //the count of CSP list
DWORD *rgdwCSP; //the array of CSP list
DWORD dwEnrollmentFlags;
DWORD dwSubjectNameFlags;
DWORD dwPrivateKeyFlags;
DWORD dwGeneralFlags;
}ENROLL_CERT_TYPE_INFO;
//-----------------------------------------------------------------------
// PURPOSE_INFO_CALL_BACK
//
//------------------------------------------------------------------------
typedef struct _PURPOSE_INFO_CALL_BACK
{
DWORD *pdwCount;
ENROLL_PURPOSE_INFO ***pprgPurpose;
}PURPOSE_INFO_CALL_BACK;
//-----------------------------------------------------------------------
// PURPOSE_INFO_CALL_BACK
//
//------------------------------------------------------------------------
typedef struct _OID_INFO_CALL_BACK
{
DWORD *pdwOIDCount;
ENROLL_OID_INFO **pprgOIDInfo;
}OID_INFO_CALL_BACK;
///-----------------------------------------------------------------------
// CRYPT_WIZ_CERT_CA
//
//------------------------------------------------------------------------
typedef struct _CRYPTUI_WIZ_CERT_CA
{
DWORD dwSize;
LPWSTR pwszCALocation;
LPWSTR pwszCAName;
BOOL fSelected;
DWORD dwOIDInfo;
ENROLL_OID_INFO *rgOIDInfo;
DWORD dwCertTypeInfo;
ENROLL_CERT_TYPE_INFO *rgCertTypeInfo;
}CRYPTUI_WIZ_CERT_CA, *PCRYPTUI_WIZ_CERT_CA;
typedef const CRYPTUI_WIZ_CERT_CA *PCCRYPTUI_WIZ_CERT_CA;
///-----------------------------------------------------------------------
// CRYPTUI_WIZ_CERT_CA_INFO
//
//------------------------------------------------------------------------
typedef struct _CRYPTUI_WIZ_CERT_CA_INFO
{
DWORD dwSize;
DWORD dwCA;
PCRYPTUI_WIZ_CERT_CA rgCA;
}CRYPTUI_WIZ_CERT_CA_INFO, *PCRYPTUI_WIZ_CERT_CA_INFO;
typedef const CRYPTUI_WIZ_CERT_CA_INFO *PCCRYPTUI_WIZ_CERT_CA_INFO;
typedef void * HCERTREQUESTER;
#define CRYPTUI_WIZ_CERT_REQUEST_STATUS_INSTALL_FAILED 10
#define CRYPTUI_WIZ_CERT_REQUEST_STATUS_INSTALL_CANCELLED 11
#define CRYPTUI_WIZ_CERT_REQUEST_STATUS_KEYSVC_FAILED 12
#define CRYPTUI_WIZ_CERT_REQUEST_STATUS_REQUEST_CREATED 13
//-----------------------------------------------------------------------
// CERT_WIZARD_INFO
//
//
// This struct contains everything you will ever need to enroll(renew)
// a certificate. This struct is private to the dll
//------------------------------------------------------------------------
typedef struct _CERT_WIZARD_INFO
{
DWORD dwFlags;
DWORD dwPurpose;
HWND hwndParent;
BOOL fConfirmation;
LPCWSTR pwszConfirmationTitle;
UINT idsConfirmTitle;
UINT idsText; //the ids for message box
HRESULT hr; //the hresult of I_EnrollCertificate
BOOL fNewKey;
DWORD dwPostOption;
PCCERT_CONTEXT pCertContext;
BOOL fLocal;
LPCWSTR pwszMachineName;
LPCWSTR pwszAccountName;
DWORD dwStoreFlags;
void *pAuthentication;
LPCWSTR pwszRequestString;
LPWSTR pwszCALocation;
LPWSTR pwszCAName;
PCRYPTUI_WIZ_CERT_CA_INFO pCertCAInfo;
DWORD dwCAIndex;
LPCWSTR pwszDesStore;
LPCWSTR pwszCertDNName;
LPCSTR pszHashAlg;
LPWSTR pwszFriendlyName;
LPWSTR pwszDescription;
DWORD dwProviderType;
LPWSTR pwszProvider;
DWORD dwProviderFlags;
LPCWSTR pwszKeyContainer;
DWORD dwKeySpec;
DWORD dwGenKeyFlags;
DWORD dwMinKeySize;
DWORD dwEnrollmentFlags;
DWORD dwSubjectNameFlags;
DWORD dwPrivateKeyFlags;
DWORD dwGeneralFlags;
HFONT hBigBold;
HFONT hBold;
DWORD dwCSPCount;
DWORD *rgdwProviderType;
LPWSTR *rgwszProvider;
BOOL fCertTypeChanged; //Whether user has changed the cert type selection:
DWORD dwStatus;
PCERT_EXTENSIONS pCertRequestExtensions;
PCCERT_CONTEXT pNewCertContext;
LPWSTR pwszSelectedCertTypeDN; //the DN name of the selected cert type
BOOL fUICSP; //fCSPPage: whether we need to show the CSP page in the UI
BOOL fUIAdv; //whether we need to show the advanced options in the UI
BOOL fCAInput; //whether user has passed me the CA information
int iOrgCertType; //mark the original selected CertType index
int iOrgCSP; //mark the original selected CSP index
DWORD dwOrgCA; //mark the original selected CA. This CA has priority when we make our CA selection
BOOL fMachine;
BOOL fIgnore; //whether we ignore the dwKeySpec and exportable GenKeyFlags.
BOOL fKnownCSP; //whether the CSP was selected by the API
DWORD dwOrgCSPType; //the orignal CSP type
LPWSTR pwszOrgCSPName; //the orignal CSP name
LPWSTR *awszAllowedCertTypes; //Allowed cert types for remote enrollment or local machin enrollment
LPWSTR *awszValidCA; //Allowed cert types for remote enrollment or local machin enrollment
HCURSOR hPrevCursor; //the privous cursor before we change it to the hour glass
HCURSOR hWinPrevCursor; //the privous cursor before we change it to the hour glass
BOOL fCursorChanged; //keep track if the cursor has been changed
LPWSTR pwszCADisplayName; //the cached CA display name.
HCERTREQUESTER hRequester;
}CERT_WIZARD_INFO;
//-----------------------------------------------------------------------
// ENROLL_PAGE_INFO
//
//------------------------------------------------------------------------
typedef struct _ENROLL_PAGE_INFO
{
LPCWSTR pszTemplate;
DLGPROC pfnDlgProc;
}ENROLL_PAGE_INFO;
//-----------------------------------------------------------------------
// Constats
//
//------------------------------------------------------------------------
#define ENROLL_PROP_SHEET 6
#define RENEW_PROP_SHEET 5
#define IMPORT_PROP_SHEET 5
#define BUILDCTL_PROP_SHEET 6
#define SIGN_PROP_SHEET 10
//flags for the column sorting function's lParamSort
#define SORT_COLUMN_ISSUER 0x0001
#define SORT_COLUMN_SUBJECT 0x0002
#define SORT_COLUMN_EXPIRATION 0x0004
#define SORT_COLUMN_PURPOSE 0x0008
#define SORT_COLUMN_NAME 0x0010
#define SORT_COLUMN_LOCATION 0x0020
#define SORT_COLUMN_ASCEND 0x00010000
#define SORT_COLUMN_DESCEND 0x00020000
//-----------------------------------------------------------------------
// Function Prototypes
//
//------------------------------------------------------------------------
BOOL InitCertCAOID(PCCRYPTUI_WIZ_CERT_REQUEST_INFO pCertRequestInfo,
DWORD *pdwOIDInfo,
ENROLL_OID_INFO **pprgOIDInfo);
BOOL FreeCertCAOID(DWORD dwOIDInfo,
ENROLL_OID_INFO *pOIDInfo);
BOOL InitCertCA(CERT_WIZARD_INFO *pCertWizardInfo,
PCRYPTUI_WIZ_CERT_CA pCertCA,
LPWSTR pwszCALocation,
LPWSTR pwszCAName,
BOOL fCASelected,
PCCRYPTUI_WIZ_CERT_REQUEST_INFO pCertRequestInfo,
DWORD dwOIDInfo,
ENROLL_OID_INFO *pOIDInfo,
BOOL fSearchForCertType);
BOOL FreeCertCACertType(DWORD dwCertTypeInfo,
ENROLL_CERT_TYPE_INFO *rgCertTypeInfo);
BOOL AddCertTypeToCertCA(DWORD *pdwCertTypeInfo,
ENROLL_CERT_TYPE_INFO **ppCertTypeInfo,
LPWSTR pwszDNName,
LPWSTR pwszCertType,
PCERT_EXTENSIONS pCertExtensions,
BOOL fSelected,
DWORD dwKeySpec,
DWORD dwCertTypeFlag,
DWORD dwCSPCount,
DWORD *pdwCSPList,
DWORD dwRASignatures,
DWORD dwEnrollmentFlags,
DWORD dwSubjectNameFlags,
DWORD dwPrivateKeyFlags,
DWORD dwGeneralFlags
);
BOOL
WINAPI
CertRequestNoSearchCA(
BOOL fSearchCertType,
CERT_WIZARD_INFO *pCertWizardInfo,
DWORD dwFlags,
HWND hwndParent,
LPCWSTR pwszWizardTitle,
PCCRYPTUI_WIZ_CERT_REQUEST_INFO pCertRequestInfo,
PCCERT_CONTEXT *ppCertContext,
DWORD *pCAdwStatus,
UINT *pIds);
BOOL
WINAPI
CreateCertRequestNoSearchCANoDS
(IN CERT_WIZARD_INFO *pCertWizardInfo,
IN DWORD dwFlags,
IN HCERTTYPE hCertType,
OUT HANDLE *pResult);
BOOL
WINAPI
CertRequestSearchCA(
CERT_WIZARD_INFO *pCertWizardInfo,
DWORD dwFlags,
HWND hwndParent,
LPCWSTR pwszWizardTitle,
PCCRYPTUI_WIZ_CERT_REQUEST_INFO pCertRequestInfo,
PCCERT_CONTEXT *ppCertContext,
DWORD *pCAdwStatus,
UINT *pIds);
BOOL
WINAPI
SubmitCertRequestNoSearchCANoDS
(IN HANDLE hRequest,
IN LPCWSTR pwszCAName,
IN LPCWSTR pwszCALocation,
OUT DWORD *pdwStatus,
OUT PCCERT_CONTEXT *ppCertContext);
void
WINAPI
FreeCertRequestNoSearchCANoDS
(IN HANDLE hRequest);
BOOL
WINAPI
QueryCertRequestNoSearchCANoDS
(IN HANDLE hRequest, OUT CRYPTUI_WIZ_QUERY_CERT_REQUEST_INFO *pQueryInfo);
BOOL
WINAPI
CryptUIWizCertRequestWithCAInfo(
CERT_WIZARD_INFO *pCertWizardInfo,
DWORD dwFlags,
HWND hwndParent,
LPCWSTR pwszWizardTitle,
PCCRYPTUI_WIZ_CERT_REQUEST_INFO pCertRequestInfo,
PCCRYPTUI_WIZ_CERT_CA_INFO pCertRequestCAInfo,
PCCERT_CONTEXT *ppCertContext,
DWORD *pdwStatus,
UINT *pIds);
int I_MessageBox(
HWND hWnd,
UINT idsText,
UINT idsCaption,
LPCWSTR pwszCaption,
UINT uType);
HRESULT MarshallRequestParameters(IN DWORD dwCSPIndex,
IN CERT_WIZARD_INFO *pCertWizardInfo,
IN OUT CERT_BLOB *pCertBlob,
IN OUT CERT_REQUEST_PVK_NEW *pCertRequestPvkNew,
IN OUT CERT_REQUEST_PVK_NEW *pCertRenewPvk,
IN OUT LPWSTR *ppwszHashAlg,
IN OUT CERT_ENROLL_INFO *pRequestInfo);
void FreeRequestParameters(IN LPWSTR *ppwszHashAlg,
IN CERT_ENROLL_INFO *RequestInfo);
HRESULT WINAPI CreateRequest(DWORD dwFlags, //IN Required
DWORD dwPurpose, //IN Required: Whether it is enrollment or renew
LPWSTR pwszCAName, //IN Required:
LPWSTR pwszCALocation, //IN Required:
CERT_BLOB *pCertBlob, //IN Required: The renewed certifcate
CERT_REQUEST_PVK_NEW *pRenewKey, //IN Required: The private key on the certificate
BOOL fNewKey, //IN Required: Set the TRUE if new private key is needed
CERT_REQUEST_PVK_NEW *pKeyNew, //IN Required: The private key information
LPWSTR pwszHashAlg, //IN Optional: The hash algorithm
LPWSTR pwszDesStore, //IN Optional: The destination store
DWORD dwStoreFlags, //IN Optional: The store flags
CERT_ENROLL_INFO *pRequestInfo, //IN Required: The information about the cert request
HANDLE *hRequest //OUT Required: A handle to the PKCS10 request created
);
HRESULT WINAPI SubmitRequest(IN HANDLE hRequest,
IN BOOL fKeyService, //IN Required: Whether the function is called remotely
IN DWORD dwPurpose, //IN Required: Whether it is enrollment or renew
IN BOOL fConfirmation, //IN Required: Set the TRUE if confirmation dialogue is needed
IN HWND hwndParent, //IN Optional: The parent window
IN LPWSTR pwszConfirmationTitle, //IN Optional: The title for confirmation dialogue
IN UINT idsConfirmTitle, //IN Optional: The resource ID for the title of the confirmation dialogue
IN LPWSTR pwszCALocation, //IN Required: The ca machine name
IN LPWSTR pwszCAName, //IN Required: The ca name
IN LPWSTR pwszCADisplayName, // IN Optional: The display name of the CA.
OUT CERT_BLOB *pPKCS7Blob, //OUT Optional: The PKCS7 from the CA
OUT CERT_BLOB *pHashBlob, //OUT Optioanl: The SHA1 hash of the enrolled/renewed certificate
OUT DWORD *pdwDisposition, //OUT Optional: The status of the enrollment/renewal
OUT PCCERT_CONTEXT *ppCertContext //OUT Optional: The enrolled certificate
);
void WINAPI FreeRequest(IN HANDLE hRequest);
BOOL WINAPI QueryRequest(IN HANDLE hRequest, OUT CRYPTUI_WIZ_QUERY_CERT_REQUEST_INFO *pQueryInfo);
BOOL WizardInit(BOOL fLoadRichEdit=FALSE);
BOOL CheckPVKInfo( DWORD dwFlags,
PCCRYPTUI_WIZ_CERT_REQUEST_INFO pCertRequestInfo,
CERT_WIZARD_INFO *pCertWizardInfo,
CRYPT_KEY_PROV_INFO **ppKeyProvInfo);
BOOL CheckPVKInfoNoDS(DWORD dwFlags,
DWORD dwPvkChoice,
PCCRYPTUI_WIZ_CERT_REQUEST_PVK_CERT pCertRequestPvkContext,
PCCRYPTUI_WIZ_CERT_REQUEST_PVK_NEW pCertRequestPvkNew,
PCCRYPTUI_WIZ_CERT_REQUEST_PVK_EXISTING pCertRequestPvkExisting,
DWORD dwCertChoice,
CERT_WIZARD_INFO *pCertWizardInfo,
CRYPT_KEY_PROV_INFO **ppKeyProvInfo);
void ResetProperties(PCCERT_CONTEXT pOldCertContext, PCCERT_CONTEXT pNewCertContext);
LRESULT Send_LB_GETTEXT(
HWND hwnd,
WPARAM wParam,
LPARAM lParam);
LRESULT Send_LB_ADDSTRING(
HWND hwnd,
WPARAM wParam,
LPARAM lParam);
void
SetControlFont(
HFONT hFont,
HWND hwnd,
INT nId
);
BOOL
SetupFonts(
HINSTANCE hInstance,
HWND hwnd,
HFONT *pBigBoldFont,
HFONT *pBoldFont
);
void
DestroyFonts(
HFONT hBigBoldFont,
HFONT hBoldFont
);
HRESULT
WizardSZToWSZ
(IN LPCSTR psz,
OUT LPWSTR *ppwsz);
LPVOID WizardAlloc (
ULONG cbSize);
LPVOID WizardRealloc (
LPVOID pv,
ULONG cbSize);
VOID WizardFree (
LPVOID pv);
VOID MyWizardFree (
LPVOID pv);
LPWSTR WizardAllocAndCopyWStr(LPWSTR pwsz);
LPSTR WizardAllocAndCopyStr(LPSTR psz);
BOOL ConfirmToInstall(HWND hwndParent,
LPWSTR pwszConfirmationTitle,
UINT idsConfirmTitle,
PCCERT_CONTEXT pCertContext,
PCRYPT_DATA_BLOB pPKCS7Blob);
BOOL GetValidKeySizes(IN LPCWSTR pwszProvider,
IN DWORD dwProvType,
IN DWORD dwUserKeySpec,
OUT DWORD * pdwMinLen,
OUT DWORD * pdwMaxLen,
OUT DWORD * pdwInc);
BOOL CAUtilAddSMIME(DWORD dwExtensions,
PCERT_EXTENSIONS *prgExtensions);
HRESULT CodeToHR(HRESULT hr);
HRESULT RetrieveBLOBFromFile(LPWSTR pwszFileName,DWORD *pcb,BYTE **ppb);
HRESULT OpenAndWriteToFile(
LPCWSTR pwszFileName,
PBYTE pb,
DWORD cb);
int ListView_InsertItemU_IDS(HWND hwndList,
LV_ITEMW *plvItem,
UINT idsString,
LPWSTR pwszText);
BOOL MyFormatEnhancedKeyUsageString(LPWSTR *ppString, PCCERT_CONTEXT pCertContext, BOOL fPropertiesOnly, BOOL fMultiline);
BOOL WizardFormatDateString(LPWSTR *ppString, FILETIME ft, BOOL fIncludeTime);
void FreePurposeInfo(ENROLL_PURPOSE_INFO **prgPurposeInfo,
DWORD dwOIDCount);
LRESULT
WINAPI
SendDlgItemMessageU_GETLBTEXT
( HWND hwndDlg,
int nIDDlgItem,
int iIndex,
LPWSTR *ppwsz
);
void WINAPI GetListViewText( HWND hwnd, int iItem,
int iSubItem, LPWSTR *ppwsz );
void FreeProviders( DWORD dwCSPCount,
DWORD *rgdwProviderType,
LPWSTR *rgwszProvider);
//the call back function to compare the certificate
int CALLBACK CompareCertificate(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
BOOL GetCertIssuer(PCCERT_CONTEXT pCertContext, LPWSTR *ppwsz);
BOOL GetCertSubject(PCCERT_CONTEXT pCertContext, LPWSTR *ppwsz);
BOOL GetCertPurpose(PCCERT_CONTEXT pCertContext, LPWSTR *ppwsz);
BOOL GetCertFriendlyName(PCCERT_CONTEXT pCertContext, LPWSTR *ppwsz);
BOOL GetCertLocation (PCCERT_CONTEXT pCertContext, LPWSTR *ppwsz);
BOOL CSPSupported(CERT_WIZARD_INFO *pCertWizardInfo);
BOOL WizGetOpenFileName(LPOPENFILENAMEW pOpenFileName);
BOOL WizGetSaveFileName(LPOPENFILENAMEW pOpenFileName);
BOOL AddChainToStore(
HCERTSTORE hCertStore,
PCCERT_CONTEXT pCertContext,
DWORD cStores,
HCERTSTORE *rghStores,
BOOL fDontAddRootCert,
CERT_TRUST_STATUS *pChainTrustStatus);
BOOL FileExist(LPWSTR pwszFileName);
int LoadFilterString(
HINSTANCE hInstance,
UINT uID,
LPWSTR lpBuffer,
int nBufferMax);
BOOL CASupportSpecifiedCertType(CRYPTUI_WIZ_CERT_CA *pCertCA);
BOOL GetCertTypeName(CERT_WIZARD_INFO *pCertWizardInfo);
BOOL GetCAName(CERT_WIZARD_INFO *pCertWizardInfo);
LPWSTR ExpandAndAllocString(LPCWSTR pwsz);
HANDLE WINAPI ExpandAndCreateFileU (
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
WINCRYPT32API
BOOL
WINAPI
ExpandAndCryptQueryObject(
DWORD dwObjectType,
const void *pvObject,
DWORD dwExpectedContentTypeFlags,
DWORD dwExpectedFormatTypeFlags,
DWORD dwFlags,
DWORD *pdwMsgAndCertEncodingType,
DWORD *pdwContentType,
DWORD *pdwFormatType,
HCERTSTORE *phCertStore,
HCRYPTMSG *phMsg,
const void **ppvContext
);
#ifdef __cplusplus
} // Balance extern "C" above
#endif
#ifdef __cplusplus
// Define an exportable interface to the EnrollmentCOMObjectFactory class.
extern "C"
{
typedef struct _EnrollmentCOMObjectFactoryContext {
BOOL fIsCOMInitialized;
ICertRequest2 *pICertRequest2;
IDsObjectPicker *pIDsObjectPicker;
} EnrollmentCOMObjectFactoryContext;
HRESULT EnrollmentCOMObjectFactory_getInstance(EnrollmentCOMObjectFactoryContext *pContext,
REFCLSID rclsid,
REFIID riid,
LPUNKNOWN *pUnknown,
LPVOID *ppInstance);
} // extern "C"
class IEnumCSP
{
public:
IEnumCSP(CERT_WIZARD_INFO * pCertWizardInfo);
HRESULT HasNext(BOOL *pfResult);
HRESULT Next(DWORD *pdwNextCSP);
private:
BOOL *m_pfCSPs;
BOOL m_fIsInitialized;
DWORD m_cCSPs;
DWORD m_dwCSPIndex;
HRESULT m_hr;
};
class IEnumCA
{
public:
IEnumCA(CERT_WIZARD_INFO * pCertWizardInfo) : m_pCertWizardInfo(pCertWizardInfo),
m_dwCAIndex(1) { }
HRESULT HasNext(BOOL *pfResult);
HRESULT Next(PCRYPTUI_WIZ_CERT_CA pCertCA);
private:
CERT_WIZARD_INFO *m_pCertWizardInfo;
DWORD m_dwCAIndex;
};
//
// The EnrollmentObjectFactory class provides instances of useful COM interfaces
// in a demand-driven manner. Only one instance of each type is created,
// and it is created only when needed.
//
// NOTE: For efficiency, all COM objects should be instantiated through this
// object factory.
//
class EnrollmentCOMObjectFactory
{
public:
EnrollmentCOMObjectFactory() {
m_context.fIsCOMInitialized = FALSE;
m_context.pICertRequest2 = NULL;
m_context.pIDsObjectPicker = NULL;
}
~EnrollmentCOMObjectFactory() {
if (m_context.pICertRequest2 != NULL) { m_context.pICertRequest2->Release(); }
if (m_context.pIDsObjectPicker != NULL) { m_context.pIDsObjectPicker->Release(); }
if (m_context.fIsCOMInitialized == TRUE) { CoUninitialize(); }
}
// Returns a pointer to an implementation of ICertRequest2.
// Must release this pointer through ICertRequest2's release() method.
HRESULT getICertRequest2(ICertRequest2 ** ppCertRequest) {
return EnrollmentCOMObjectFactory_getInstance(&(this->m_context),
CLSID_CCertRequest,
IID_ICertRequest2,
(LPUNKNOWN *)&(m_context.pICertRequest2),
(LPVOID *)ppCertRequest);
}
// Returns a pointer to an implementation of IDsObjectPicker.
// Must release this pointer through ICertRequest2's release() method.
HRESULT getIDsObjectPicker(IDsObjectPicker ** ppObjectPicker) {
return EnrollmentCOMObjectFactory_getInstance(&(this->m_context),
CLSID_DsObjectPicker,
IID_IDsObjectPicker,
(LPUNKNOWN *)&(m_context.pIDsObjectPicker),
(LPVOID *)ppObjectPicker);
}
private:
// Disallow copy constructor and assignment operator:
EnrollmentCOMObjectFactory(const EnrollmentCOMObjectFactory &);
const EnrollmentCOMObjectFactory & operator=(const EnrollmentCOMObjectFactory &);
// Helper functions:
HRESULT getInstance(REFCLSID rclsid, REFIID riid, LPUNKNOWN *pUnknown, LPVOID *ppInstance);
// Data:
EnrollmentCOMObjectFactoryContext m_context;
};
#endif // __cplusplus
#endif //WZRDPVK_H