//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1995 - 1999 // // File: celib.h // // Contents: helper functions // //-------------------------------------------------------------------------- #ifndef __CELIB_H__ #define __CELIB_H__ #include #define CENCODEMAX (64 * 1024) // Bitmap manipulation routines. Fetch or set a bit, given a base and index. #define GETBIT(pb, i) ((pb)[(i) / 8] & (1 << ((i) % 8))) #define SETBIT(pb, i) ((pb)[(i) / 8] |= (1 << ((i) % 8))) #define CLEARBIT(pb, i) ((pb)[(i) / 8] &= ~(1 << ((i) % 8))) #define BITSTOBYTES(b) ((int)(((b) + 7) / 8)) // Size of a fixed array: #define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0])) // wcslen of a static string: #define WSZARRAYSIZE(a) ((sizeof(a)/sizeof((a)[0])) - 1) #define wszCERTENROLLSHAREPATH L"CertSrv\\CertEnroll" #define cwcHRESULTSTRING 40 #define SAFE_SUBTRACT_POINTERS(p1, p2) \ (assert(sizeof((*p1)) == sizeof(*(p2))), (DWORD)((p1) - (p2))) #define printf Use_wprintf_Instead_Of_printf #define _LeaveError(hr, pszMessage) \ _LeaveErrorStr2((hr), (pszMessage), NULL, S_OK) #define _LeaveError2(hr, pszMessage, hr2) \ _LeaveErrorStr2((hr), (pszMessage), NULL, (hr2)) #define _LeaveErrorStr(hr, pszMessage, pwszData) \ _LeaveErrorStr2((hr), (pszMessage), (pwszData), S_OK) #define _LeaveErrorStr2(hr, pszMessage, pwszData, hr2) \ { \ ceERRORPRINTLINESTR((pszMessage), (pwszData), (hr)); \ __leave; \ } #define _LeaveIfError(hr, pszMessage) \ _LeaveIfErrorStr2((hr), (pszMessage), NULL, S_OK) #define _LeaveIfError2(hr, pszMessage, hr2) \ _LeaveIfErrorStr2((hr), (pszMessage), NULL, (hr2)) #define _LeaveIfErrorStr(hr, pszMessage, pwszData) \ _LeaveIfErrorStr2((hr), (pszMessage), (pwszData), S_OK) #define _LeaveIfErrorStr2(hr, pszMessage, pwszData, hr2) \ { \ if (S_OK != (hr)) \ { \ ceERRORPRINTLINESTR((pszMessage), (pwszData), (hr)); \ __leave; \ } \ } #define _PrintErrorStr(hr, pszMessage, pwsz) \ ceERRORPRINTLINESTR((pszMessage), (pwsz), (hr)) #define _PrintErrorStr2(hr, pszMessage, pwsz, hr2) \ _PrintErrorStr((hr), (pszMessage), (pwsz)) #define _PrintError2(hr, pszMessage, hr2) \ _PrintErrorStr((hr), (pszMessage), NULL) #define _PrintError(hr, pszMessage) \ _PrintErrorStr((hr), (pszMessage), NULL) #define _PrintIfErrorStr(hr, pszMessage, pwsz) \ { \ if (S_OK != (hr)) \ { \ ceERRORPRINTLINESTR((pszMessage), (pwsz), (hr)); \ } \ } #define _PrintIfErrorStr2(hr, pszMessage, pwsz, hr2) \ _PrintIfErrorStr((hr), (pszMessage), (pwsz)) #define _PrintIfError2(hr, pszMessage, hr2) \ _PrintIfErrorStr((hr), (pszMessage), NULL) #define _PrintIfError(hr, pszMessage) \ _PrintIfErrorStr((hr), (pszMessage), NULL) #define _JumpErrorStr(hr, label, pszMessage, pwsz) \ _JumpError((hr), label, (pszMessage)) #define _JumpError(hr, label, pszMessage) \ { \ ceERRORPRINTLINESTR((pszMessage), NULL, (hr)); \ goto label; \ } #define _JumpIfErrorStr(hr, label, pszMessage, pwsz) \ { \ if (S_OK != (hr)) \ { \ ceERRORPRINTLINESTR((pszMessage), (pwsz), (hr)); \ goto label; \ } \ } #define _JumpIfErrorStr2(hr, label, pszMessage, pwsz, hr2) \ _JumpIfErrorStr((hr), label, (pszMessage), NULL) #define _JumpIfError2(hr, label, pszMessage, hr2) \ _JumpIfErrorStr((hr), label, (pszMessage), NULL) #define _JumpIfError(hr, label, pszMessage) \ _JumpIfErrorStr((hr), label, (pszMessage), NULL) #define ceERRORPRINTLINE(pszMessage, hr) \ ceErrorPrintLine(__FILE__, __LINE__, (pszMessage), NULL, (hr)) #define ceERRORPRINTLINESTR(pszMessage, pwszData, hr) \ ceErrorPrintLine(__FILE__, __LINE__, (pszMessage), (pwszData), (hr)) #define DBGPRINT(a) ceDbgPrintf a int WINAPIV ceDbgPrintf(BOOL fDebug, char const *pszfmt, ...); VOID ceErrorPrintLine( IN char const *pszFile, IN DWORD line, IN char const *pszMessage, IN WCHAR const *pwszData, IN HRESULT hr); HRESULT ceHLastError(VOID); HRESULT ceHError( IN HRESULT hr); #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")" // 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) enum ENUM_PERIOD { ENUM_PERIOD_INVALID = -1, ENUM_PERIOD_SECONDS = 0, ENUM_PERIOD_MINUTES, ENUM_PERIOD_HOURS, ENUM_PERIOD_DAYS, ENUM_PERIOD_WEEKS, ENUM_PERIOD_MONTHS, ENUM_PERIOD_YEARS }; typedef struct _LLFILETIME { union { LONGLONG ll; FILETIME ft; }; } LLFILETIME; __inline VOID ceAddToFileTime( IN OUT FILETIME *pft, IN LONGLONG ll) { LLFILETIME llft; llft.ft = *pft; llft.ll += ll; *pft = llft.ft; } __inline LONGLONG ceSubtractFileTimes( IN FILETIME const *pft1, IN FILETIME const *pft2) { LLFILETIME llft1; LLFILETIME llft2; llft1.ft = *pft1; llft2.ft = *pft2; return(llft1.ll - llft2.ll); } HRESULT ceMakeExprDate( IN OUT DATE *pDate, IN LONG lDelta, IN enum ENUM_PERIOD enumPeriod); HRESULT ceTranslatePeriodUnits( IN WCHAR const *pwszPeriod, IN LONG lCount, OUT enum ENUM_PERIOD *penumPeriod, OUT LONG *plCount); WCHAR const * ceGetOIDNameA( IN char const *pszObjId); WCHAR const * ceGetOIDName( IN WCHAR const *pwszObjId); BOOL ceDecodeObject( IN DWORD dwEncodingType, IN LPCSTR lpszStructType, IN BYTE const *pbEncoded, IN DWORD cbEncoded, IN BOOL fCoTaskMemAlloc, OUT VOID **ppvStructInfo, OUT DWORD *pcbStructInfo); BOOL ceEncodeObject( DWORD dwEncodingType, IN LPCSTR lpszStructType, IN VOID const *pvStructInfo, IN DWORD dwFlags, IN BOOL fCoTaskMemAlloc, OUT BYTE **ppbEncoded, OUT DWORD *pcbEncoded); WCHAR * ceDuplicateString( IN WCHAR const *pwsz); BOOL ceConvertWszToSz( OUT char **ppsz, IN WCHAR const *pwc, IN LONG cb); BOOL ceConvertWszToBstr( OUT BSTR *pbstr, IN WCHAR const *pwc, IN LONG cb); BOOL ceConvertSzToWsz( OUT WCHAR **ppwsz, IN char const *pch, IN LONG cch); BOOL ceConvertSzToBstr( OUT BSTR *pbstr, IN CHAR const *pch, IN LONG cch); VOID ceFreeBstr( IN OUT BSTR *pstr); HRESULT ceDateToFileTime( IN DATE const *pDate, OUT FILETIME *pft); HRESULT ceFileTimeToDate( IN FILETIME const *pft, OUT DATE *pDate); HRESULT ceVerifyObjId( IN WCHAR const *pwszObjId); HRESULT ceVerifyAltNameString( IN LONG NameChoice, IN WCHAR const *pwszName); HRESULT ceDispatchSetErrorInfo( IN HRESULT hrError, IN WCHAR const *pwszDescription, OPTIONAL IN WCHAR const *pwszProgId, OPTIONAL IN IID const *piid); VOID ceInitErrorMessageText( IN HMODULE hMod, IN DWORD idsUnexpected, IN DWORD idsUnknownErrorCode); // L"Error %ws %ws" WCHAR * ceGetErrorMessageText( IN HRESULT hr, IN BOOL fHResultString); WCHAR const * ceHResultToString( IN OUT WCHAR *awchr, IN HRESULT hr); #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" HRESULT ceFormatCertsrvStringArray( 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 ceInternetCanonicalizeUrl( IN WCHAR const *pwszIn, OUT WCHAR **ppwszOut); int ceWtoI( IN WCHAR const *pwszDigitString, OUT BOOL *pfValid); HRESULT ceIsConfigLocal( IN WCHAR const *pwszConfig, OPTIONAL OUT WCHAR **ppwszMachine, OUT BOOL *pfLocal); #endif // __CELIB_H__