windows-nt/Source/XPSP1/NT/multimedia/directx/applicationmanager/cominterface/appmandebug.cpp
2020-09-26 16:20:57 +08:00

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