665 lines
21 KiB
C++
665 lines
21 KiB
C++
|
#include <stdarg.h>
|
||
|
#include "AppManDebug.h"
|
||
|
|
||
|
#if _TRACEON == TRUE
|
||
|
|
||
|
#pragma message("Trace is on")
|
||
|
|
||
|
CAppManDebugHandler g_oDebugHandler;
|
||
|
CHAR g_szDebugString[256];
|
||
|
|
||
|
#define APPMAN_REG_DBG
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DWORD GetExternalMask(const DWORD dwMsgType)
|
||
|
{
|
||
|
return (DBG_EXTERNAL & dwMsgType);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DWORD GetLevel(const DWORD dwMsgType)
|
||
|
{
|
||
|
DWORD dwLevel = 0;
|
||
|
|
||
|
if ((DBG_ERROR | DBG_THROW | DBG_CATCH) & dwMsgType)
|
||
|
{
|
||
|
dwLevel = 0;
|
||
|
}
|
||
|
else if (DBG_WARNING & dwMsgType)
|
||
|
{
|
||
|
dwLevel = 1;
|
||
|
}
|
||
|
else if ((DBG_FUNCENTRY | DBG_FUNCEXIT | DBG_CONSTRUCTOR | DBG_DESTRUCTOR) & dwMsgType)
|
||
|
{
|
||
|
dwLevel = 2;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwLevel = 5;
|
||
|
}
|
||
|
|
||
|
return dwLevel;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DWORD GetSourceMask(const DWORD dwMsgType)
|
||
|
{
|
||
|
return (DBG_ALL_MODULES & dwMsgType);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
extern CHAR * MakeDebugString(const CHAR * szFormat, ...)
|
||
|
{
|
||
|
va_list ArgumentList;
|
||
|
|
||
|
if (NULL != szFormat)
|
||
|
{
|
||
|
va_start(ArgumentList, szFormat);
|
||
|
_vsnprintf(g_szDebugString, 256, szFormat, ArgumentList);
|
||
|
va_end(ArgumentList);
|
||
|
}
|
||
|
|
||
|
return g_szDebugString;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CAppManDebugHandler::CAppManDebugHandler(void)
|
||
|
{
|
||
|
m_fDebugInitialized = FALSE;
|
||
|
m_dwDebugLevel = 0;
|
||
|
m_dwDebugInternal = 0;
|
||
|
m_dwSourceFlags = 0xffffffff;
|
||
|
m_dwOperationalFlags = OP_NOTHING;
|
||
|
m_dwReportMode = _CRTDBG_MODE_DEBUG;
|
||
|
m_dwFunctionDepth = 0;
|
||
|
strcpy(m_szOutputFilename,"c:\\AppManDebug.txt");
|
||
|
m_MutexHandle = CreateMutex(NULL, FALSE, "AppManDebug");
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CAppManDebugHandler::~CAppManDebugHandler(void)
|
||
|
{
|
||
|
CloseHandle(m_MutexHandle);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::InitDebug(void)
|
||
|
{
|
||
|
DWORD dwType;
|
||
|
DWORD dwSize;
|
||
|
HKEY hRegistryKey = NULL;
|
||
|
BYTE cBuffer[512];
|
||
|
|
||
|
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGPATH_APPMAN, 0, KEY_READ, &hRegistryKey))
|
||
|
{
|
||
|
//
|
||
|
// What is the debug level
|
||
|
//
|
||
|
|
||
|
dwSize = sizeof(cBuffer);
|
||
|
if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "Debug", NULL, &dwType, (LPBYTE) cBuffer, &dwSize))
|
||
|
{
|
||
|
if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize))
|
||
|
{
|
||
|
m_dwDebugLevel = *((LPDWORD) cBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// What is the debug level
|
||
|
//
|
||
|
|
||
|
dwSize = sizeof(cBuffer);
|
||
|
if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugInternal", NULL, &dwType, (LPBYTE) cBuffer, &dwSize))
|
||
|
{
|
||
|
if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize))
|
||
|
{
|
||
|
m_dwDebugInternal = *((LPDWORD) cBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// What is the DebugSourceFlag
|
||
|
//
|
||
|
|
||
|
dwSize = sizeof(cBuffer);
|
||
|
if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugSourceFlags", NULL, &dwType, (LPBYTE) cBuffer, &dwSize))
|
||
|
{
|
||
|
if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize))
|
||
|
{
|
||
|
m_dwSourceFlags = *((LPDWORD) cBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// What is the DebugOperationFlags
|
||
|
//
|
||
|
|
||
|
dwSize = sizeof(cBuffer);
|
||
|
if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugOperationFlags", NULL, &dwType, (LPBYTE) cBuffer, &dwSize))
|
||
|
{
|
||
|
if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize))
|
||
|
{
|
||
|
m_dwOperationalFlags = *((LPDWORD) cBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// What is the DebugReportMode
|
||
|
//
|
||
|
// _CRTDBG_MODE_FILE 0x00000001
|
||
|
// _CRTDBG_MODE_DEBUG 0x00000002
|
||
|
// _CRTDBG_MODE_WNDW 0x00000004
|
||
|
//
|
||
|
|
||
|
dwSize = sizeof(cBuffer);
|
||
|
if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugReportMode", NULL, &dwType, (LPBYTE) cBuffer, &dwSize))
|
||
|
{
|
||
|
if ((REG_DWORD == dwType)&&(sizeof(DWORD) == dwSize))
|
||
|
{
|
||
|
m_dwReportMode = *((LPDWORD) cBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// What is the DebugOutputFilename
|
||
|
//
|
||
|
|
||
|
dwSize = sizeof(cBuffer);
|
||
|
if (ERROR_SUCCESS == RegQueryValueEx(hRegistryKey, "DebugOutputFilename", NULL, &dwType, (LPBYTE) cBuffer, &dwSize))
|
||
|
{
|
||
|
if ((REG_SZ == dwType)&&(sizeof(DWORD) == dwSize))
|
||
|
{
|
||
|
strcpy(m_szOutputFilename, (LPCSTR) cBuffer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Check that the filename is valid and can be opened
|
||
|
//
|
||
|
|
||
|
if (_CRTDBG_MODE_FILE & m_dwReportMode)
|
||
|
{
|
||
|
HANDLE hFile;
|
||
|
|
||
|
hFile = CreateFile(m_szOutputFilename, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||
|
if (NULL == hFile)
|
||
|
{
|
||
|
m_dwReportMode &= ~_CRTDBG_MODE_FILE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CloseHandle(hFile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Close the registry key
|
||
|
//
|
||
|
|
||
|
RegCloseKey(hRegistryKey);
|
||
|
|
||
|
//
|
||
|
// We are ready
|
||
|
//
|
||
|
|
||
|
m_fDebugInitialized = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::DebugPrintf(const DWORD dwMsgType, const DWORD dwLineNumber, LPCSTR szFilename, const TCHAR * szFormat, ...)
|
||
|
{
|
||
|
va_list sVariableList;
|
||
|
DWORD dwProcessId, dwThreadId;
|
||
|
SYSTEMTIME sSystemTime;
|
||
|
CHAR szHeader[512];
|
||
|
CHAR szBaseMessage[512];
|
||
|
CHAR szIntermediateString[1024];
|
||
|
CHAR szOutputString[1024];
|
||
|
|
||
|
//
|
||
|
// Initialize the debug spew
|
||
|
//
|
||
|
|
||
|
if (!m_fDebugInitialized)
|
||
|
{
|
||
|
InitDebug();
|
||
|
m_fDebugInitialized = TRUE;
|
||
|
}
|
||
|
|
||
|
if (WAIT_TIMEOUT != WaitForSingleObject(m_MutexHandle, 1000))
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// Is this an internal message. If so, should we print it out
|
||
|
//
|
||
|
|
||
|
|
||
|
if (((0 == m_dwDebugInternal)&&(GetExternalMask(dwMsgType)))||(0 != m_dwDebugInternal))
|
||
|
{
|
||
|
if (m_dwDebugLevel >= GetLevel(dwMsgType))
|
||
|
{
|
||
|
if (m_dwSourceFlags & GetSourceMask(dwMsgType))
|
||
|
{
|
||
|
//
|
||
|
// Build the main output message
|
||
|
//
|
||
|
|
||
|
va_start(sVariableList, szFormat);
|
||
|
_vsnprintf(szBaseMessage, 512, szFormat, sVariableList);
|
||
|
va_end(sVariableList);
|
||
|
|
||
|
//
|
||
|
// Build szTmpString
|
||
|
//
|
||
|
|
||
|
ZeroMemory(szHeader, sizeof(szHeader));
|
||
|
memset(szHeader, 32, m_dwFunctionDepth * 2);
|
||
|
szHeader[m_dwFunctionDepth * 2] = 0;
|
||
|
|
||
|
switch(dwMsgType & DBG_LEVEL)
|
||
|
{
|
||
|
case DBG_ERROR
|
||
|
: wsprintfA(szIntermediateString, "%s[ ERROR ] %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
|
||
|
case DBG_THROW
|
||
|
: wsprintfA(szIntermediateString, "%s[ THROW ] %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
|
||
|
case DBG_CATCH
|
||
|
: wsprintfA(szIntermediateString, "%s[ CATCH ] %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
|
||
|
case DBG_WARNING
|
||
|
: wsprintfA(szIntermediateString, "%s[ WARNING ] %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
|
||
|
case DBG_FUNCENTRY
|
||
|
: wsprintfA(szIntermediateString, "%s[vvvv] %s", szHeader, szBaseMessage);
|
||
|
m_dwFunctionDepth++;
|
||
|
break;
|
||
|
|
||
|
case DBG_FUNCEXIT
|
||
|
: m_dwFunctionDepth--;
|
||
|
ZeroMemory(szHeader, sizeof(szHeader));
|
||
|
memset(szHeader, 32, m_dwFunctionDepth * 2);
|
||
|
szHeader[m_dwFunctionDepth * 2] = 0;
|
||
|
wsprintfA(szIntermediateString, "%s[^^^^] %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
|
||
|
case DBG_CONSTRUCTOR
|
||
|
: wsprintfA(szIntermediateString, "%s[ CONSTRUCTOR ] %s", szHeader, szBaseMessage);
|
||
|
m_dwFunctionDepth++;
|
||
|
break;
|
||
|
|
||
|
case DBG_DESTRUCTOR
|
||
|
: m_dwFunctionDepth--;
|
||
|
ZeroMemory(szHeader, sizeof(szHeader));
|
||
|
memset(szHeader, 32, m_dwFunctionDepth * 2);
|
||
|
szHeader[m_dwFunctionDepth * 2] = 0;
|
||
|
wsprintfA(szIntermediateString, "%s[ DESTRUCTOR ] %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
|
||
|
default
|
||
|
: wsprintfA(szIntermediateString, "%s> %s", szHeader, szBaseMessage);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (OP_OUTPUTTIMESTAMP & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTFILENAME & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTLINENUMBER, OUTPUTFILENAME, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s Line %05d %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTLINENUMBER, OUTPUTFILENAME, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s Line %05d %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTFILENAME, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTFILENAME, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] File %032s %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szFilename, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTLINENUMBER, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] Line %05d %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTLINENUMBER, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] Line %05d %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] [Time %02d:%02d:%02d:%02d %02d-%02d-%04d] %05d %s\r\n", dwProcessId, dwThreadId, sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTTIMESTAMP
|
||
|
//
|
||
|
|
||
|
GetLocalTime(&sSystemTime);
|
||
|
wsprintfA(szOutputString, "[Time %02d:%02d:%02d:%02d %02d-%02d-%04d] %s\r\n", sSystemTime.wHour, sSystemTime.wMinute, sSystemTime.wSecond, sSystemTime.wMilliseconds, sSystemTime.wMonth, sSystemTime.wDay, sSystemTime.wYear, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTFILENAME & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTLINENUMBER, OUTPUTFILENAME
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] File %032s Line %05d %s\r\n", dwProcessId, dwThreadId, szFilename, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTLINENUMBER, OUTPUTFILENAME
|
||
|
//
|
||
|
|
||
|
wsprintfA(szOutputString, "File %032s Line %05d %s\r\n", szFilename, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTFILENAME
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] File %032s %s\r\n", dwProcessId, dwThreadId, szFilename, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTFILENAME
|
||
|
//
|
||
|
|
||
|
wsprintfA(szOutputString, "File %032s %s\r\n", szFilename, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTLINENUMBER & m_dwOperationalFlags)
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID, OUTPUTLINENUMBER
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] Line %05d %s\r\n", dwProcessId, dwThreadId, dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTLINENUMBER
|
||
|
//
|
||
|
|
||
|
wsprintfA(szOutputString, "Line %05d %s\r\n", dwLineNumber, szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (OP_OUTPUTPTID & m_dwOperationalFlags)
|
||
|
{
|
||
|
//
|
||
|
// OUTPUTPTID
|
||
|
//
|
||
|
|
||
|
dwProcessId = GetCurrentProcessId();
|
||
|
dwThreadId = GetCurrentThreadId();
|
||
|
wsprintfA(szOutputString, "[p%05d][t%05d] %s\r\n", dwProcessId, dwThreadId, szIntermediateString);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//
|
||
|
// NONE
|
||
|
//
|
||
|
|
||
|
wsprintfA(szOutputString, "%s\r\n", szIntermediateString);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Should we output to file
|
||
|
//
|
||
|
|
||
|
if (_CRTDBG_MODE_FILE & m_dwReportMode)
|
||
|
{
|
||
|
HANDLE hFileHandle;
|
||
|
DWORD dwBytesWritten;
|
||
|
|
||
|
hFileHandle = CreateFile(m_szOutputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||
|
if (INVALID_HANDLE_VALUE != hFileHandle)
|
||
|
{
|
||
|
SetFilePointer(hFileHandle, 0, NULL, FILE_END);
|
||
|
WriteFile(hFileHandle, szOutputString, strlen(szOutputString), &dwBytesWritten, NULL);
|
||
|
CloseHandle(hFileHandle);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Should we output to the debug window
|
||
|
//
|
||
|
|
||
|
if ((_CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW) & m_dwReportMode)
|
||
|
{
|
||
|
OutputDebugString(szOutputString);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Release the mutex
|
||
|
//
|
||
|
|
||
|
ReleaseMutex(m_MutexHandle);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::DebugPrintfW(const DWORD dwMsgType, const DWORD dwLineNumber, LPCSTR szFilename, const wchar_t * wszFormat, ...)
|
||
|
{
|
||
|
CWin32API oWin32API;
|
||
|
va_list sVariableList;
|
||
|
WCHAR wszMessage[512];
|
||
|
CHAR szMessage[512];
|
||
|
|
||
|
va_start(sVariableList, wszFormat);
|
||
|
_vsnwprintf(wszMessage, 512, wszFormat, sVariableList);
|
||
|
oWin32API.WideCharToMultiByte(wszMessage, 512, szMessage, 512);
|
||
|
va_end(sVariableList);
|
||
|
|
||
|
DebugPrintf(dwMsgType, dwLineNumber, szFilename, szMessage);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::SetSourceFlags(const DWORD dwFilter)
|
||
|
{
|
||
|
m_dwSourceFlags = dwFilter;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::SetOperationalFlags(const DWORD dwOperationalFlags)
|
||
|
{
|
||
|
m_dwOperationalFlags = dwOperationalFlags;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::SetOutputFilename(LPCSTR szFilename)
|
||
|
{
|
||
|
wsprintfA(m_szOutputFilename, szFilename);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DWORD CAppManDebugHandler::GetSourceFlags(void)
|
||
|
{
|
||
|
return m_dwSourceFlags;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
DWORD CAppManDebugHandler::GetOperationalFlags(void)
|
||
|
{
|
||
|
return m_dwOperationalFlags;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void CAppManDebugHandler::GetOutputFilename(LPSTR szFilename)
|
||
|
{
|
||
|
wsprintfA(szFilename, m_szOutputFilename);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CAutoTrace::CAutoTrace(DWORD dwModule, LPSTR lpFunctionName, INT iLine, LPSTR lpFileName)
|
||
|
{
|
||
|
//
|
||
|
// Save the function name
|
||
|
//
|
||
|
|
||
|
m_dwModule = dwModule;
|
||
|
strncpy(m_szFunctionName, lpFunctionName, MAX_PATH_CHARCOUNT);
|
||
|
strncpy(m_szFilename, lpFileName, MAX_PATH_CHARCOUNT);
|
||
|
g_oDebugHandler.DebugPrintf(m_dwModule | DBG_FUNCENTRY, iLine, m_szFilename, m_szFunctionName);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CAutoTrace::~CAutoTrace(void)
|
||
|
{
|
||
|
g_oDebugHandler.DebugPrintf(m_dwModule | DBG_FUNCEXIT, NULL, m_szFilename, m_szFunctionName);
|
||
|
}
|
||
|
|
||
|
#endif // _TRACEON
|