Leaked source code of windows server 2003
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

/*++
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;
}