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.
306 lines
7.6 KiB
306 lines
7.6 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: debug.c
|
|
//
|
|
// Contents: Debugging support functions
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// Note: This file is not compiled for retail builds
|
|
//
|
|
// History: 4-29-93 RichardW Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// #if DBG // NOTE: This file not compiled for retail builds
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#if DBG // NOTE: This file not compiled for retail builds
|
|
|
|
FILE * LogFile;
|
|
DWORD WinlogonInfoLevel = 3;
|
|
|
|
|
|
// Debugging support functions.
|
|
|
|
// These two functions do not exist in Non-Debug builds. They are wrappers
|
|
// to the commnot functions (maybe I should get rid of that as well...)
|
|
// that echo the message to a log file.
|
|
|
|
char * DebLevel[] = { "Winlogon-Error",
|
|
"Winlogon-Warn",
|
|
"Winlogon-Trace",
|
|
"Winlogon-Trace-Init",
|
|
"Winlogon-Trace-Timeout",
|
|
"Winlogon-Trace-SAS",
|
|
"Winlogon-Trace-State",
|
|
"Winlogon-Trace-MPR",
|
|
"Should-not-see",
|
|
"Winlogon-Trace-Profile",
|
|
"Should-not-see",
|
|
"Should-not-see",
|
|
"Should-not-see",
|
|
"Winlogon-Trace-Migrate",
|
|
"Should-not-see",
|
|
"Winlogon-Trace-Setup"
|
|
};
|
|
|
|
typedef struct _DebugKeys {
|
|
char * Name;
|
|
DWORD Value;
|
|
} DebugKeys, *PDebugKeys;
|
|
|
|
DebugKeys DebugKeyNames[] = {
|
|
{"Error", DEB_ERROR},
|
|
{"Warning", DEB_WARN},
|
|
{"Trace", DEB_TRACE},
|
|
{"Init", DEB_TRACE_INIT},
|
|
{"Timeout", DEB_TRACE_TIMEOUT},
|
|
{"Sas", DEB_TRACE_SAS},
|
|
{"State", DEB_TRACE_STATE},
|
|
{"MPR", DEB_TRACE_MPR},
|
|
{"CoolSwitch", DEB_COOL_SWITCH},
|
|
{"Profile", DEB_TRACE_PROFILE},
|
|
{"DebugLsa", DEB_DEBUG_LSA},
|
|
{"DebugSpm", DEB_DEBUG_LSA},
|
|
{"DebugMpr", DEB_DEBUG_MPR},
|
|
{"DebugGo", DEB_DEBUG_NOWAIT},
|
|
{"Migrate", DEB_TRACE_MIGRATE},
|
|
{"DebugServices", DEB_DEBUG_SERVICES},
|
|
{"Setup", DEB_TRACE_SETUP}
|
|
};
|
|
|
|
#define NUM_DEBUG_KEYS sizeof(DebugKeyNames) / sizeof(DebugKeys)
|
|
#define NUM_BREAK_KEYS sizeof(BreakKeyNames) / sizeof(DebugKeys)
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: LogEvent
|
|
//
|
|
// Synopsis: Logs an event to the console and, optionally, a file.
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: [Mask] --
|
|
// [Format] --
|
|
// [Format] --
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: 4-29-93 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void
|
|
LogEvent( long Mask,
|
|
const char * Format,
|
|
...)
|
|
{
|
|
va_list ArgList;
|
|
int Level = 0;
|
|
int PrefixSize = 0;
|
|
char szOutString[256];
|
|
long OriWinlogonlMask = Mask;
|
|
|
|
|
|
if (Mask & WinlogonInfoLevel)
|
|
{
|
|
while (!(Mask & 1))
|
|
{
|
|
Level++;
|
|
Mask >>= 1;
|
|
}
|
|
if (Level >= (sizeof(DebLevel) / sizeof(char *)) )
|
|
{
|
|
Level = (sizeof(DebLevel) / sizeof(char *)) - 1;
|
|
}
|
|
|
|
|
|
//
|
|
// Make the prefix first: "Process.Thread> Winlogon-XXX"
|
|
//
|
|
|
|
PrefixSize = sprintf(szOutString, "%d.%d> %s: ",
|
|
GetCurrentProcessId(), GetCurrentThreadId(), DebLevel[Level]);
|
|
|
|
|
|
va_start(ArgList, Format);
|
|
|
|
if (_vsnprintf(&szOutString[PrefixSize], sizeof(szOutString) - PrefixSize,
|
|
Format, ArgList) < 0)
|
|
{
|
|
//
|
|
// Less than zero indicates that the string could not be
|
|
// fitted into the buffer. Output a special message indicating
|
|
// that:
|
|
//
|
|
|
|
OutputDebugStringA("Winlogon!LogEvent: Could not pack string into 256 bytes\n");
|
|
|
|
}
|
|
else
|
|
{
|
|
OutputDebugStringA(szOutString);
|
|
}
|
|
|
|
|
|
if (LogFile)
|
|
{
|
|
SYSTEMTIME stTime;
|
|
FILETIME ftTime;
|
|
FILETIME localtime;
|
|
|
|
NtQuerySystemTime((PLARGE_INTEGER) &ftTime);
|
|
FileTimeToLocalFileTime(&ftTime, &localtime);
|
|
FileTimeToSystemTime(&localtime, &stTime);
|
|
fprintf(LogFile, "%02d:%02d:%02d.%03d: %s\n",
|
|
stTime.wHour, stTime.wMinute, stTime.wSecond,
|
|
stTime.wMilliseconds, szOutString);
|
|
|
|
fflush(LogFile);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
OpenLogFile(LPSTR pszLogFile)
|
|
{
|
|
LogFile = fopen(pszLogFile, "a");
|
|
if (!LogFile)
|
|
{
|
|
OutputDebugStringA("Winlogon: Could not open logfile for append");
|
|
OutputDebugStringA(pszLogFile);
|
|
}
|
|
DebugLog((DEB_TRACE, "Log file '%s' begins\n", pszLogFile));
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetDebugKeyValue(
|
|
PDebugKeys KeyTable,
|
|
int cKeys,
|
|
LPSTR pszKey)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0; i < cKeys ; i++ )
|
|
{
|
|
if (_strcmpi(KeyTable[i].Name, pszKey) == 0)
|
|
{
|
|
return(KeyTable[i].Value);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: LoadDebugParameters
|
|
//
|
|
// Synopsis: Loads debug parameters from win.ini
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: (none)
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: 4-29-93 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
void
|
|
LoadDebugParameters(char * szSection)
|
|
{
|
|
char szVal[128];
|
|
char * pszDebug;
|
|
int cbVal;
|
|
|
|
cbVal = GetProfileStringA(szSection, "DebugFlags", "Error,Warning", szVal, sizeof(szVal));
|
|
|
|
pszDebug = strtok(szVal, ", \t");
|
|
while (pszDebug)
|
|
{
|
|
WinlogonInfoLevel |= GetDebugKeyValue(DebugKeyNames, NUM_DEBUG_KEYS, pszDebug);
|
|
pszDebug = strtok(NULL, ", \t");
|
|
}
|
|
|
|
cbVal = GetProfileStringA(szSection, "LogFile", "", szVal, sizeof(szVal));
|
|
if (cbVal)
|
|
{
|
|
OpenLogFile(szVal);
|
|
}
|
|
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: InitDebugSupport
|
|
//
|
|
// Synopsis: Initializes debugging support for the Winlogon
|
|
//
|
|
// Effects:
|
|
//
|
|
// Arguments: (none)
|
|
//
|
|
// Requires:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Signals:
|
|
//
|
|
// Modifies:
|
|
//
|
|
// Algorithm:
|
|
//
|
|
// History: 4-29-93 RichardW Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
void
|
|
InitDebugSupport(void)
|
|
{
|
|
LoadDebugParameters("WinlogonDebug");
|
|
LoadDebugParameters("Winlogon");
|
|
|
|
}
|
|
|
|
|
|
|
|
#else // DBG
|
|
|
|
//#pragma warning(disable:4206) // Disable the empty transation unit
|
|
// warning/error
|
|
|
|
#endif // NOTE: This file not compiled for retail builds
|