/*++ Copyright (c) 1998 Microsoft Corporation Module Name: log.h Abstract: Implements routines that simplify the writing to setupact.log and setuperr.log. Author: Jim Schmidt (jimschm) 25-Feb-1997 Revision History: mikeco 23-May-1997 Ran code through train_wreck.exe Ovidiu Temereanca (ovidiut) 23-Oct-1998 Added new logging capabilities */ // // If either DBG or DEBUG defined, use debug mode // #ifdef DBG #ifndef DEBUG #define DEBUG #endif #endif #ifdef DEBUG #ifndef DBG #define DBG #endif #endif // // Redefine MYASSERT // #ifdef DEBUG #ifdef MYASSERT #undef MYASSERT #endif #define DBG_ASSERT "Assert" #define MYASSERT(expr) LogBegin(g_hInst); \ LogIfA( \ !(expr), \ DBG_ASSERT, \ "Assert Failure\n\n%s\n\n%s line %u", \ #expr, \ __FILE__, \ __LINE__ \ ); \ LogEnd() #else #ifndef MYASSERT #define MYASSERT(x) #endif #endif #define LOG_FATAL_ERROR "Fatal Error" #define LOG_MODULE_ERROR "Module Error" #define LOG_ERROR "Error" #define LOG_WARNING "Warning" #define LOG_INFORMATION "Info" #define LOG_STATUS "Status" #define LOG_UPDATE "Update" typedef enum { LOGSEV_DEBUG = 0, LOGSEV_INFORMATION = 1, LOGSEV_WARNING = 2, LOGSEV_ERROR = 3, LOGSEV_FATAL_ERROR = 4 } LOGSEVERITY; typedef struct { BOOL Debug; HMODULE ModuleInstance; LOGSEVERITY Severity; // non-debug only PCSTR Type; PCSTR Message; // debug only PCSTR FormattedMessage; } LOGARGA, *PLOGARGA; typedef struct { BOOL Debug; HMODULE ModuleInstance; LOGSEVERITY Severity; // non-debug only PCSTR Type; // note ansi type PCWSTR Message; // debug only PCWSTR FormattedMessage; } LOGARGW, *PLOGARGW; typedef enum { OD_UNDEFINED = 0x00, // undefined output dest OD_DEBUGLOG = 0x01, // debuglog used OD_SUPPRESS = 0x02, // don't log to any device OD_ERROR = 0x04, // automatically append GetLastError() to the message OD_LOGFILE = 0x08, // messages go to logfile OD_DEBUGGER = 0x10, // messages go to debugger OD_CONSOLE = 0x20, // messages go to console OD_POPUP = 0x40, // display a popup dialog OD_POPUP_CANCEL = 0x80, // do not display a popup dialog (cancelled by user) OD_FORCE_POPUP = 0x100, // force the popup to be displayed always OD_MUST_BE_LOCALIZED = 0x200, // used for LOG() that will generate a popup OD_UNATTEND_POPUP = 0x400, // force the popup to be displayed in unattend mode OD_ASSERT = 0x800, // give DebugBreak option in popup } OUTPUT_DESTINATION; typedef enum { LL_FATAL_ERROR = 0x01, LL_MODULE_ERROR = 0x02, LL_ERROR = 0x04, LL_WARNING = 0x08, LL_INFORMATION = 0x10, LL_STATUS = 0x20, LL_UPDATE = 0x40, } LOG_LEVEL; typedef BOOL (WINAPI LOGCALLBACKA)(PLOGARGA Args); typedef LOGCALLBACKA * PLOGCALLBACKA; typedef BOOL (WINAPI LOGCALLBACKW)(PLOGARGW Args); typedef LOGCALLBACKW * PLOGCALLBACKW; VOID LogBegin ( IN HMODULE ModuleInstance ); VOID LogEnd ( VOID ); BOOL LogReInitA ( IN HWND NewParent, OPTIONAL OUT HWND *OrgParent, OPTIONAL IN PCSTR LogFile, OPTIONAL IN PLOGCALLBACKA LogCallback OPTIONAL ); BOOL LogReInitW ( IN HWND NewParent, OPTIONAL OUT HWND *OrgParent, OPTIONAL IN PCWSTR LogFile, OPTIONAL IN PLOGCALLBACKW LogCallback OPTIONAL ); VOID LogSetVerboseLevel ( IN OUTPUT_DESTINATION Level ); VOID LogSetVerboseBitmap ( IN LOG_LEVEL Bitmap, IN LOG_LEVEL BitsToAdjustMask, IN BOOL EnableDebugger ); #ifdef UNICODE #define LOGARG LOGARGW #define LOGCALLBACK LOGCALLBACKW #define PLOGARG PLOGARGW #define PLOGCALLBACK PLOGCALLBACKW #define LogReInit LogReInitW #else #define LOGARG LOGARGA #define LOGCALLBACK LOGCALLBACKA #define PLOGARG PLOGARGA #define PLOGCALLBACK PLOGCALLBACKA #define LogReInit LogReInitA #endif VOID LogDeleteOnNextInit( VOID ); #define SET_RESETLOG() LogDeleteOnNextInit() VOID _cdecl LogA ( IN PCSTR Type, IN PCSTR Format, ... ); VOID _cdecl LogW ( IN PCSTR Type, IN PCSTR Format, ... ); VOID _cdecl LogIfA ( IN BOOL Condition, IN PCSTR Type, IN PCSTR Format, ... ); VOID _cdecl LogIfW ( IN BOOL Condition, IN PCSTR Type, IN PCSTR Format, ... ); VOID LogTitleA ( IN PCSTR Type, IN PCSTR Title ); VOID LogTitleW ( IN PCSTR Type, IN PCWSTR Title ); VOID LogLineA ( IN PCSTR Line ); VOID LogLineW ( IN PCWSTR Line ); VOID LogDirectA ( IN PCSTR Type, IN PCSTR Text ); VOID LogDirectW ( IN PCSTR Type, IN PCWSTR Text ); VOID SuppressAllLogPopups ( IN BOOL SuppressOn ); BOOL LogSetErrorDest ( IN PCSTR Type, IN OUTPUT_DESTINATION OutDest ); // Define W symbols extern HMODULE g_hInst; #define LOGW(x) LogBegin(g_hInst);LogW x;LogEnd() #define LOGW_IF(x) LogBegin(g_hInst);LogIfW x;LogEnd() #define ELSE_LOGW(x) else {LogBegin(g_hInst);LogW x;LogEnd();} #define ELSE_LOGW_IF(x) else {LogBegin(g_hInst);LogIfW x;LogEnd();} #define LOGTITLEW(type,title) LogBegin(g_hInst);LogTitleW (type,title);LogEnd() #define LOGLINEW(title) LogBegin(g_hInst);LogLineW (title);LogEnd() #define LOGDIRECTW(type,text) LogBegin(g_hInst);LogDirectW (type,text);LogEnd() // Define A symbols #define LOGA(x) LogBegin(g_hInst);LogA x;LogEnd() #define LOGA_IF(x) LogBegin(g_hInst);LogIfA x;LogEnd() #define ELSE_LOGA(x) else {LogBegin(g_hInst);LogA x;LogEnd();} #define ELSE_LOGA_IF(x) else {LogBegin(g_hInst);LogIfA x;LogEnd();} #define LOGTITLEA(type,title) LogBegin(g_hInst);LogTitleA (type,title);LogEnd() #define LOGLINEA(line) LogBegin(g_hInst);LogLineA (line);LogEnd() #define LOGDIRECTA(type,text) LogBegin(g_hInst);LogDirectA (type,text);LogEnd() // Define generic symbols #ifdef UNICODE #define LOG(x) LOGW(x) #define LOG_IF(x) LOGW_IF(x) #define ELSE_LOG(x) ELSE_LOGW(x) #define ELSE_LOG_IF(x) ELSE_LOGW_IF(x) #define LOGTITLE(type,title) LOGTITLEW(type,title) #define LOGLINE(title) LOGLINEW(title) #define LOGDIRECT(type,text) LOGDIRECTW(type,text) #else #define LOG(x) LOGA(x) #define LOG_IF(x) LOGA_IF(x) #define ELSE_LOG(x) ELSE_LOGA(x) #define ELSE_LOG_IF(x) ELSE_LOGA_IF(x) #define LOGTITLE(type,title) LOGTITLEA(type,title) #define LOGLINE(title) LOGLINEA(title) #define LOGDIRECT(type,text) LOGDIRECTA(type,text) #endif // UNICODE #ifdef DEBUG #define DBG_NAUSEA "Nausea" #define DBG_VERBOSE "Verbose" #define DBG_STATS "Stats" #define DBG_WARNING "Warning" #define DBG_ERROR "Error" #define DBG_WHOOPS "Whoops" #define DBG_TRACK "Track" #define DBG_TIME "Time" VOID _cdecl DbgLogA ( IN PCSTR Type, IN PCSTR Format, ... ); VOID _cdecl DbgLogW ( IN PCSTR Type, IN PCSTR Format, ... ); VOID _cdecl DbgLogIfA ( IN BOOL Condition, IN PCSTR Type, IN PCSTR Format, ... ); VOID _cdecl DbgLogIfW ( IN BOOL Condition, IN PCSTR Type, IN PCSTR Format, ... ); VOID DbgDirectA ( IN PCSTR Type, IN PCSTR Text ); VOID DbgDirectW ( IN PCSTR Type, IN PCWSTR Text ); VOID _cdecl DebugLogTimeA ( IN PCSTR Format, ... ); VOID _cdecl DebugLogTimeW ( IN PCSTR Format, ... ); VOID LogCopyDebugInfPathA( OUT PSTR MaxPathBuffer ); VOID LogCopyDebugInfPathW( OUT PWSTR MaxPathBuffer ); // Define W symbols #define DEBUGMSGW(x) LogBegin(g_hInst);DbgLogW x;LogEnd() #define DEBUGMSGW_IF(x) LogBegin(g_hInst);DbgLogIfW x;LogEnd() #define ELSE_DEBUGMSGW(x) else {LogBegin(g_hInst);DbgLogW x;LogEnd();} #define ELSE_DEBUGMSGW_IF(x) else {LogBegin(g_hInst);DbgLogW x;LogEnd();} #define DEBUGLOGTIMEW(x) LogBegin(g_hInst);DebugLogTimeW x;LogEnd() #define DEBUGDIRECTW(type,text) LogBegin(g_hInst);DbgDirectW (type,text);LogEnd() // Define A symbols #define DEBUGMSGA(x) LogBegin(g_hInst);DbgLogA x;LogEnd() #define DEBUGMSGA_IF(x) LogBegin(g_hInst);DbgLogIfA x;LogEnd() #define ELSE_DEBUGMSGA(x) else {LogBegin(g_hInst);DbgLogA x;LogEnd();} #define ELSE_DEBUGMSGA_IF(x) else {LogBegin(g_hInst);DbgLogIfA x;LogEnd();} #define DEBUGLOGTIMEA(x) LogBegin(g_hInst);DebugLogTimeA x;LogEnd() #define DEBUGDIRECTA(type,text) LogBegin(g_hInst);DbgDirectA (type,text);LogEnd() // Define generic symbols #ifdef UNICODE #define DEBUGMSG(x) DEBUGMSGW(x) #define DEBUGMSG_IF(x) DEBUGMSGW_IF(x) #define ELSE_DEBUGMSG(x) ELSE_DEBUGMSGW(x) #define ELSE_DEBUGMSG_IF(x) ELSE_DEBUGMSGW_IF(x) #define DEBUGLOGTIME(x) DEBUGLOGTIMEW(x) #define DEBUGDIRECT(type,text) DEBUGDIRECTW(type,text) #define LogCopyDebugInfPath LogCopyDebugInfPathW #else #define DEBUGMSG(x) DEBUGMSGA(x) #define DEBUGMSG_IF(x) DEBUGMSGA_IF(x) #define ELSE_DEBUGMSG(x) ELSE_DEBUGMSGA(x) #define ELSE_DEBUGMSG_IF(x) ELSE_DEBUGMSGA_IF(x) #define DEBUGLOGTIME(x) DEBUGLOGTIMEA(x) #define DEBUGDIRECT(type,text) DEBUGDIRECTA(type,text) #define LogCopyDebugInfPath LogCopyDebugInfPathA #endif // UNICODE #else // !defined(DEBUG) // // No-debug constants // #define DEBUGMSG(x) #define DEBUGMSGA(x) #define DEBUGMSGW(x) #define DEBUGMSG_IF(x) #define DEBUGMSGA_IF(x) #define DEBUGMSGW_IF(x) #define ELSE_DEBUGMSG(x) #define ELSE_DEBUGMSGA(x) #define ELSE_DEBUGMSGW(x) #define ELSE_DEBUGMSG_IF(x) #define ELSE_DEBUGMSGA_IF(x) #define ELSE_DEBUGMSGW_IF(x) #define DEBUGLOGTIME(x) #define DEBUGDIRECTA(type,text) #define DEBUGDIRECTW(type,text) #define DEBUGDIRECT(type,text) #endif // DEBUG