//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 1999 // // File: assert.cpp // // Contents: Cert Server wrapper routines // //--------------------------------------------------------------------------- #include #pragma hdrstop #define DBG_CERTSRV_DEBUG_PRINT #ifdef DBG_CERTSRV_DEBUG_PRINT __inline VOID CSDbgBreakPoint(VOID) { DebugBreak(); } //+--------------------------------------------------------------------------- // Function: CSPrintAssert, public // // Synopsis: Display message and break // // Arguments: [pszFailedAssertion] -- failed assertion in string form // [pszFileName] -- filename // [LineNumber] -- line number // [pszMessage] -- optional message // // Returns: None //---------------------------------------------------------------------------- char const * csTrimPath( char const *pszFile) { char const *psz; char *pszT; char const *pszTrim; static char s_path[MAX_PATH]; if (NULL == pszFile) { pszFile = "null.cpp"; } pszTrim = pszFile; psz = strrchr(pszFile, '\\'); if (NULL != psz) { DWORD count = 1; while (count != 0 && psz > pszFile) { if (*--psz == '\\') { if (0 == strncmp(psz, "\\..\\", 4) || 0 == strncmp(psz, "\\.\\", 3)) { count++; } else { count--; pszTrim = &psz[1]; } } } if (strlen(pszTrim) < ARRAYSIZE(s_path)) { pszT = s_path; while ('\0' != *pszTrim) { if ('\\' == *pszTrim) { if (0 == strncmp(pszTrim, "\\..\\", 4)) { pszTrim += 3; continue; } if (0 == strncmp(pszTrim, "\\.\\", 3)) { pszTrim += 2; continue; } } *pszT++ = *pszTrim++; } *pszT = '\0'; pszTrim = s_path; } } return(pszTrim); } VOID CSPrintAssert( IN char const *pszFailedAssertion, IN char const *pszFileName, IN ULONG LineNumber, IN char const *pszMessage OPTIONAL) { BOOLEAN fReprint; char buf[1024]; do { fReprint = FALSE; DBGPRINT(( DBG_SS_ASSERT, "\n" "*** Certificate Services Assertion failed: %hs %hs\n" "*** Source File: %hs, line %ld\n" "\n", pszMessage == NULL? "" : pszMessage, pszFailedAssertion, csTrimPath(pszFileName), LineNumber)); if (IsDebuggerPresent()) { #if i386 _asm xor al,al #endif CSDbgBreakPoint(); #if i386 _asm mov byte ptr [fReprint],al #endif } } while (fReprint); } BOOL csShouldPrintError( IN HRESULT hr, IN HRESULT hrquiet) { BOOL fPrint = TRUE; if (myIsDelayLoadHResult(hr)) { #if DBG_CERTSRV if (!DbgIsSSActive(DBG_SS_MODLOAD)) #endif { fPrint = FALSE; } } if (S_OK != hrquiet && hrquiet == hr) { #if DBG_CERTSRV if (!DbgIsSSActive(DBG_SS_NOQUIET)) #endif { fPrint = FALSE; } } return(fPrint); } VOID CSPrintError( IN char const *pszMessage, OPTIONAL IN WCHAR const *pwszData, IN char const *pszFile, IN DWORD dwLine, IN HRESULT hr, IN HRESULT hrquiet) { char acherr[1024]; WCHAR awchr[cwcHRESULTSTRING]; if (csShouldPrintError(hr, hrquiet)) { if (NULL != pwszData) { if (-1 == _snprintf( acherr, sizeof(acherr), "%hs(%ws)", pszMessage, pwszData)) { strcpy(&acherr[sizeof(acherr) - 4], "..."); } pszMessage = acherr; } DBGPRINT(( DBG_SS_ERROR, "%hs(%u): %hs: error %ws\n", csTrimPath(pszFile), dwLine, pszMessage, myHResultToString(awchr, hr))); } } VOID CSPrintErrorInt( IN char const *pszMessage, IN DWORD dwData, IN char const *pszFile, IN DWORD dwLine, IN HRESULT hr, IN HRESULT hrquiet) { char achdata[32]; WCHAR awchr[cwcHRESULTSTRING]; if (csShouldPrintError(hr, hrquiet)) { if (-1 == _snprintf(achdata, sizeof(achdata), "0x%x(%d)", dwData, dwData)) { strcpy(&achdata[sizeof(achdata) - 4], "..."); } DBGPRINT(( DBG_SS_ERROR, "%hs(%u): %hs(%hs): error %ws\n", csTrimPath(pszFile), dwLine, pszMessage, achdata, myHResultToString(awchr, hr))); } } #endif // DBG_CERTSRV_DEBUG_PRINT