windows-nt/Source/XPSP1/NT/ds/security/services/ca/certclib/assert.cpp
2020-09-26 16:20:57 +08:00

238 lines
5 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: assert.cpp
//
// Contents: Cert Server wrapper routines
//
//---------------------------------------------------------------------------
#include <pch.cpp>
#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