You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
5.6 KiB
285 lines
5.6 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
All rights reserved
|
|
|
|
Module Name:
|
|
|
|
output.cxx
|
|
|
|
Abstract:
|
|
|
|
output
|
|
|
|
Author:
|
|
|
|
Larry Zhu (LZhu) December 1, 2001 Created
|
|
|
|
Environment:
|
|
|
|
User Mode -Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#ifdef UNICODE
|
|
#undef UNICODE
|
|
#endif
|
|
|
|
#ifdef _UNICODE
|
|
#undef _UNICODE
|
|
#endif
|
|
|
|
#include "output.hxx"
|
|
|
|
typedef struct _TLibarayGlobals
|
|
{
|
|
ULONG uMajorVersion;
|
|
ULONG uMinorVersion;
|
|
ULONG uDebugMask;
|
|
PCSTR pszDbgPrompt;
|
|
PCRITICAL_SECTION pCriticalSection;
|
|
} TLibarayGlobals;
|
|
|
|
TLibarayGlobals g_AnsiOutputGlobals = {
|
|
1, // major version
|
|
2, // minor version
|
|
0xF, // debug mask
|
|
"SSPI_TEST", // debug prompt
|
|
NULL, // no serialization
|
|
};
|
|
|
|
CHAR ToChar(IN CHAR c)
|
|
{
|
|
if (isprint(c))
|
|
{
|
|
return c;
|
|
}
|
|
|
|
return '.';
|
|
}
|
|
|
|
VOID SpaceIt(IN ULONG len, IN CHAR* buf)
|
|
{
|
|
memset(buf, ' ', len);
|
|
}
|
|
|
|
CHAR ToHex(IN ULONG c)
|
|
{
|
|
static PCSTR pszDigits = "0123456789abcdef";
|
|
static ULONG len = strlen(pszDigits);
|
|
|
|
if (c <= len)
|
|
{ // c >= 0
|
|
return pszDigits[c];
|
|
}
|
|
|
|
return '*';
|
|
}
|
|
|
|
VOID
|
|
DebugPrintHex(
|
|
IN ULONG ulLevel,
|
|
IN OPTIONAL PCSTR pszBanner,
|
|
IN ULONG cbBuffer,
|
|
IN const VOID* pvbuffer
|
|
)
|
|
{
|
|
if (g_AnsiOutputGlobals.uDebugMask & ulLevel)
|
|
{
|
|
PCRITICAL_SECTION pCriticalSection = g_AnsiOutputGlobals.pCriticalSection;
|
|
|
|
const UCHAR* pBuffer = reinterpret_cast<const UCHAR*>(pvbuffer);
|
|
ULONG high = 0;
|
|
ULONG low = 0;
|
|
CHAR szLine[256] = {0};
|
|
ULONG i = 0;
|
|
|
|
CHAR szBanner[MAX_PATH * 4] = {0};
|
|
|
|
DWORD dwPid = GetCurrentProcessId();
|
|
DWORD dwTid = GetCurrentThreadId();
|
|
|
|
_snprintf(szBanner, sizeof(szBanner) - 1,
|
|
g_AnsiOutputGlobals.pszDbgPrompt ? "%#x.%#x %s> %s %s" : "%#x.%#x%s> %s %s",
|
|
dwPid,
|
|
dwTid,
|
|
g_AnsiOutputGlobals.pszDbgPrompt ? g_AnsiOutputGlobals.pszDbgPrompt : "",
|
|
DebugLevel2Str(ulLevel),
|
|
pszBanner ? pszBanner : "");
|
|
|
|
if (pCriticalSection)
|
|
{
|
|
EnterCriticalSection(pCriticalSection);
|
|
}
|
|
|
|
OutputDebugStringPrintf(szBanner, "\n");
|
|
|
|
SpaceIt(72, szLine);
|
|
|
|
for (i = 0; i < cbBuffer; i++)
|
|
{
|
|
high = pBuffer[i] / 16;
|
|
low = pBuffer[i] % 16;
|
|
|
|
szLine[3 * (i % 16)] = ToHex(high);
|
|
szLine[3 * (i % 16) + 1] = ToHex(low);
|
|
szLine [52 + (i % 16)] = ToChar(pBuffer[i]);
|
|
|
|
if (i % 16 == 7 && i != (cbBuffer - 1))
|
|
{
|
|
szLine[3 * (i % 16) + 2] = '-';
|
|
}
|
|
|
|
if (i % 16 == 15)
|
|
{
|
|
OutputDebugStringPrintf(NULL, " %s\n", szLine);
|
|
SpaceIt(72, szLine);
|
|
}
|
|
}
|
|
|
|
OutputDebugStringPrintf(NULL, " %s\n", szLine);
|
|
|
|
if (pCriticalSection)
|
|
{
|
|
LeaveCriticalSection(pCriticalSection);
|
|
}
|
|
}
|
|
}
|
|
|
|
PCSTR
|
|
DebugLevel2Str(
|
|
IN ULONG ulLevel
|
|
)
|
|
{
|
|
PCSTR pszText = NULL;
|
|
|
|
switch (ulLevel)
|
|
{
|
|
case SSPI_WARN:
|
|
pszText = "[warn]";
|
|
break;
|
|
|
|
case SSPI_ERROR:
|
|
pszText = "[error]";
|
|
break;
|
|
|
|
case SSPI_LOG:
|
|
pszText = "[log]";
|
|
break;
|
|
|
|
case SSPI_LOG_MORE:
|
|
pszText = "[more]";
|
|
break;
|
|
case SSPI_MSG:
|
|
pszText = "[msg]";
|
|
break;
|
|
|
|
default:
|
|
pszText = "[invalid]";
|
|
break;
|
|
}
|
|
|
|
return pszText;
|
|
}
|
|
|
|
VOID
|
|
VOutputDebugStringPrintf(
|
|
IN OPTIONAL PCSTR pszBanner,
|
|
IN PCSTR pszFmt,
|
|
IN va_list pArgs
|
|
)
|
|
{
|
|
CHAR szBuffer[4096] = {0};
|
|
INT cbUsed = 0;
|
|
|
|
cbUsed = _snprintf(szBuffer, sizeof(szBuffer) - 1, "%s", pszBanner ? pszBanner : "");
|
|
|
|
if (cbUsed >= 0)
|
|
{
|
|
_vsnprintf(szBuffer + cbUsed, sizeof(szBuffer) - cbUsed, pszFmt, pArgs);
|
|
}
|
|
|
|
OutputDebugStringA(szBuffer);
|
|
}
|
|
|
|
VOID
|
|
OutputDebugStringPrintf(
|
|
IN OPTIONAL PCSTR pszBanner,
|
|
IN PCSTR pszFmt,
|
|
IN ...
|
|
)
|
|
{
|
|
va_list marker;
|
|
|
|
va_start(marker, pszFmt);
|
|
|
|
VOutputDebugStringPrintf(pszBanner ? pszBanner : "", pszFmt, marker);
|
|
|
|
va_end(marker);
|
|
}
|
|
|
|
VOID DebugPrintf(
|
|
IN ULONG ulLevel,
|
|
IN PCSTR pszFmt,
|
|
IN ...
|
|
)
|
|
{
|
|
if (g_AnsiOutputGlobals.uDebugMask & ulLevel)
|
|
{
|
|
CHAR szBanner[MAX_PATH] = {0};
|
|
|
|
DWORD dwPid = GetCurrentProcessId();
|
|
DWORD dwTid = GetCurrentThreadId();
|
|
|
|
_snprintf(szBanner, sizeof(szBanner) - 1,
|
|
g_AnsiOutputGlobals.pszDbgPrompt ? "%#x.%#x %s> %s " : "%#x.%#x%s> %s ",
|
|
dwPid,
|
|
dwTid,
|
|
g_AnsiOutputGlobals.pszDbgPrompt ? g_AnsiOutputGlobals.pszDbgPrompt : "", DebugLevel2Str(ulLevel));
|
|
|
|
va_list marker;
|
|
|
|
va_start(marker, pszFmt);
|
|
|
|
VOutputDebugStringPrintf(szBanner, pszFmt, marker);
|
|
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
DebugLogOpen(
|
|
IN PCSTR pszPrompt,
|
|
IN ULONG ulMask
|
|
)
|
|
{
|
|
g_AnsiOutputGlobals.uDebugMask = ulMask;
|
|
g_AnsiOutputGlobals.pszDbgPrompt = pszPrompt;
|
|
}
|
|
|
|
VOID
|
|
DebugLogOpenSerialized(
|
|
IN PCSTR pszPrompt,
|
|
IN ULONG ulMask,
|
|
IN PCRITICAL_SECTION pCriticalSection
|
|
)
|
|
{
|
|
g_AnsiOutputGlobals.uDebugMask = ulMask;
|
|
g_AnsiOutputGlobals.pszDbgPrompt = pszPrompt;
|
|
g_AnsiOutputGlobals.pCriticalSection = pCriticalSection;
|
|
}
|
|
|
|
VOID
|
|
DebugLogClose(
|
|
VOID
|
|
)
|
|
{
|
|
g_AnsiOutputGlobals.uDebugMask = 0;
|
|
g_AnsiOutputGlobals.pszDbgPrompt = NULL;
|
|
}
|
|
|