//-------------------------------------------------------------- // 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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_REQUEST_PVK_NEW *pCertRenewPvk, 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