mirror of https://github.com/tongzx/nt5src
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.
486 lines
10 KiB
486 lines
10 KiB
/*++
|
|
|
|
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
|