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.
 
 
 
 
 
 

344 lines
7.2 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
All rights reserved
Module Name:
sspioutput.cxx
Abstract:
sspioutput
Author:
Larry Zhu (LZhu) December 1, 2001 Created
Environment:
User Mode -Win32
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "sspioutput.hxx"
TSspiLibarayGlobals g_SspiGlobals = {
1, // major version
2, // minor version
0xF, // debug mask
TEXT("SSPI"), // debug prompt
NULL, // no serialization
};
#if defined(UNICODE) || defined(_UNICODE)
#define isprint iswprint
#define SspiToChar SspiToCharW
#else
#define SspiToChar SspiToCharA
#endif
WCHAR SspiToCharW(IN UCHAR c)
{
UCHAR* pChar = &c;
if ((c >= ' ') && (c <= '~'))
{
return RtlAnsiCharToUnicodeChar(&pChar);
}
return TEXT('.');
}
CHAR SspiToCharA(IN UCHAR c)
{
if ((c >= ' ') && (c <= '~'))
{
return c;
}
return TEXT('.');
}
VOID SspiSpaceIt(IN ULONG cchLen, IN TCHAR* buf)
{
for (ULONG i = 0; i < cchLen; i++)
{
buf[i] = TEXT(' ');
}
}
TCHAR SspiToHex(
IN ULONG c
)
{
static PCTSTR pszDigits = TEXT("0123456789abcdef");
static ULONG len = lstrlen(pszDigits);
if (c <= len)
{ // c >= 0
return pszDigits[c];
}
return TEXT('*');
}
VOID
SspiPrintHex(
IN ULONG ulLevel,
IN OPTIONAL PCTSTR pszBanner,
IN ULONG cbBuffer,
IN const VOID* pvbuffer
)
{
if (g_SspiGlobals.uDebugMask & ulLevel)
{
PCRITICAL_SECTION pCriticalSection = g_SspiGlobals.pCriticalSection;
const UCHAR* pBuffer = reinterpret_cast<const UCHAR*>(pvbuffer);
ULONG high = 0;
ULONG low = 0;
TCHAR szLine[256] = {0};
ULONG i = 0;
TCHAR szBanner[MAX_PATH * 4] = {0};
DWORD dwPid = GetCurrentProcessId();
DWORD dwTid = GetCurrentThreadId();
_sntprintf(szBanner, COUNTOF(szBanner) - 1,
g_SspiGlobals.pszDbgPrompt ? TEXT("%#x.%#x %s> %s %s") : TEXT("%#x.%#x%s> %s %s"),
dwPid,
dwTid,
g_SspiGlobals.pszDbgPrompt ? g_SspiGlobals.pszDbgPrompt : TEXT(""),
SspiLevel2Str(ulLevel),
pszBanner ? pszBanner : TEXT(""));
if (pCriticalSection)
{
EnterCriticalSection(pCriticalSection);
}
SspiOutputDebugStringPrint(szBanner, TEXT("\n"));
SspiSpaceIt(72, szLine);
for (i = 0; i < cbBuffer; i++)
{
high = pBuffer[i] / 16;
low = pBuffer[i] % 16;
szLine[3 * (i % 16)] = SspiToHex(high);
szLine[3 * (i % 16) + 1] = SspiToHex(low);
szLine [52 + (i % 16)] = SspiToChar(pBuffer[i]);
if (i % 16 == 7 && i != (cbBuffer - 1))
{
szLine[3 * (i % 16) + 2] = TEXT('-');
}
if (i % 16 == 15)
{
SspiOutputDebugStringPrint(NULL, TEXT(" %s\n"), szLine);
SspiSpaceIt(72, szLine);
}
}
SspiOutputDebugStringPrint(NULL, TEXT(" %s\n"), szLine);
if (pCriticalSection)
{
LeaveCriticalSection(pCriticalSection);
}
}
}
PCTSTR
SspiLevel2Str(
IN ULONG ulLevel
)
{
PCTSTR pszText = NULL;
switch (ulLevel)
{
case SSPI_WARN:
pszText = TEXT("[warn]");
break;
case SSPI_ERROR:
pszText = TEXT("[error]");
break;
case SSPI_LOG:
pszText = TEXT("[log]");
break;
case SSPI_LOG_MORE:
pszText = TEXT("[more]");
break;
case SSPI_MSG:
pszText = TEXT("[msg]");
break;
default:
pszText = TEXT("[invalid]");
break;
}
return pszText;
}
VOID
SspiVOutputDebugStringPrint(
IN OPTIONAL PCTSTR pszBanner,
IN PCTSTR pszFmt,
IN va_list pArgs
)
{
TCHAR szBuffer[4096] = {0};
INT cbUsed = 0;
cbUsed = _sntprintf(szBuffer, COUNTOF(szBuffer) - 1, TEXT("%s"), pszBanner ? pszBanner : TEXT(""));
if (cbUsed >= 0)
{
_vsntprintf(szBuffer + cbUsed, sizeof(szBuffer) -1 - cbUsed, pszFmt, pArgs);
}
OutputDebugString(szBuffer);
}
VOID
SspiOutputDebugStringPrint(
IN OPTIONAL PCTSTR pszBanner,
IN PCTSTR pszFmt,
IN ...
)
{
va_list marker;
va_start(marker, pszFmt);
SspiVOutputDebugStringPrint(pszBanner ? pszBanner : TEXT(""), pszFmt, marker);
va_end(marker);
}
VOID
SspiPrint(
IN ULONG ulLevel,
IN PCTSTR pszFmt,
IN ...
)
{
if (g_SspiGlobals.uDebugMask & ulLevel)
{
TCHAR szBanner[MAX_PATH] = {0};
DWORD dwPid = GetCurrentProcessId();
DWORD dwTid = GetCurrentThreadId();
_sntprintf(szBanner, COUNTOF(szBanner) - 1,
g_SspiGlobals.pszDbgPrompt ? TEXT("%#x.%#x %s> %s ") : TEXT("%#x.%#x%s> %s "),
dwPid,
dwTid,
g_SspiGlobals.pszDbgPrompt ? g_SspiGlobals.pszDbgPrompt : TEXT(""), SspiLevel2Str(ulLevel));
va_list marker;
va_start(marker, pszFmt);
SspiVOutputDebugStringPrint(szBanner, pszFmt, marker);
va_end(marker);
}
}
VOID
SspiLogOpen(
IN PCTSTR pszPrompt,
IN ULONG ulMask
)
{
g_SspiGlobals.uDebugMask = ulMask;
g_SspiGlobals.pszDbgPrompt = pszPrompt;
}
VOID
SspiLogOpenSerialized(
IN PCTSTR pszPrompt,
IN ULONG ulMask,
IN PCRITICAL_SECTION pCriticalSection
)
{
g_SspiGlobals.uDebugMask = ulMask;
g_SspiGlobals.pszDbgPrompt = pszPrompt;
g_SspiGlobals.pCriticalSection = pCriticalSection;
}
VOID
SspiLogClose(
VOID
)
{
g_SspiGlobals.uDebugMask = 0;
g_SspiGlobals.pszDbgPrompt = NULL;
}
VOID
SspiPrintSysTimeAsLocalTime(
IN ULONG ulLevel,
IN PCTSTR pszBanner,
IN LARGE_INTEGER* pSysTime
)
{
TNtStatus NtStatus = STATUS_UNSUCCESSFUL;
TIME_FIELDS TimeFields = {0};
LARGE_INTEGER LocalTime = {0};
NtStatus DBGCHK = RtlSystemTimeToLocalTime(pSysTime, &LocalTime);
if (NT_SUCCESS(NtStatus))
{
RtlTimeToTimeFields(&LocalTime, &TimeFields);
SspiPrint(ulLevel, TEXT("%s LocalTime(%ld/%ld/%ld %ld:%2.2ld:%2.2ld) SystemTime(H%8.8lx L%8.8lx)\n"),
pszBanner,
TimeFields.Month,
TimeFields.Day,
TimeFields.Year,
TimeFields.Hour,
TimeFields.Minute,
TimeFields.Second,
pSysTime->HighPart,
pSysTime->LowPart);
}
}
VOID
SspiPrintLocalTime(
IN ULONG ulLevel,
IN PCTSTR pszBanner,
IN LARGE_INTEGER* pLocalTime
)
{
TIME_FIELDS TimeFields = {0};
RtlTimeToTimeFields(pLocalTime, &TimeFields);
SspiPrint(ulLevel, TEXT("%s LocalTime(%ld/%ld/%ld %ld:%2.2ld:%2.2ld) H%8.8lx L%8.8lx\n"),
pszBanner,
TimeFields.Month,
TimeFields.Day,
TimeFields.Year,
TimeFields.Hour,
TimeFields.Minute,
TimeFields.Second,
pLocalTime->HighPart,
pLocalTime->LowPart);
}