Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

234 lines
7.7 KiB

#ifndef __APPMAN_DEBUG_
#define __APPMAN_DEBUG_
#ifdef __cplusplus
extern "C" {
#endif
#include <windows.h>
#include <stdio.h>
#include <crtdbg.h>
#include <tchar.h>
#include "Win32API.h"
#include "AppMan.h"
#define REGPATH_APPMAN _T("Software\\Microsoft\\AppMan")
#ifdef _DEBUG
#define _TRACEON TRUE
#else
#define _TRACEON FALSE
#endif
//////////////////////////////////////////////////////////////////////////////////////////////
//
// Make sure to define the different trace message types
//
//////////////////////////////////////////////////////////////////////////////////////////////
// 0: Error useful for application developers.
// 1: Warning useful for application developers.
// 2: API Entered
// 3: API parameters, API return values
// 4: Driver conversation
//
// 5: Deeper program flow notifications
// 6: Dump structures
//
// Debug Level
//
#define DBGLVL_ERROR 0
#define DBGLVL_WARNING 1
#define DBGLVL_APIENTRY 2
#define DBGLVL_APIPARAMS 3
#define DBGLVL_DRIVER 4
#define DBGLVL_INTERNAL 5
#define DBGLVL_DUMPSTRUCTS 6
//
// Debug Type (Not set in Registry)
//
#define DBG_ERROR 0x00000001 // Maps to Level 0
#define DBG_THROW 0x00000002 // Maps to Level 0
#define DBG_CATCH 0x00000004 // Maps to Level 0
#define DBG_WARNING 0x00000008 // Maps to Level 1
#define DBG_FUNCENTRY 0x00000010 // Maps to Level 2
#define DBG_FUNCEXIT 0x00000020 // Maps to Level 2
#define DBG_CONSTRUCTOR 0x00000040 // Maps to Level 2
#define DBG_DESTRUCTOR 0x00000080 // Maps to Level 2
#define DBG_MSG 0x00000100 // Maps to Level 5
#define DBG_EXTERNAL 0x00000200
#define DBG_LEVEL (DBG_ERROR | DBG_THROW | DBG_CATCH | DBG_WARNING | DBG_FUNCENTRY | DBG_FUNCEXIT | DBG_CONSTRUCTOR | DBG_DESTRUCTOR | DBG_MSG | DBG_EXTERNAL)
#define DBG_ENTRY (DBG_FUNCENTRY | DBG_FUNCEXIT | DBG_CONSTRUCTOR | DBG_DESTRUCTOR)
//
// Debug Sources Flags
//
#define DBG_APPENTRY 0x00001000
#define DBG_APPMAN 0x00002000
#define DBG_APPMANROOT 0x00008000
#define DBG_APPMANADMIN 0x00004000
#define DBG_LOCK 0x00010000
#define DBG_EXCEPTION 0x00020000
#define DBG_FAPPMAN 0x00040000
#define DBG_INFOMAN 0x00080000
#define DBG_REGISTRY 0x00100000
#define DBG_WIN32 0x00400000
#define DBG_EMPTYVOLUMECACHE 0x00800000
#define DBG_WAITEVENT 0x01000000
#define DBG_APPMANDP 0x02000000
#define DBG_ALL_MODULES (DBG_APPENTRY | DBG_APPMAN | DBG_APPMANROOT | DBG_APPMANADMIN | DBG_LOCK | DBG_EXCEPTION | DBG_FAPPMAN | DBG_INFOMAN | DBG_REGISTRY | DBG_WIN32 | DBG_EMPTYVOLUMECACHE | DBG_WAITEVENT | DBG_APPMANDP)
#define DBG_STD_MODULES (DBG_APPENTRY | DBG_APPMAN | DBG_APPMANADMIN | DBG_FAPPMAN | DBG_INFOMAN | DBG_WAITEVENT)
//
// Debug Operations Flags
//
#define OP_NOTHING 0x00000000
#define OP_OUTPUTPARAMETERS 0x00000001
#define OP_OUTPUTTIMESTAMP 0x00000002
#define OP_OUTPUTFILENAME 0x00000004
#define OP_OUTPUTLINENUMBER 0x00000008
#define OP_OUTPUTPTID 0x00000010
#define OP_OUTPUTMODULENAME 0x00000020
#define OP_OUTPUTINDENT 0x00000040
//
// Debug Report Mode (Not set in Registry)
//
#define DBGMODE_FILE _CRTDBG_MODE_FILE //0x1
#define DBGMODE_DBGR _CRTDBG_MODE_DEBUG //0x2
#define DBGMODE_WNDW _CRTDBG_MODE_WNDW //0x4
#define DBG_MODULE 0x00000000 //By default, have all off.
#if _TRACEON == TRUE
#define PROF_SECT_APPMAN "ApplicationManager"
//////////////////////////////////////////////////////////////////////////////////////////////
//
// Define the CAppManDebugHandler class
//
//////////////////////////////////////////////////////////////////////////////////////////////
class CAppManDebugHandler
{
public :
CAppManDebugHandler(void);
~CAppManDebugHandler(void);
void DebugPrintf(const DWORD dwMsgType, const DWORD dwLineNumber, LPCSTR szFilename, const TCHAR * szFormat, ...);
void DebugPrintfW(const DWORD dwMsgType, const DWORD dwLineNumber, LPCSTR szFilename, const wchar_t * wszFormat, ...);
BOOL DebugAccessTest(void);
void InitDebug(void);
void SetSourceFlags(const DWORD dwFilter);
void SetOperationalFlags(const DWORD dwOperationalFlags);
void SetOutputFilename(LPCSTR szFilename);
DWORD GetSourceFlags(void);
DWORD GetOperationalFlags(void);
void GetOutputFilename(LPSTR szFilename);
private :
HANDLE m_MutexHandle;
DWORD m_dwReportMode;
DWORD m_dwOperationalFlags;
DWORD m_dwSourceFlags;
DWORD m_dwFunctionDepth;
DWORD m_dwDebugLevel;
DWORD m_dwDebugInternal;
CHAR m_szOutputFilename[MAX_PATH_CHARCOUNT];
BOOL m_fDebugInitialized;
};
//////////////////////////////////////////////////////////////////////////////////////////////
//
// Define the CAutoTrace class. This class is use to track function entry and exit
// automatically
//
//////////////////////////////////////////////////////////////////////////////////////////////
class CAutoTrace
{
public :
CAutoTrace(DWORD dwModule, LPSTR lpFunctionName, INT iLine, LPSTR lpFileName);
~CAutoTrace(void);
private :
char m_szFunctionName[MAX_PATH_CHARCOUNT];
char m_szFilename[MAX_PATH_CHARCOUNT];
DWORD m_dwModule;
};
//////////////////////////////////////////////////////////////////////////////////////////////
//
// Share some global variables
//
//////////////////////////////////////////////////////////////////////////////////////////////
extern CAppManDebugHandler g_oDebugHandler;
extern CHAR g_szDebugString[256];
//////////////////////////////////////////////////////////////////////////////////////////////
//
// Share some global functions
//
//////////////////////////////////////////////////////////////////////////////////////////////
extern CHAR * MakeDebugString(const CHAR * szFormat, ...);
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
#define FUNCTION(a) CAutoTrace sAutoTrace(DBG_MODULE, (a), __LINE__, __FILE__)
#define TRACE(a,b) g_oDebugHandler.DebugPrintf((a) | DBG_MSG, __LINE__, __FILE__, (b))
#define THROWEXCEPTION(a) g_oDebugHandler.DebugPrintf(DBG_MODULE | DBG_THROW, __LINE__, __FILE__, "EXCEPTION: Severity= 0x%08x", (a))
#define DPF g_oDebugHandler.DebugPrintf
#define DPFW g_oDebugHandler.DebugPrintfW
#define DPFMSG(a) g_oDebugHandler.DebugPrintf(DBG_MODULE | DBG_MSG, __LINE__, __FILE__, (a))
#define DPFERR(a) g_oDebugHandler.DebugPrintf(DBG_MODULE | DBG_ERROR, __LINE__, __FILE__, (a))
#define DPFWARN(a) g_oDebugHandler.DebugPrintf(DBG_MODULE | DBG_WARNING, __LINE__, __FILE__, (a))
#define DPFCONSTRUCTOR(a) g_oDebugHandler.DebugPrintf(DBG_MODULE | DBG_CONSTRUCTOR, __LINE__, __FILE__, (a))
#define DPFDESTRUCTOR(a) g_oDebugHandler.DebugPrintf(DBG_MODULE | DBG_DESTRUCTOR, __LINE__, __FILE__, (a))
#else
#define FUNCTION(a)
#define TRACE(a, b)
#define THROWEXCEPTION(a)
#define DPF
#define DPFW
#define DPFMSG(a)
#define DPFERR(a)
#define DPFWARN(a)
#define DPFCONSTRUCTOR(a)
#define DPFDESTRUCTOR(a)
#endif // _TRACEON
#ifdef __cplusplus
}
#endif
#endif // __APPMAN_DEBUG_