windows-nt/Source/XPSP1/NT/ds/security/services/ca/include/certlib.h

2295 lines
54 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: certlib.h
//
// Contents: Cert Server wrapper routines
//
//---------------------------------------------------------------------------
#ifndef __CERTLIB_H__
#define __CERTLIB_H__
#include <wintrust.h> // for spc_xxxx
#include <cryptui.h> // for CRYPTUI_CA_CONTEXT
#include <setupapi.h> // for HINF
#include <stdio.h> // for wprintf -- include before cs.h
#include "cs.h" // for CSASSERT
#include <xelib.h> // for CERTLIB_ALLOCATOR
#include "csregstr.h" // for ENUM_CATYPES
#include "csfile.h" // for __dwFILE__
#include "csauto.h" // self cleaning pointers
#ifndef CERTREQUEST_CLIENT_CERTREQ // moved to xelib.h
#define SECURITY_WIN32
#include <security.h> // for EXTENDED_NAME_FORMAT
#define DWORDROUND(cb) (((cb) + (sizeof(DWORD) - 1)) & ~(sizeof(DWORD) - 1))
#define POINTERROUND(cb) (((cb) + (sizeof(VOID *) - 1)) & ~(sizeof(VOID *) - 1))
#endif
#define myCASIGN_KEY_USAGE \
(CERT_KEY_CERT_SIGN_KEY_USAGE | \
CERT_CRL_SIGN_KEY_USAGE)
// "flags" property values for DS CA object
// CN=CAName,CN=Certification Authorities
#define CA_SERVER_TYPE_UNKNOWN 0x0
#define CA_SERVER_TYPE_SERVER 0x1
#define CA_SERVER_TYPE_ADVANCEDSERVER 0x2
#ifndef CSM_GLOBALDESTRUCTOR // if old xelib.h
# define CSM_GLOBALDESTRUCTOR 0x200
#endif
#define _16BITMASK ((1 << 16) - 1)
#define MAKECANAMEID(iCert, iKey) (((iKey) << 16) | (iCert))
#define CANAMEIDTOIKEY(NameId) ((NameId) >> 16)
#define CANAMEIDTOICERT(NameId) (_16BITMASK & (NameId))
typedef struct _CAINFO
{
DWORD cbSize;
ENUM_CATYPES CAType;
DWORD cCASignatureCerts;
DWORD cCAExchangeCerts;
DWORD cExitModules;
LONG lPropIdMax;
LONG lRoleSeparationEnabled;
DWORD cKRACertUsedCount;
DWORD cKRACertCount;
DWORD fAdvancedServer;
} CAINFO;
#define cwcHRESULTSTRING 40
#define cwcDWORDSPRINTF (1 + 10 + 1) // DWORD "%d" w/sign & '\0'
#define GETCERT_CAXCHGCERT TRUE
#define GETCERT_CASIGCERT FALSE
#define GETCERT_CHAIN 0x80000000 // internal use only
#define GETCERT_CRLS 0x00800000 // internal use only
#define GETCERT_FILEVERSION 0x66696c65 // "file"
#define GETCERT_PRODUCTVERSION 0x70726f64 // "prod"
#define GETCERT_POLICYVERSION 0x706f6c69 // "poli"
#define GETCERT_CANAME 0x6e616d65 // "name"
#define GETCERT_SANITIZEDCANAME 0x73616e69 // "sani"
#define GETCERT_SHAREDFOLDER 0x73686172 // "shar"
#define GETCERT_ERRORTEXT1 0x65727231 // "err1"
#define GETCERT_ERRORTEXT2 0x65727232 // "err2"
#define GETCERT_CATYPE 0x74797065 // "type"
#define GETCERT_CAINFO 0x696e666f // "info"
#define GETCERT_PARENTCONFIG 0x70617265 // "pare"
#define GETCERT_CURRENTCRL 0x6363726c // "ccrl"
#define GETCERT_CACERTBYINDEX 0x63740000 // "ct??" + 0 based index
#define GETCERT_CACERTSTATEBYINDEX 0x73740000 // "st??" + 0 based index
#define GETCERT_CRLBYINDEX 0x636c0000 // "cl??" + 0 based index
#define GETCERT_CRLSTATEBYINDEX 0x736c0000 // "sl??" + 0 based index
#define GETCERT_EXITVERSIONBYINDEX 0x65780000 // "ex??" + 0 based index
#define GETCERT_BYINDEXMASK 0x7f7f0000 // mask for fetch by index
#define GETCERT_INDEXVALUEMASK 0x0000ffff // mask for index extraction
#define GETCERT_VERSIONMASK 0x7f7f7f7f // mask for above
#define CSREG_UPGRADE 0x00000001
#define CSREG_APPEND 0x00000002
#define CSREG_REPLACE 0x00000004
#define CSREG_MERGE 0x00000008
#define wszCERTENROLLSHARENAME L"CertEnroll"
#define wszCERTENROLLSHAREPATH L"CertSrv\\CertEnroll"
#define wszCERTCONFIGSHARENAME L"CertConfig"
// Constants chosen to avoid DWORD overflow:
#define CVT_WEEKS (7 * CVT_DAYS)
#define CVT_DAYS (24 * CVT_HOURS)
#define CVT_HOURS (60 * CVT_MINUTES)
#define CVT_MINUTES (60 * CVT_SECONDS)
#define CVT_SECONDS (1)
#define CVT_BASE (1000 * 1000 * 10)
#define chLBRACKET '['
#define chRBRACKET ']'
#define szLBRACKET "["
#define szRBRACKET "]"
#define wcLBRACKET L'['
#define wcRBRACKET L']'
#define wszLBRACKET L"["
#define wszRBRACKET L"]"
#define chLBRACE '{'
#define chRBRACE '}'
#define szLBRACE "{"
#define szRBRACE "}"
#define wcLBRACE L'{'
#define wcRBRACE L'}'
#define wszLBRACE L"{"
#define wszRBRACE L"}"
#define chLPAREN '('
#define chRPAREN ')'
#define szLPAREN "("
#define szRPAREN ")"
#define wcLPAREN L'('
#define wcRPAREN L')'
#define wszLPAREN L"("
#define wszRPAREN L")"
typedef struct _CSURLTEMPLATE
{
DWORD Flags;
WCHAR *pwszURL;
} CSURLTEMPLATE;
WCHAR const *
myHResultToString(
IN OUT WCHAR *awchr,
IN HRESULT hr);
WCHAR const *
myHResultToStringRaw(
IN OUT WCHAR *awchr,
IN HRESULT hr);
WCHAR const *
myGetErrorMessageText(
IN HRESULT hr,
IN BOOL fHResultString);
WCHAR const *
myGetErrorMessageText1(
IN HRESULT hr,
IN BOOL fHResultString,
IN OPTIONAL WCHAR const *pwszInsertionText);
WCHAR const *
myGetErrorMessageTextEx(
IN HRESULT hr,
IN BOOL fHResultString,
IN OPTIONAL WCHAR const * const *papwszInsertionText);
HRESULT
myJetHResult(IN HRESULT hr);
BOOL
myIsDelayLoadHResult(IN HRESULT hr);
#define CBMAX_CRYPT_HASH_LEN 20
BOOL
myCryptSignMessage(
IN CRYPT_SIGN_MESSAGE_PARA const *pcsmp,
IN BYTE const *pbToBeSigned,
IN DWORD cbToBeSigned,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbSignedBlob, // CoTaskMem*
OUT DWORD *pcbSignedBlob);
HRESULT
myCryptMsgGetParam(
IN HCRYPTMSG hCryptMsg,
IN DWORD dwParamType,
IN DWORD dwIndex,
OUT VOID **ppvData,
OUT DWORD *pcbData);
BOOL
myEncodeCert(
IN DWORD dwEncodingType,
IN CERT_SIGNED_CONTENT_INFO const *pInfo,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded);
BOOL
myEncodeName(
IN DWORD dwEncodingType,
IN CERT_NAME_INFO const *pInfo,
IN DWORD dwFlags,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded);
BOOL
myEncodeKeyAttributes(
IN DWORD dwEncodingType,
IN CERT_KEY_ATTRIBUTES_INFO const *pInfo,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded);
BOOL
myEncodeKeyUsage(
IN DWORD dwEncodingType,
IN CRYPT_BIT_BLOB const *pInfo,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded);
BOOL
myEncodeKeyAuthority(
IN DWORD dwEncodingType,
IN CERT_AUTHORITY_KEY_ID_INFO const *pInfo,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded);
BOOL
myEncodeKeyAuthority2(
IN DWORD dwEncodingType,
IN CERT_AUTHORITY_KEY_ID2_INFO const *pInfo,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded);
BOOL
myEncodeToBeSigned(
DWORD dwEncodingType,
CERT_INFO const *pInfo,
IN CERTLIB_ALLOCATOR allocType,
BYTE **ppbEncoded,
DWORD *pcbEncoded);
BOOL
myDecodeName(
IN DWORD dwEncodingType,
IN LPCSTR lpszStructType,
IN BYTE const *pbEncoded,
IN DWORD cbEncoded,
IN CERTLIB_ALLOCATOR allocType,
OUT CERT_NAME_INFO **ppNameInfo,
OUT DWORD *pcbNameInfo);
HRESULT
myDecodeCSPProviderAttribute(
IN BYTE const *pbCSPEncoded,
IN DWORD cbCSPEncoded,
OUT CRYPT_CSP_PROVIDER **ppccp);
BOOL
myDecodeKeyGenRequest(
IN BYTE const *pbRequest,
IN DWORD cbRequest,
IN CERTLIB_ALLOCATOR allocType,
OUT CERT_KEYGEN_REQUEST_INFO **ppKeyGenRequest,
OUT DWORD *pcbKeyGenRequest);
BOOL
myDecodeExtensions(
IN DWORD dwEncodingType,
IN BYTE const *pbEncoded,
IN DWORD cbEncoded,
IN CERTLIB_ALLOCATOR allocType,
OUT CERT_EXTENSIONS **ppInfo,
OUT DWORD *pcbInfo);
BOOL
myDecodeKeyAuthority(
IN DWORD dwEncodingType,
IN BYTE const *pbEncoded,
IN DWORD cbEncoded,
IN CERTLIB_ALLOCATOR allocType,
OUT CERT_AUTHORITY_KEY_ID_INFO const **ppInfo,
OUT DWORD *pcbInfo);
BOOL
myDecodeKeyAuthority2(
IN DWORD dwEncodingType,
IN BYTE const *pbEncoded,
IN DWORD cbEncoded,
IN CERTLIB_ALLOCATOR allocType,
OUT CERT_AUTHORITY_KEY_ID2_INFO const **ppInfo,
OUT DWORD *pcbInfo);
BOOL
myCertGetCertificateContextProperty(
IN CERT_CONTEXT const *pCertContext,
IN DWORD dwPropId,
IN CERTLIB_ALLOCATOR allocType,
OUT VOID **ppvData,
OUT DWORD *pcbData);
HRESULT
myCryptEncrypt(
IN HCRYPTKEY hKey,
IN BYTE const *pbIn,
IN DWORD cbIn,
OUT BYTE **ppbEncrypted,
OUT DWORD *pcbEncrypted);
HRESULT
myCryptDecrypt(
IN HCRYPTKEY hKey,
IN BYTE const *pbIn,
IN DWORD cbIn,
OUT BYTE **ppbDecrypted,
OUT DWORD *pcbDecrypted);
HRESULT
myCryptEncryptMessage(
IN ALG_ID algId,
IN DWORD cCertRecipient,
IN CERT_CONTEXT const **rgCertRecipient,
IN BYTE const *pbIn,
IN DWORD cbIn,
IN OPTIONAL HCRYPTPROV hCryptProv,
OUT BYTE **ppbEncrypted,
OUT DWORD *pcbEncrypted);
HRESULT
myCryptDecryptMessage(
IN HCERTSTORE hStoreCA,
IN BYTE const *pbEncrypted,
IN DWORD cbEncrypted,
IN CERTLIB_ALLOCATOR allocType,
OUT BYTE **ppbDecrypted,
OUT DWORD *pcbDecrypted);
HRESULT
myGetInnerPKCS10(
IN HCRYPTMSG hMsg,
IN char const *pszInnerContentObjId,
OUT CERT_REQUEST_INFO **ppRequest);
BOOL
myDecodeNameValuePair(
IN DWORD dwEncodingType,
IN BYTE const *pbEncoded,
IN DWORD cbEncoded,
IN CERTLIB_ALLOCATOR allocType,
OUT CRYPT_ENROLLMENT_NAME_VALUE_PAIR **ppInfo,
OUT DWORD *pcbInfo);
HRESULT
myEncodeExtension(
IN DWORD Flags,
IN BYTE const *pbIn,
IN DWORD cbIn,
OUT BYTE **ppbOut,
OUT DWORD *pcbOut);
HRESULT
myDecodeExtension(
IN DWORD Flags,
IN BYTE const *pbIn,
IN DWORD cbIn,
OUT BYTE **ppbOut,
OUT DWORD *pcbOut);
HRESULT
myGenerateKeys(
IN WCHAR const *pwszContainer,
OPTIONAL IN WCHAR const *pwszProvName,
IN BOOL fMachineKeySet,
IN DWORD dwKeySpec,
IN DWORD dwProvType,
IN DWORD dwKeySize,
OUT HCRYPTPROV *phProv);
HRESULT
myCryptExportKey(
IN HCRYPTKEY hKey,
IN HCRYPTKEY hKeyExp,
IN DWORD dwBlobType,
IN DWORD dwFlags,
OUT BYTE **ppbKey,
OUT DWORD *pcbKey);
HRESULT
myCertGetNameString(
IN CERT_CONTEXT const *pcc,
IN DWORD dwType,
OUT WCHAR **ppwszSimpleName);
#define CA_VERIFY_FLAGS_ALLOW_UNTRUSTED_ROOT 0x00000001
#define CA_VERIFY_FLAGS_IGNORE_OFFLINE 0x00000002
#define CA_VERIFY_FLAGS_NO_REVOCATION 0x00000004
#define CA_VERIFY_FLAGS_NT_AUTH 0x00000008
#define CA_VERIFY_FLAGS_DUMP_CHAIN 0x40000000
#define CA_VERIFY_FLAGS_SAVE_CHAIN 0x80000000
HRESULT
myVerifyCertContext(
IN CERT_CONTEXT const *pCert,
IN DWORD dwFlags,
IN DWORD cUsageOids,
OPTIONAL IN CHAR const * const *apszUsageOids,
OPTIONAL IN HCERTCHAINENGINE hChainEngine,
OPTIONAL IN HCERTSTORE hAdditionalStore,
OPTIONAL OUT WCHAR **ppwszMissingIssuer);
HRESULT
myVerifyCertContextEx(
IN CERT_CONTEXT const *pCert,
IN DWORD dwFlags,
IN DWORD cUsageOids,
OPTIONAL IN CHAR const * const *apszUsageOids,
OPTIONAL IN HCERTCHAINENGINE hChainEngine,
OPTIONAL IN FILETIME const *pft,
OPTIONAL IN HCERTSTORE hAdditionalStore,
OPTIONAL OUT WCHAR **ppwszMissingIssuer,
OPTIONAL OUT WCHAR **ppwszzIssuancePolicies,
OPTIONAL OUT WCHAR **ppwszzApplicationPolicies);
HRESULT
myVerifyKRACertContext(
IN CERT_CONTEXT const *pCert,
IN DWORD dwFlags);
HRESULT
myCertStrToName(
IN DWORD dwCertEncodingType,
IN LPCWSTR pszX500,
IN DWORD dwStrType,
IN OPTIONAL void *pvReserved,
OUT BYTE **ppbEncoded,
OUT DWORD *pcbEncoded,
OUT OPTIONAL LPCWSTR *ppszError);
HRESULT
myCertNameToStr(
IN DWORD dwCertEncodingType,
IN CERT_NAME_BLOB const *pName,
IN DWORD dwStrType,
OUT WCHAR **ppwszName);
HRESULT
myCryptStringToBinaryA(
IN LPCSTR pszString,
IN DWORD cchString,
IN DWORD dwFlags,
OUT BYTE **ppbBinary,
OUT DWORD *pcbBinary,
OUT DWORD *pdwSkip, // OPTIONAL
OUT DWORD *pdwFlags); // OPTIONAL
HRESULT
myCryptStringToBinary(
IN LPCWSTR pwszString,
IN DWORD cwcString,
IN DWORD dwFlags,
OUT BYTE **ppbBinary,
OUT DWORD *pcbBinary,
OUT DWORD *pdwSkip, // OPTIONAL
OUT DWORD *pdwFlags); // OPTIONAL
HRESULT
myCryptBinaryToStringA(
IN CONST BYTE *pbBinary,
IN DWORD cbBinary,
IN DWORD dwFlags,
OUT LPSTR *ppszString);
HRESULT
myCryptBinaryToString(
IN CONST BYTE *pbBinary,
IN DWORD cbBinary,
IN DWORD dwFlags,
OUT LPWSTR *ppwszString);
HRESULT
myIsFirstSigner(
IN CERT_NAME_BLOB const *pNameBlob,
OUT BOOL *pfDummy);
HRESULT
myCopyKeys(
IN CRYPT_KEY_PROV_INFO const *pkpi,
IN WCHAR const *pwszOldContainer,
IN WCHAR const *pwszNewContainer,
IN BOOL fOldUserKey,
IN BOOL fNewUserKey,
IN BOOL fForceOverWrite);
HRESULT
mySaveChainAndKeys(
IN CERT_SIMPLE_CHAIN const *pSimpleChain,
IN WCHAR const *pwszStore,
IN DWORD dwStoreFlags,
IN CRYPT_KEY_PROV_INFO const *pkpi,
OPTIONAL OUT CERT_CONTEXT const **ppCert);
HCERTSTORE
myPFXImportCertStore(
IN CRYPT_DATA_BLOB *ppfx,
OPTIONAL IN WCHAR const *pwszPassword,
IN DWORD dwFlags);
HRESULT
myPFXExportCertStore(
IN HCERTSTORE hStore,
OUT CRYPT_DATA_BLOB *ppfx,
IN WCHAR const *pwszPassword,
IN DWORD dwFlags);
HRESULT
myAddChainToMemoryStore(
IN HCERTSTORE hMemoryStore,
IN CERT_CONTEXT const *pCertContext);
typedef struct _RESTORECHAIN
{
CERT_CHAIN_CONTEXT const *pChain;
DWORD NameId;
} RESTORECHAIN;
HRESULT
myGetChainArrayFromStore(
IN HCERTSTORE hStore,
IN BOOL fCAChain,
IN BOOL fUserStore,
OPTIONAL OUT WCHAR **ppwszCommonName,
IN OUT DWORD *pcRestoreChain,
OPTIONAL OUT RESTORECHAIN *paRestoreChain);
#ifndef CERTREQUEST_CLIENT_CERTREQ // moved to xelib.h
HRESULT
myGetUserNameEx(
IN EXTENDED_NAME_FORMAT NameFormat,
OUT WCHAR **ppwszUserName);
#endif
HRESULT
myGetComputerObjectName(
IN EXTENDED_NAME_FORMAT NameFormat,
OUT WCHAR **ppwszDnsName);
HRESULT
myGetComputerNames(
OUT WCHAR **ppwszDnsName,
OUT WCHAR **ppwszOldName);
#ifndef CERTREQUEST_CLIENT_CERTREQ // moved to xelib.h
HRESULT
myGetMachineDnsName(
OUT WCHAR **ppwszDnsName);
#endif
LANGID
mySetThreadUILanguage(
IN WORD wReserved);
BOOL
myConvertStringSecurityDescriptorToSecurityDescriptor(
IN LPCWSTR StringSecurityDescriptor,
IN DWORD StringSDRevision,
OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
OUT PULONG SecurityDescriptorSize OPTIONAL);
BOOL
myConvertSidToStringSid(
IN PSID Sid,
OUT LPWSTR *StringSid);
BOOL
myConvertStringSidToSid(
IN LPCWSTR StringSid,
OUT PSID *Sid);
#define DH_INDENTMASK 0x000000ff
#define DH_MULTIADDRESS 0x00000100 // add address to multi-line output only
#define DH_NOADDRESS 0x00000200
#define DH_NOASCIIHEX 0x00000400
#define DH_NOTABPREFIX 0x00000800 // double space after addr if displayed
VOID
DumpHex(
IN DWORD Flags,
IN BYTE const *pb,
IN ULONG cb);
DWORD
myGetDisplayLength(
IN WCHAR const *pwsz);
LONG
myConsolePrintString(
IN DWORD ccolMin,
IN WCHAR const *pwszString);
BOOL
myConsolePrintfDisable(
IN BOOL fDisable);
int __cdecl
myConsolePrintf(
IN WCHAR const *pwszFmt,
...);
//+==============================
// Date/Time conversion routines:
HRESULT
myDateToFileTime(
IN DATE const *pDate,
OUT FILETIME *pft);
HRESULT
myFileTimeToDate(
IN FILETIME const *pft,
OUT DATE *pDate);
HRESULT
myFileTimePeriodToWszTimePeriod(
IN FILETIME const *pftGMT,
IN BOOL fExact,
OUT WCHAR **ppwszTimePeriod);
HRESULT
myTranslateUnlocalizedPeriodString(
IN enum ENUM_PERIOD enumPeriod,
OUT WCHAR const **ppwszPeriodString);
HRESULT
myGMTFileTimeToWszLocalTime(
IN FILETIME const *pftGMT,
IN BOOL fSeconds,
OUT WCHAR **ppwszLocalTime);
HRESULT
myFileTimeToWszTime(
IN FILETIME const *pftGMT,
IN BOOL fSeconds,
OUT WCHAR **ppwszGMTTime);
HRESULT
myGMTDateToWszLocalTime(
IN DATE const *pDateGMT,
IN BOOL fSeconds,
OUT WCHAR **ppwszLocalTime);
HRESULT
myWszLocalTimeToGMTDate(
IN WCHAR const *pwszLocalTime,
OUT DATE *pDateGMT);
HRESULT
myWszLocalTimeToGMTFileTime(
IN WCHAR const *pwszLocalTime,
OUT FILETIME *pftGMT);
HRESULT
mySystemTimeToGMTSystemTime(
IN OUT SYSTEMTIME *pSys);
enum ENUM_FORCETELETEX
{
ENUM_TELETEX_OFF = 0,
ENUM_TELETEX_ON = 1,
ENUM_TELETEX_AUTO = 2,
ENUM_TELETEX_MASK = 0xf,
ENUM_TELETEX_UTF8 = 0x10
};
typedef struct _LLFILETIME
{
union {
LONGLONG ll;
FILETIME ft;
};
} LLFILETIME;
__inline VOID
myAddToFileTime(
IN OUT FILETIME *pft,
IN LONGLONG ll)
{
LLFILETIME llft;
llft.ft = *pft;
llft.ll += ll;
*pft = llft.ft;
}
__inline LONGLONG
mySubtractFileTimes(
IN FILETIME const *pft1,
IN FILETIME const *pft2)
{
LLFILETIME llft1;
LLFILETIME llft2;
llft1.ft = *pft1;
llft2.ft = *pft2;
return(llft1.ll - llft2.ll);
}
HRESULT
myMakeExprDate(
IN OUT DATE *pDate,
IN LONG lDelta,
IN enum ENUM_PERIOD enumPeriod);
HRESULT
myTranslatePeriodUnits(
IN WCHAR const *pwszPeriod,
IN LONG lCount,
OUT enum ENUM_PERIOD *penumPeriod,
OUT LONG *plCount);
HRESULT
myDupString(
IN WCHAR const *pwszIn,
OUT WCHAR **ppwszOut);
HRESULT
myDupStringA(
IN CHAR const *pszIn,
OUT CHAR **ppszOut);
HRESULT
myUnmarshalVariant(
IN DWORD PropType,
IN DWORD cbValue,
IN BYTE const *pbValue,
OUT VARIANT *pvarValue);
HRESULT
myUnmarshalFormattedVariant(
IN DWORD Flags,
IN DWORD PropId,
IN DWORD PropType,
IN DWORD cbValue,
IN BYTE const *pbValue,
OUT VARIANT *pvarValue);
HRESULT
myMarshalVariant(
IN VARIANT const *pvarPropertyValue,
IN DWORD PropType,
OUT DWORD *pcbprop,
OUT BYTE **ppbprop);
// Output values for myCheck7f's *pState parameter:
#define CHECK7F_NONE 0x0000
#define CHECK7F_OTHER 0x0001
#define CHECK7F_ISSUER 0x0002
#define CHECK7F_ISSUER_RDN 0x0003
#define CHECK7F_ISSUER_RDN_ATTRIBUTE 0x0004
#define CHECK7F_ISSUER_RDN_STRING 0x0005
#define CHECK7F_SUBJECT 0x0006
#define CHECK7F_SUBJECT_RDN 0x0007
#define CHECK7F_SUBJECT_RDN_ATTRIBUTE 0x0008
#define CHECK7F_SUBJECT_RDN_STRING 0x0009
#define CHECK7F_EXTENSIONS 0x000a
#define CHECK7F_EXTENSION_ARRAY 0x000b
#define CHECK7F_EXTENSION 0x000c
#define CHECK7F_EXTENSION_VALUE 0x000d
#define CHECK7F_EXTENSION_VALUE_RAW 0x000e
#define CHECK7F_COUNT 0x000f
HRESULT
myCheck7f(
IN const BYTE *pbCert,
IN DWORD cbCert,
IN BOOL fVerbose,
OUT DWORD *pState,
OPTIONAL OUT DWORD *pIndex1,
OPTIONAL OUT DWORD *pIndex2,
OPTIONAL IN OUT DWORD *pcwcField,
OPTIONAL OUT WCHAR *pwszField,
OPTIONAL IN OUT DWORD *pcwcObjectId,
OPTIONAL OUT WCHAR *pwszObjectId,
OPTIONAL OUT WCHAR const **ppwszObjectIdDescription); // Static: don't free!
HRESULT
myVerifyObjIdA(
IN char const *pszObjId);
HRESULT
myVerifyObjId(
IN WCHAR const *pwszObjId);
WCHAR const *
myGetOIDNameA(
IN char const *pszObjId);
WCHAR const *
myGetOIDName(
IN WCHAR const *pwszObjId);
BOOL
myIsCharSanitized(
IN WCHAR wc);
HRESULT
mySanitizeName(
IN WCHAR const *pwszName,
OUT WCHAR **ppwszNameOut);
HRESULT
myRevertSanitizeName(
IN WCHAR const *pwszName,
OUT WCHAR **ppwszNameOut);
HRESULT
mySanitizedNameToDSName(
IN WCHAR const *pwszName,
OUT WCHAR **ppwszNameOut);
HRESULT
myDecodeCMCRegInfo(
IN BYTE const *pbOctet,
IN DWORD cbOctet,
OUT WCHAR **ppwszOut);
HRESULT
mySplitConfigString(
IN WCHAR const *pwszConfig,
OUT WCHAR **ppwszServer,
OUT WCHAR **ppwszAuthority);
HRESULT
myCLSIDToWsz(
IN CLSID const *pclsid,
OUT WCHAR **ppwsz);
interface ICertAdminD2;
interface ICertRequestD2;
HRESULT
myOpenAdminDComConnection(
IN WCHAR const *pwszConfig,
OPTIONAL OUT WCHAR const **ppwszAuthority,
OPTIONAL IN OUT WCHAR **ppwszServerName,
IN OUT DWORD *pdwServerVersion,
IN OUT ICertAdminD2 **ppICertAdminD);
HRESULT
myOpenRequestDComConnection(
IN WCHAR const *pwszConfig,
OPTIONAL OUT WCHAR const **ppwszAuthority,
OPTIONAL IN OUT WCHAR **ppwszServerName,
OPTIONAL OUT BOOL *pfNewConnection,
IN OUT DWORD *pdwServerVersion,
IN OUT ICertRequestD2 **ppICertRequestD);
VOID
myCloseDComConnection(
OPTIONAL IN OUT IUnknown **ppUnknown,
OPTIONAL IN OUT WCHAR **ppwszServerName);
HRESULT
myPingCertSrv(
IN WCHAR const *pwszCAName,
OPTIONAL IN WCHAR const *pwszMachineName,
OPTIONAL OUT WCHAR **ppwszzCANames,
OPTIONAL OUT WCHAR **ppwszSharedFolder,
OPTIONAL OUT CAINFO **ppCAInfo,
OPTIONAL OUT DWORD *pdwServerVersion,
OPTIONAL OUT WCHAR **ppwszCADnsName);
DWORD
myGetCertNameProperty(
IN CERT_NAME_INFO const *pNameInfo,
IN char const *pszObjId,
OUT WCHAR const **ppwszName);
HRESULT
mySetCARegFileNameTemplate(
IN WCHAR const *pwszRegValueName,
IN WCHAR const *pwszServerName,
IN WCHAR const *pwszSanitizedName,
IN WCHAR const *pwszFileName);
HRESULT
myGetCARegFileNameTemplate(
IN WCHAR const *pwszRegValueName,
IN WCHAR const *pwszServerName,
IN WCHAR const *pwszSanitizedName,
IN DWORD iCert,
IN DWORD iCRL,
OUT WCHAR **ppwszFileName);
#define CSRH_CASIGCERT 0
#define CSRH_CAXCHGCERT 1
#define CSRH_CAKRACERT 2
HRESULT
mySetCARegHash(
IN WCHAR const *pwszSanitizedCAName,
IN DWORD dwRegHashChoice,
IN DWORD Index,
IN CERT_CONTEXT const *pCert);
HRESULT
myGetCARegHash(
IN WCHAR const *pwszSanitizedCAName,
IN DWORD dwRegHashChoice,
IN DWORD Index,
OUT BYTE **ppbHash,
OUT DWORD *pcbHash);
HRESULT
myGetCARegHashCount(
IN WCHAR const *pwszSanitizedCAName,
IN DWORD dwRegHashChoice,
OUT DWORD *pCount);
HRESULT myShrinkCARegHash(
IN WCHAR const *pwszSanitizedCAName,
IN DWORD dwRegHashChoice,
IN DWORD Index);
HRESULT
myGetNameId(
IN CERT_CONTEXT const *pCACert,
OUT DWORD *pdwNameId);
HRESULT
myFindCACertByHash(
IN HCERTSTORE hStore,
IN BYTE const *pbHash,
IN DWORD cbHash,
OUT OPTIONAL DWORD *pdwNameId,
OUT CERT_CONTEXT const **ppCACert);
HRESULT
myFindCACertByHashIndex(
IN HCERTSTORE hStore,
IN WCHAR const *pwszSanitizedCAName,
IN DWORD dwRegHashChoice,
IN DWORD Index,
OPTIONAL OUT DWORD *pdwNameId,
OUT CERT_CONTEXT const **ppCACert);
BOOL
myAreBlobsSame(
IN BYTE const *pbData1,
IN DWORD cbData1,
IN BYTE const *pbData2,
IN DWORD cbData2);
BOOL
myAreSerialNumberBlobsSame(
IN CRYPT_INTEGER_BLOB const *pBlob1,
IN CRYPT_INTEGER_BLOB const *pBlob2);
VOID
myGenerateGuidSerialNumber(
OUT GUID *pguidSerialNumber);
#define CSRF_INSTALLCACERT 0x00000000
#define CSRF_RENEWCACERT 0x00000001
#define CSRF_NEWKEYS 0x00000002
#define CSRF_UNATTENDED 0x40000000
#define CSRF_OVERWRITE 0x80000000
HRESULT
CertServerRequestCACertificateAndComplete(
IN HINSTANCE hInstance,
IN HWND hwnd,
IN DWORD Flags,
IN WCHAR const *pwszCAName,
OPTIONAL IN WCHAR const *pwszParentMachine,
OPTIONAL IN WCHAR const *pwszParentCA,
OPTIONAL IN WCHAR const *pwszCAChainFile,
OPTIONAL OUT WCHAR **ppwszRequestFile);
HRESULT
myBuildPathAndExt(
IN WCHAR const *pwszDir,
IN WCHAR const *pwszFile,
OPTIONAL IN WCHAR const *pwszExt,
OUT WCHAR **ppwszPath);
HRESULT
myCreateBackupDir(
IN WCHAR const *pwszDir,
IN BOOL fForceOverWrite);
typedef struct _DBBACKUPPROGRESS
{
DWORD dwDBPercentComplete;
DWORD dwLogPercentComplete;
DWORD dwTruncateLogPercentComplete;
} DBBACKUPPROGRESS;
#define CDBBACKUP_INCREMENTAL 0x00000001 // else full backup
#define CDBBACKUP_KEEPOLDLOGS 0x00000002 // else truncate logs
#define CDBBACKUP_OVERWRITE 0x00000100 // for myBackupDB only
#define CDBBACKUP_VERIFYONLY 0x00000200 // for myBackupDB and myRestoreDB
#define CDBBACKUP_BACKUPVALID (CDBBACKUP_INCREMENTAL | \
CDBBACKUP_KEEPOLDLOGS | \
CDBBACKUP_OVERWRITE | \
CDBBACKUP_VERIFYONLY)
#define CDBBACKUP_RESTOREVALID (CDBBACKUP_INCREMENTAL | \
CDBBACKUP_KEEPOLDLOGS | \
CDBBACKUP_VERIFYONLY)
HRESULT
myBackupDB(
OPTIONAL IN WCHAR const *pwszConfig,
IN DWORD Flags,
IN WCHAR const *pwszBackupDir,
OPTIONAL OUT DBBACKUPPROGRESS *pdbp);
HRESULT
myRestoreDB(
IN WCHAR const *pwszConfig,
IN DWORD Flags,
OPTIONAL IN WCHAR const *pwszBackupDir,
OPTIONAL IN WCHAR const *pwszCheckPointFilePath,
OPTIONAL IN WCHAR const *pwszLogPath,
OPTIONAL IN WCHAR const *pwszBackupLogPath,
OPTIONAL OUT DBBACKUPPROGRESS *pdbp);
HRESULT
myDeleteDBFilesInDir(
IN WCHAR const *pwszDir);
HRESULT
myDoDBFilesExist(
IN WCHAR const *pwszSanitizedName,
OUT BOOL *pfFilesExist,
OPTIONAL OUT WCHAR **ppwszFileInUse);
HRESULT
myDoDBFilesExistInDir(
IN WCHAR const *pwszDir,
OUT BOOL *pfFilesExist,
OPTIONAL OUT WCHAR **ppwszFileInUse);
HRESULT
myIsConfigLocal(
IN WCHAR const *pwszConfig,
OPTIONAL OUT WCHAR **ppwszMachine,
OUT BOOL *pfLocal);
HRESULT
myIsConfigLocal2(
IN WCHAR const *pwszConfig,
IN WCHAR const *pwszDnsName,
IN WCHAR const *pwszOldName,
OUT BOOL *pfLocal);
HRESULT
myGetConfig(
IN DWORD dwUIFlag,
OUT WCHAR **ppwszConfig);
HRESULT
myConvertLocalPathToUNC(
OPTIONAL IN WCHAR const *pwszServer,
IN WCHAR const *pwszFile,
OUT WCHAR **ppwszFileUNC);
HRESULT
myConvertUNCPathToLocal(
IN WCHAR const *pwszUNCPath,
OUT WCHAR **ppwszLocalPath);
ULONG
myLocalPathwcslen(
IN WCHAR const *pwsz);
VOID
myLocalPathwcscpy(
OUT WCHAR *pwszOut,
IN WCHAR const *pwszIn);
HRESULT
myCertServerExportPFX(
IN WCHAR const *pwszCAName,
IN WCHAR const *pwszBackupDir,
IN WCHAR const *pwszPassword,
IN BOOL fForceOverWrite,
IN BOOL fMustExportPrivateKeys,
OPTIONAL OUT WCHAR **ppwszPFXFile);
HRESULT
myCertServerImportPFX(
IN WCHAR const *pwszBackupDirOrPFXFile,
IN WCHAR const *pwszPassword,
IN BOOL fForceOverWrite,
OPTIONAL OUT WCHAR **ppwszCommonName,
OPTIONAL OUT WCHAR **ppwszPFXFile,
OPTIONAL OUT CERT_CONTEXT const **ppSavedLeafCert);
HRESULT
myDeleteGuidKeys(
IN HCERTSTORE hStorePFX,
IN BOOL fMachineKeySet);
#define IsHrSkipPrivateKey(hresult) \
(NTE_BAD_KEY_STATE == (hresult) || \
CRYPT_E_NO_KEY_PROPERTY == (hresult) || \
E_HANDLE == (hresult))
HRESULT
myCryptExportPrivateKey(
IN HCRYPTKEY hKey,
OUT BYTE **ppbKey,
OUT DWORD *pcbKey);
HRESULT
myCertGetKeyProviderInfo(
IN CERT_CONTEXT const *pCert,
OUT CRYPT_KEY_PROV_INFO **ppkpi);
HRESULT
myRepairCertKeyProviderInfo(
IN CERT_CONTEXT const *pCert,
IN BOOL fForceMachineKey,
OPTIONAL OUT CRYPT_KEY_PROV_INFO **ppkpi);
HRESULT
myVerifyPublicKey(
IN OPTIONAL CERT_CONTEXT const *pCert,
IN BOOL fV1Cert,
IN OPTIONAL CRYPT_KEY_PROV_INFO const *pKeyProvInfo,
IN OPTIONAL CERT_PUBLIC_KEY_INFO const *pSubjectPublicKeyInfo,
OPTIONAL OUT BOOL *pfMatchingKey);
HRESULT
myValidateKeyBlob(
IN BYTE const *pbKey,
IN DWORD cbKey,
IN CERT_PUBLIC_KEY_INFO const *pPublicKeyInfo,
IN BOOL fV1Cert,
OPTIONAL OUT CRYPT_KEY_PROV_INFO *pkpi);
BOOL
myCertComparePublicKeyInfo(
IN DWORD dwCertEncodingType,
IN BOOL fV1Cert,
IN CERT_PUBLIC_KEY_INFO const *pPublicKey1,
IN CERT_PUBLIC_KEY_INFO const *pPublicKey2);
BOOL
myIsDirectory(
IN WCHAR const *pwszDirectoryPath);
BOOL
myIsDirEmpty(
IN WCHAR const *pwszDir);
HRESULT
myIsDirWriteable(
IN WCHAR const *pwszPath,
IN BOOL fFilePath);
BOOL
myIsFileInUse(
IN WCHAR const *pwszFile);
__inline BOOL
myDoesFileExist(
IN WCHAR const *pwszFile)
{
// Allow Ansi subdirectory builds, use GetFileAttributesW
return(-1 != GetFileAttributesW(pwszFile));
}
WCHAR const *
myLoadResourceString(
IN DWORD ResourceId);
VOID
myFreeResourceStrings(
IN char const *pszModule);
HRESULT
myDoesDSExist(
IN BOOL fRetry);
HRESULT
myGetConfigFromPicker(
OPTIONAL IN HWND hwndParent,
OPTIONAL IN WCHAR const *pwszPrompt,
OPTIONAL IN WCHAR const *pwszTitle,
OPTIONAL IN WCHAR const *pwszSharedFolder,
IN BOOL fUseDS,
IN BOOL fCountOnly,
OUT DWORD *pdwCACount,
OUT CRYPTUI_CA_CONTEXT const **ppCAContext);
HRESULT
myGetConfigStringFromPicker(
OPTIONAL IN HWND hwndParent,
OPTIONAL IN WCHAR const *pwszPrompt,
OPTIONAL IN WCHAR const *pwszTitle,
OPTIONAL IN WCHAR const *pwszSharedFolder,
IN BOOL fUseDS,
OUT WCHAR **ppwszConfig);
HRESULT
myDeleteCertRegValueEx(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName,
IN BOOL fAbsolutePath);
HRESULT
myDeleteCertRegValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName);
HRESULT
myDeleteCertRegKeyEx(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN BOOL fConfigLevel);
HRESULT
myDeleteCertRegKey(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3);
HRESULT
myCreateCertRegKeyEx(
IN BOOL fUpgrade,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3);
HRESULT
myCreateCertRegKey(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3);
HRESULT
mySetCertRegValue(
OPTIONAL IN WCHAR const *pwszMachine,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
IN DWORD const dwValueType,
IN BYTE const *pbData,
IN DWORD const cbData,
IN BOOL fAbsolutePath);
HRESULT
mySetCertRegValueEx(
OPTIONAL IN WCHAR const *pwszMachine,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN BOOL fConfigLevel,
OPTIONAL IN WCHAR const *pwszValueName,
IN DWORD const dwValueType,
IN BYTE const *pbData,
IN DWORD const cbData,
IN BOOL fAbsolutePath);
HRESULT
myGetCertRegValue(
OPTIONAL IN WCHAR const *pwszMachine,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
OUT BYTE **ppbData, // free using LocalFree
OPTIONAL OUT DWORD *pcbData,
OPTIONAL OUT DWORD *pValueType);
HRESULT
myGetCertRegValueEx(
OPTIONAL IN WCHAR const *pwszMachine,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN BOOL fConfigLevel,
IN WCHAR const *pwszValueName,
OUT BYTE **ppbData,
OPTIONAL OUT DWORD *pcbData,
OPTIONAL OUT DWORD *pValueType);
HRESULT
mySetCertRegMultiStrValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName,
IN WCHAR const *pwszzValue);
HRESULT
myGetCertRegMultiStrValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName,
OUT WCHAR **ppwszzValue);
HRESULT
mySetCertRegStrValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
IN WCHAR const *pwszValue);
HRESULT
mySetCertRegStrValueEx(
IN BOOL fUpgrade,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName,
IN WCHAR const *pwszValue);
HRESULT
mySetCertRegMultiStrValueEx(
IN DWORD dwFlags, //CSREG_UPGRADE | CSREG_APPEND
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName,
IN WCHAR const *pwszzValue);
HRESULT
mySetAbsRegMultiStrValue(
IN WCHAR const *pwszName,
IN WCHAR const *pwszValueName,
IN WCHAR const *pwszzValue);
HRESULT
mySetAbsRegStrValue(
IN WCHAR const *pwszName,
IN WCHAR const *pwszValueName,
IN WCHAR const *pwszValue);
HRESULT
mySetCertRegDWValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
IN DWORD const dwValue);
HRESULT
mySetCertRegDWValueEx(
IN BOOL fUpgrade,
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
OPTIONAL IN WCHAR const *pwszValueName,
IN DWORD const dwValue);
HRESULT
myGetCertRegBinaryValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
OUT BYTE **ppbValue);
HRESULT
myGetCertRegStrValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
OUT WCHAR **ppwszValue); // free using LocalFree
HRESULT
myGetCertRegDWValue(
OPTIONAL IN WCHAR const *pwszName1,
OPTIONAL IN WCHAR const *pwszName2,
OPTIONAL IN WCHAR const *pwszName3,
IN WCHAR const *pwszValueName,
OUT DWORD *pdwValue);
HRESULT
myCopyCertRegStrValue(
OPTIONAL IN WCHAR const *pwszSrcName1,
OPTIONAL IN WCHAR const *pwszSrcName2,
OPTIONAL IN WCHAR const *pwszSrcName3,
IN WCHAR const *pwszSrcValueName,
OPTIONAL IN WCHAR const *pwszDesName1,
OPTIONAL IN WCHAR const *pwszDesName2,
OPTIONAL IN WCHAR const *pwszDesName3,
OPTIONAL IN WCHAR const *pwszDesValueName,
IN BOOL fMultiStr);
HRESULT
myMoveCertRegStrValue(
OPTIONAL IN WCHAR const *pwszSrcName1,
OPTIONAL IN WCHAR const *pwszSrcName2,
OPTIONAL IN WCHAR const *pwszSrcName3,
IN WCHAR const *pwszSrcValueName,
OPTIONAL IN WCHAR const *pwszDesName1,
OPTIONAL IN WCHAR const *pwszDesName2,
OPTIONAL IN WCHAR const *pwszDesName3,
OPTIONAL IN WCHAR const *pwszDesValueName,
IN BOOL fMultiStr);
HRESULT
myMoveOrCopyCertRegStrValue(
OPTIONAL IN WCHAR const *pwszSrcName1,
OPTIONAL IN WCHAR const *pwszSrcName2,
OPTIONAL IN WCHAR const *pwszSrcName3,
IN WCHAR const *pwszSrcValueName,
OPTIONAL IN WCHAR const *pwszDesName1,
OPTIONAL IN WCHAR const *pwszDesName2,
OPTIONAL IN WCHAR const *pwszDesName3,
OPTIONAL IN WCHAR const *pwszDesValueName,
IN BOOL fMultiStr,
IN BOOL fMove);
HRESULT
SetSetupStatus(
OPTIONAL IN WCHAR const *pwszSanitizedCAName,
IN const DWORD dwFlag,
IN const BOOL fComplete);
HRESULT
GetSetupStatus(
OPTIONAL IN WCHAR const *pwszSanitizedCAName,
OUT DWORD *pdwStatus);
HRESULT
myGetCASerialNumber(
IN WCHAR const *pwszSanitizedCAName,
OUT BYTE **ppbSerialNumber,
OUT DWORD *cbSerialNumber);
HRESULT
myGetColumnDisplayName(
IN WCHAR const *pwszColumnName,
OUT WCHAR const **ppwszDisplayName);
HRESULT
myGetColumnName(
IN DWORD Index,
IN BOOL fDisplayName,
OUT WCHAR const **ppwszName);
VOID
myFreeColumnDisplayNames(VOID);
typedef struct _CAPROP
{
LONG lPropId;
LONG lPropFlags;
WCHAR const *pwszDisplayName;
} CAPROP;
HRESULT
myCAPropGetDisplayName(
IN LONG lPropId,
OUT WCHAR const **ppwszDisplayName);
HRESULT
myCAPropInfoUnmarshal(
IN OUT CAPROP *pCAPropInfo,
IN LONG cCAPropInfo,
IN DWORD cbCAPropInfo);
HRESULT
myCAPropInfoLookup(
IN CAPROP const *pCAPropInfo,
IN LONG cCAPropInfo,
IN LONG lPropId,
OUT CAPROP const **ppcap);
// active modules
HRESULT
myGetActiveModule(
OPTIONAL IN WCHAR const *pwszMachine,
IN WCHAR const *pwszCAName,
IN BOOL fPolicyModule,
IN DWORD Index,
OUT LPOLESTR *ppwszProgIdModule, // CoTaskMem*
OUT CLSID *pclsidModule);
// active manage module
HRESULT
myGetActiveManageModule(
OPTIONAL IN WCHAR const *pwszMachine,
IN WCHAR const *pwszCAName,
IN BOOL fPolicyModule,
IN DWORD Index,
OUT LPOLESTR *ppwszProgIdManageModule, // CoTaskMem*
OUT CLSID *pclsidManageModule);
HRESULT
myFormConfigString(
IN WCHAR const *pwszServer,
IN WCHAR const *pwszCAName,
OUT WCHAR **ppwszConfig);
HRESULT
myLoadRCString(
IN HINSTANCE hInstance,
IN int iRCId,
OUT WCHAR **ppwsz);
#define RORKF_FULLPATH 0x00000001
#define RORKF_CREATESUBKEYS 0x00000002
#define RORKF_USERKEY 0x00000004
HRESULT
myRegOpenRelativeKey(
OPTIONAL IN WCHAR const *pwszConfig,
IN WCHAR const *pwszRegName,
IN DWORD Flags, // RORKF_*
OUT WCHAR **ppwszPath,
OUT OPTIONAL WCHAR **ppwszName,
OUT OPTIONAL HKEY *phkey);
HRESULT
myFixupRCFilterString(
IN WCHAR *pwszFilter);
// NOTE: disappears in release builds
#define ASSERTVALIDCATYPE(__CATYPE__) \
CSASSERT( (\
ENUM_ENTERPRISE_SUBCA == (__CATYPE__) || \
ENUM_ENTERPRISE_ROOTCA == (__CATYPE__) || \
ENUM_UNKNOWN_CA == (__CATYPE__) || \
ENUM_STANDALONE_SUBCA == (__CATYPE__) || \
ENUM_STANDALONE_ROOTCA == (__CATYPE__) ))
__inline BOOL
IsEnterpriseCA(
IN ENUM_CATYPES CAType)
{
// assert we're a valid type
ASSERTVALIDCATYPE(CAType);
return(ENUM_ENTERPRISE_SUBCA == CAType || ENUM_ENTERPRISE_ROOTCA == CAType);
}
__inline BOOL
IsStandaloneCA(
IN ENUM_CATYPES CAType)
{
// assert we're a valid type
ASSERTVALIDCATYPE(CAType);
return(ENUM_STANDALONE_SUBCA == CAType || ENUM_STANDALONE_ROOTCA == CAType);
}
__inline BOOL
IsRootCA(
IN ENUM_CATYPES CAType)
{
// assert we're a valid type
ASSERTVALIDCATYPE(CAType);
return(ENUM_STANDALONE_ROOTCA == CAType || ENUM_ENTERPRISE_ROOTCA == CAType);
}
__inline BOOL
IsSubordinateCA(
IN ENUM_CATYPES CAType)
{
// assert we're a valid type
ASSERTVALIDCATYPE(CAType);
return(ENUM_ENTERPRISE_SUBCA == CAType || ENUM_STANDALONE_SUBCA == CAType);
}
HRESULT
myEnablePrivilege(
IN LPCTSTR szPrivilege,
IN BOOL fEnable);
HRESULT
myDeleteFilePattern(
IN WCHAR const *pwszDir,
OPTIONAL IN WCHAR const *pwszPattern, // defaults to L"*.*"
IN BOOL fRecurse);
HRESULT
myRemoveFilesAndDirectory(
IN WCHAR const *pwszPath,
IN BOOL fRecurse);
HRESULT
myCreateNestedDirectories(
WCHAR const *pwszDirectory);
#define VFF_CREATEVROOTS 0x00000001
#define VFF_CREATEFILESHARES 0x00000002
#define VFF_DELETEVROOTS 0x00000004
#define VFF_DELETEFILESHARES 0x00000008
#define VFF_SETREGFLAGFIRST 0x00000010
#define VFF_CHECKREGFLAGFIRST 0x00000020
#define VFF_CLEARREGFLAGFIRST 0x00000040
#define VFF_CLEARREGFLAGIFOK 0x00000100
#define VFF_SETRUNONCEIFERROR 0x00000200
#define VFCSEC_TIMEOUT 5 // Recommended timeout in seconds
#define VFD_NOACTION 0
#define VFD_CREATED 1
#define VFD_DELETED 2
#define VFD_EXISTS 3
#define VFD_NOTFOUND 4
#define VFD_CREATEERROR 5
#define VFD_DELETEERROR 6
#define VFD_NOTSUPPORTED 7
HRESULT
myModifyVirtualRootsAndFileShares(
IN DWORD Flags, // VFF_*: Create/Delete VRoots and/or Shares
IN ENUM_CATYPES CAType, // CA Type
IN BOOL fAsynchronous, // block during call?
IN DWORD csecTimeOut, // 0 implies synchronous call
OPTIONAL OUT DWORD *pVRootDisposition, // VFD_*
OPTIONAL OUT DWORD *pShareDisposition); // VFD_*
HRESULT
myAddShare(
IN LPCWSTR szShareName,
IN LPCWSTR szShareDescr,
IN LPCWSTR szSharePath,
IN BOOL fOverwrite,
OPTIONAL OUT BOOL *pfCreated);
typedef struct {
HINSTANCE hInstance; // instance handle
HWND hDlg; // dialog handle
HWND hwndComputerEdit; // control handle of computer edit
HWND hwndCAList; // control handle of ca list control
WNDPROC pfnUICASelectionComputerWndProcs; // computer edit win procs
// info on selected CA
ENUM_CATYPES CAType;
bool fWebProxySetup;
} CERTSRVUICASELECTION;
LRESULT CALLBACK
myUICASelectionComputerEditFilterHook(
HWND hwndComputer,
UINT iMsg,
WPARAM wParam,
LPARAM lParam);
#define UNC_PATH 1
#define LOCAL_PATH 2
BOOL
myIsFullPath(
IN WCHAR const *pwszPath,
OUT DWORD *pdwFlag);
HRESULT
myUICAHandleCABrowseButton(
CERTSRVUICASELECTION *pData,
IN BOOL fUseDS,
OPTIONAL IN int idsPickerTitle,
OPTIONAL IN int idsPickerSubTitle,
OPTIONAL OUT WCHAR **ppwszSharedFolder);
HRESULT
myUICAHandleCAListDropdown(
IN int iNotification,
IN OUT CERTSRVUICASELECTION *pData,
IN OUT BOOL *pfComputerChange);
HRESULT
myUICASelectionValidation(
CERTSRVUICASELECTION *pData,
BOOL *pfValidate);
HRESULT
myInitUICASelectionControls(
IN OUT CERTSRVUICASELECTION *pUICASelection,
IN HINSTANCE hInstance,
IN HWND hDlg,
IN HWND hwndBrowseButton,
IN HWND hwndComputerEdit,
IN HWND hwndCAList,
IN BOOL fDSCA,
OUT BOOL *pfCAsExist);
char PrintableChar(char ch);
HRESULT
myGetMapiInfo(
OPTIONAL IN WCHAR const *pwszServerName,
OUT WCHAR **ppwszProfileName,
OUT WCHAR **ppwszLogonName,
OUT WCHAR **ppwszPassword);
HRESULT
mySaveMapiInfo(
OPTIONAL IN WCHAR const *pwszServerName,
OUT WCHAR const *pwszProfileName,
OUT WCHAR const *pwszLogonName,
OUT WCHAR const *pwszPassword);
#define cwcFILENAMESUFFIXMAX 20
#define cwcSUFFIXMAX (1 + 5 + 1) // five decimal digits plus parentheses
#define wszFCSAPARM_SERVERDNSNAME L"%1"
#define wszFCSAPARM_SERVERSHORTNAME L"%2"
#define wszFCSAPARM_SANITIZEDCANAME L"%3"
#define wszFCSAPARM_CERTFILENAMESUFFIX L"%4"
#define wszFCSAPARM_DOMAINDN L"%5"
#define wszFCSAPARM_CONFIGDN L"%6"
#define wszFCSAPARM_SANITIZEDCANAMEHASH L"%7"
#define wszFCSAPARM_CRLFILENAMESUFFIX L"%8"
#define wszFCSAPARM_CRLDELTAFILENAMESUFFIX L"%9"
#define wszFCSAPARM_DSCRLATTRIBUTE L"%10"
#define wszFCSAPARM_DSCACERTATTRIBUTE L"%11"
#define wszFCSAPARM_DSUSERCERTATTRIBUTE L"%12"
#define wszFCSAPARM_DSKRACERTATTRIBUTE L"%13"
#define wszFCSAPARM_DSCROSSCERTPAIRATTRIBUTE L"%14"
HRESULT
myFormatCertsrvStringArray(
IN BOOL fURL,
IN LPCWSTR pwszServerName_p1_2,
IN LPCWSTR pwszSanitizedName_p3_7,
IN DWORD iCert_p4,
IN LPCWSTR pwszDomainDN_p5,
IN LPCWSTR pwszConfigDN_p6,
IN DWORD iCRL_p8,
IN BOOL fDeltaCRL_p9,
IN BOOL fDSAttrib_p10_11,
IN DWORD cStrings,
IN LPCWSTR *apwszStringsIn,
OUT LPWSTR *apwszStringsOut);
HRESULT
myUncanonicalizeURLParm(
IN WCHAR const *pwszParmIn,
OUT WCHAR **ppwszParmOut);
HRESULT
myAllocIndexedName(
IN WCHAR const *pwszName,
IN DWORD Index,
OUT WCHAR **ppwszIndexedName);
HRESULT
myUIGetWindowText(
IN HWND hwndCtrl,
OUT WCHAR **ppwszText);
HRESULT
myGetSaveFileName(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags, //see OPENFILENAME Flags
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile);
HRESULT
myGetOpenFileName(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags, //see OPENFILENAME Flags
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile);
HRESULT
myGetSaveFileNameEx(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN WCHAR const *pwszTitleInsert,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags, //see OPENFILENAME Flags
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile);
HRESULT
myGetOpenFileNameEx(
IN HWND hwndOwner,
IN HINSTANCE hInstance,
OPTIONAL IN int iRCTitle,
OPTIONAL IN WCHAR const *pwszTitleInsert,
OPTIONAL IN int iRCFilter,
OPTIONAL IN int iRCDefExt,
OPTIONAL IN DWORD Flags, //see OPENFILENAME Flags
OPTIONAL IN WCHAR const *pwszDefaultFile,
OUT WCHAR **ppwszFile);
int
myWtoI(
IN WCHAR const *pwszDigitString,
OUT BOOL *pfValid);
HRESULT
myFormCertRegPath(
IN WCHAR const *pwszName1,
IN WCHAR const *pwszName2,
IN WCHAR const *pwszName3,
IN BOOL fConfigLevel, // from CertSrv if FALSE
OUT WCHAR **ppwszPath);
HRESULT
myGetEnvString(
OUT WCHAR **ppwszOut,
IN WCHAR const *pwszVariable);
typedef HRESULT (FNMYINFGETEXTENSION)(
IN HINF hInf,
OUT CERT_EXTENSION *pext);
FNMYINFGETEXTENSION myInfGetPolicyConstraintsExtension;
FNMYINFGETEXTENSION myInfGetPolicyMappingExtension;
FNMYINFGETEXTENSION myInfGetPolicyStatementExtension;
FNMYINFGETEXTENSION myInfGetApplicationPolicyConstraintsExtension;
FNMYINFGETEXTENSION myInfGetApplicationPolicyMappingExtension;
FNMYINFGETEXTENSION myInfGetApplicationPolicyStatementExtension;
FNMYINFGETEXTENSION myInfGetNameConstraintsExtension;
FNMYINFGETEXTENSION myInfGetEnhancedKeyUsageExtension;
FNMYINFGETEXTENSION myInfGetBasicConstraints2CAExtension;
FNMYINFGETEXTENSION myInfGetBasicConstraints2CAExtensionOrDefault;
FNMYINFGETEXTENSION myInfGetCrossCertDistributionPointsExtension;
WCHAR *
myInfGetError();
VOID
myInfClearError();
HRESULT
myInfOpenFile(
OPTIONAL IN WCHAR const *pwszfnPolicy,
OUT HINF *phInf,
OUT DWORD *pErrorLine);
VOID
myInfCloseFile(
IN HINF hInf);
HRESULT
myInfGetCRLDistributionPoints(
IN HINF hInf,
OUT BOOL *pfCritical,
OUT WCHAR **ppwszz);
HRESULT
myInfGetAuthorityInformationAccess(
IN HINF hInf,
OUT BOOL *pfCritical,
OUT WCHAR **ppwszz);
HRESULT
myInfGetEnhancedKeyUsage(
IN HINF hInf,
OUT BOOL *pfCritical,
OUT WCHAR **ppwszz);
HRESULT
myInfGetValidityPeriod(
IN HINF hInf,
OPTIONAL IN WCHAR const *pwszValidityPeriodCount,
OPTIONAL IN WCHAR const *pwszValidityPeriodString,
OUT DWORD *pdwValidityPeriodCount,
OUT ENUM_PERIOD *penumValidityPeriod,
OPTIONAL OUT BOOL *pfSwap);
HRESULT
myinfGetCRLPublicationParams(
IN HINF hInf,
IN LPCWSTR szInfSection_CRLPeriod,
IN LPCWSTR szInfSection_CRLCount,
OUT LPWSTR* ppwszCRLPeriod,
OUT DWORD* pdwCRLCount);
HRESULT
myInfGetKeyLength(
IN HINF hInf,
OUT DWORD *pdwKeyLength);
HRESULT
myInfParseBooleanValue(
IN WCHAR const *pwszValue,
OUT BOOL *pfValue);
HRESULT
myInfGetNumericKeyValue(
IN HINF hInf,
IN BOOL fLog,
IN WCHAR const *pwszSection,
IN WCHAR const *pwszKey,
OUT DWORD *pdwValue);
HRESULT
myInfGetBooleanValue(
IN HINF hInf,
IN WCHAR const *pwszSection,
IN WCHAR const *pwszKey,
IN BOOL fIgnoreMissingKey,
OUT BOOL *pfValue);
HRESULT
myInfGetKeyValue(
IN HINF hInf,
IN BOOL fLog,
IN WCHAR const *pwszSection,
IN WCHAR const *pwszKey,
OUT WCHAR **ppwszValue);
HRESULT
myInfGetKeyList(
IN HINF hInf,
IN WCHAR const *pwszSection,
IN WCHAR const *pwszKey,
OUT BOOL *pfCritical,
OUT WCHAR **ppwszz);
typedef struct _INFVALUES
{
WCHAR *pwszKey;
DWORD cValues;
WCHAR **rgpwszValues;
} INFVALUES;
HRESULT
myInfGetSectionValues(
IN HINF hInf,
IN WCHAR const *pwszSection,
OUT DWORD *pcInfValues,
OUT INFVALUES **prgInfValues);
VOID
myInfFreeSectionValues(
IN DWORD cInfValues,
IN OUT INFVALUES *rgInfValues);
HRESULT
myInfGetRequestAttributes(
IN HINF hInf,
OUT DWORD *pcAttribute,
OUT CRYPT_ATTR_BLOB **ppaAttribute,
OUT WCHAR **ppwszTemplateName);
VOID
myInfFreeRequestAttributes(
IN DWORD cAttribute,
IN OUT CRYPT_ATTR_BLOB *paAttribute);
HRESULT
myBuildOSVersionAttribute(
OUT BYTE **ppbVersion,
OUT DWORD *pcbVersion);
HRESULT
myBuildCertTypeExtension(
IN WCHAR const *pwszCertType,
OUT CERT_EXTENSION *pExt);
HRESULT
myParseNextAttribute(
IN OUT WCHAR **ppwszBuf,
IN BOOL fURL,
OUT WCHAR const **ppwszName,
OUT WCHAR const **ppwszValue);
#define CUCS_MYSTORE 0x00000001
#define CUCS_CASTORE 0x00000002
#define CUCS_KRASTORE 0x00000004
#define CUCS_ROOTSTORE 0x00000008
#define CUCS_MACHINESTORE 0x00010000
#define CUCS_USERSTORE 0x00020000
#define CUCS_DSSTORE 0x00040000
#define CUCS_ARCHIVED 0x10000000
#define CUCS_USAGEREQUIRED 0x20000000
#define CUCS_SILENT 0x40000000
#define CUCS_PRIVATEKEYREQUIRED 0x80000000
HRESULT
myGetCertificateFromPicker(
OPTIONAL IN HINSTANCE hInstance,
OPTIONAL IN HWND hwndParent,
OPTIONAL IN int idTitle,
OPTIONAL IN int idSubTitle,
IN DWORD dwFlags, // CUCS_*
OPTIONAL IN WCHAR const *pwszCommonName,
OPTIONAL IN DWORD cStore,
OPTIONAL IN HCERTSTORE *rghStore,
IN DWORD cpszObjId,
OPTIONAL IN CHAR const * const *apszObjId,
OUT CERT_CONTEXT const **ppCert);
HRESULT
myGetKRACertificateFromPicker(
OPTIONAL IN HINSTANCE hInstance,
OPTIONAL IN HWND hwndParent,
OPTIONAL IN int idTitle,
OPTIONAL IN int idSubTitle,
OPTIONAL IN WCHAR const *pwszCommonName,
IN BOOL fUseDS,
IN BOOL fSilent,
OUT CERT_CONTEXT const **ppCert);
HRESULT
myGetERACertificateFromPicker(
OPTIONAL IN HINSTANCE hInstance,
OPTIONAL IN HWND hwndParent,
OPTIONAL IN int idTitle,
OPTIONAL IN int idSubTitle,
OPTIONAL IN WCHAR const *pwszCommonName,
IN BOOL fSilent,
OUT CERT_CONTEXT const **ppCert);
HRESULT
myMakeSerialBstr(
IN WCHAR const *pwszSerialNumber,
OUT BSTR *pstrSerialNumber);
HRESULT
myNameBlobMatch(
IN CERT_NAME_BLOB const *pSubject,
IN WCHAR const *pwszCertName,
IN BOOL fAllowMissingCN,
OUT BOOL *pfMatch);
HRESULT
mySerialNumberMatch(
IN CRYPT_INTEGER_BLOB const *pSerialNumber,
IN WCHAR const *pwszSerialNumber,
OUT BOOL *pfMatch);
HRESULT
myCertHashMatch(
IN CERT_CONTEXT const *pCert,
IN DWORD cb,
IN BYTE const *pb,
OUT BOOL *pfMatch);
HRESULT
myCertMatch(
IN CERT_CONTEXT const *pCert,
IN WCHAR const *pwszCertName,
IN BOOL fAllowMissingCN,
OPTIONAL IN BYTE const *pbHash,
IN DWORD cbHash,
OPTIONAL IN WCHAR const *pwszSerialNumber,
OUT BOOL *pfMatch);
HRESULT
myCRLHashMatch(
IN CRL_CONTEXT const *pCRL,
IN DWORD cb,
IN BYTE const *pb,
OUT BOOL *pfMatch);
HRESULT
myCRLMatch(
IN CRL_CONTEXT const *pCRL,
IN WCHAR const *pwszCRLName,
IN BOOL fAllowMissingCN,
OPTIONAL IN BYTE const *pbHash,
IN DWORD cbHash,
OUT BOOL *pfMatch);
HRESULT
myCTLMatch(
IN CTL_CONTEXT const *pCTL,
OPTIONAL IN BYTE const *pbHash,
IN DWORD cbHash,
OUT BOOL *pfMatch);
HRESULT
myLoadPrivateKey(
IN CERT_PUBLIC_KEY_INFO const *pPubKeyInfo,
IN DWORD dwFlags, // CUCS_*
OUT HCRYPTPROV *phProv,
OUT DWORD *pdwKeySpec,
OUT BOOL *pfCallerFreeProv);
HRESULT
myLoadPrivateKeyFromCertStores(
IN CERT_PUBLIC_KEY_INFO const *pPubKeyInfo,
IN DWORD cStore,
IN HCERTSTORE *rghStore,
OUT HCRYPTPROV *phProv,
OUT DWORD *pdwKeySpec,
OUT BOOL *pfCallerFreeProv);
HRESULT
myOpenCertStores(
IN DWORD dwFlags, // CUCS_*
OUT DWORD *pcStore,
OUT HCERTSTORE **prghStore);
VOID
myCloseCertStores(
IN DWORD cStore,
IN HCERTSTORE *rghStore);
#define DECF_FORCEOVERWRITE 0x00000100
HRESULT
DecodeFileW(
IN WCHAR const *pwszfn,
OUT BYTE **ppbOut,
OUT DWORD *pcbOut,
IN DWORD Flags);
HRESULT
EncodeToFileW(
IN WCHAR const *pwszfn,
IN BYTE const *pbIn,
IN DWORD cbIn,
IN DWORD Flags);
HRESULT
DecodeCertString(
IN BSTR const bstrIn,
IN DWORD Flags,
OUT BYTE **ppbOut,
OUT DWORD *pcbOut);
HRESULT
EncodeCertString(
IN BYTE const *pbIn,
IN DWORD cbIn,
IN DWORD Flags,
OUT BSTR *pbstrOut);
HRESULT
WszToMultiByteIntegerBuf(
IN BOOL fOctetString,
IN WCHAR const *pwszIn,
IN OUT DWORD *pcbOut,
OPTIONAL OUT BYTE const *pbOut);
HRESULT
WszToMultiByteInteger(
IN BOOL fOctetString,
IN WCHAR const *pwszIn,
OUT DWORD *pcbOut,
OUT BYTE **ppbOut);
HRESULT
myGetSecurityDescriptorDacl(
IN PSECURITY_DESCRIPTOR pSD,
OUT PACL *ppDacl); // no free
HRESULT
myRegValueToVariant(
IN DWORD dwType,
IN DWORD cbValue,
IN BYTE const *pbValue,
OUT VARIANT *pVar);
HRESULT
myVariantToRegValue(
IN VARIANT const *pvarPropertyValue,
OUT DWORD *pdwType,
OUT DWORD *pcbprop,
OUT BYTE **ppbprop);
// are we the Whistler version?
BOOL IsWhistler(VOID);
// should we run advanced functionality?
BOOL FIsAdvancedServer(VOID);
// should we be running at all?
BOOL FIsServer(VOID);
HRESULT
myAddLogSourceToRegistry(
IN LPWSTR pwszMsgDLL,
IN LPWSTR pwszApp);
#define LOCAL_FREE(ptr) \
if(NULL != ptr) \
LocalFree(ptr)
inline bool EmptyString(LPCWSTR pwszString)
{
return((NULL == pwszString || L'\0' == *pwszString)? true : false);
}
HRESULT
myOIDHashOIDToString(
IN WCHAR const *pwszOID,
OUT WCHAR **ppwsz);
LPCWSTR
myCAGetDN(
IN HCAINFO hCAInfo);
HRESULT IsCurrentUserBuiltinAdmin(OUT bool* pfIsMember);
HRESULT
SetRegistryLocalPathString(
IN HKEY hkey,
IN WCHAR const *pwszRegValueName,
IN WCHAR const *pwszUNCPath);
HRESULT
LocalMachineIsDomainMember(OUT bool* fIsDomainMember);
HRESULT ComputeMAC(
LPCWSTR pcwsFileName,
LPWSTR* ppwszMAC);
HRESULT CertNameToHashString(
const CERT_NAME_BLOB *pCertName,
LPWSTR* ppwszHash);
using namespace CertSrv;
#endif // __CERTLIB_H__