windows-nt/Source/XPSP1/NT/ds/security/inc/dsysdbg.h
2020-09-26 16:20:57 +08:00

247 lines
8.6 KiB
C

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: dsysdbg.h
//
// Contents: Merged all the debug code together
//
// Classes:
//
// Functions:
//
// History: 3-14-95 RichardW Created
//
//----------------------------------------------------------------------------
#ifndef __DSYSDBG_H__
#define __DSYSDBG_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdarg.h>
typedef struct _DEBUG_KEY {
DWORD Mask;
PCHAR Tag;
} DEBUG_KEY, * PDEBUG_KEY;
#define DSYSDBG_OPEN_ONLY 0x00000001
#define DSYSDBG_DEMAND_OPEN 0x00000002
#define DSYSDBG_BREAK_ON_ERROR 0x00000004
#define DSYSDBG_ASSERT_CONTINUE 0
#define DSYSDBG_ASSERT_BREAK 1
#define DSYSDBG_ASSERT_SUSPEND 2
#define DSYSDBG_ASSERT_KILL 3
#define DSYSDBG_ASSERT_PROMPT 4
#define DSYSDBG_ASSERT_DEBUGGER 5
//
// Global Flags exposed to callers:
//
#define DEBUG_HEAP_CHECK 0x00000040 // Check Heap on every debug out
#define DEBUG_MULTI_THREAD 0x00000080 // Use critical section in header
#define DEBUG_BREAK_ON_ERROR 0x00000400 // Break on an error out
VOID _DsysAssertEx(PVOID FailedAssertion, PVOID FileName, ULONG LineNumber,
PCHAR Message, ULONG ContinueCode);
VOID _DebugOut(PVOID pControl, ULONG Mask, CHAR * Format, va_list ArgList);
VOID _InitDebug(DWORD Flags, DWORD * InfoLevel, PVOID * Control, char * ModuleName, PDEBUG_KEY pKey);
VOID _UnloadDebug( PVOID pControl );
VOID _DbgSetOption(PVOID pControl, DWORD Flag, BOOL On, BOOL Global);
VOID _DbgSetLoggingOption(PVOID pControl, BOOL On);
VOID DbgpDumpException(PVOID p);
// Hack to allow retail builds to include debug support
// define RETAIL_LOG_SUPPORT in your sources to do it!
#ifdef RETAIL_LOG_SUPPORT
#define DEBUG_SUPPORT
#else
#if DBG
#define DEBUG_SUPPORT
#endif
#endif
#ifdef DEBUG_SUPPORT
//
// Use this in your header file. It declares the variables that we need
//
#define DECLARE_DEBUG2(comp) \
extern PVOID comp##ControlBlock; \
extern DWORD comp##InfoLevel; \
void comp##DebugPrint(ULONG Mask, CHAR * Format, ... ); \
//
// Use this when you control when you are initialized, for example a DLL or
// EXE. This defines the wrapper functions that will call into dsysdbg.lib
//
#define DEFINE_DEBUG2(comp) \
PVOID comp##ControlBlock = NULL ; \
DWORD comp##InfoLevel; \
PVOID comp##__DebugKeys; \
void comp##DebugPrint( \
ULONG Mask, \
CHAR * Format, \
... ) \
{ \
va_list ArgList; \
va_start(ArgList, Format); \
_DebugOut( comp##ControlBlock, Mask, Format, ArgList); \
} \
void \
comp##InitDebugEx(DWORD Flags, PDEBUG_KEY pKey) \
{ \
comp##__DebugKeys = pKey; \
_InitDebug(Flags, & comp##InfoLevel, & comp##ControlBlock, #comp, pKey); \
} \
void \
comp##InitDebug(PDEBUG_KEY pKey) \
{ \
_InitDebug(0, & comp##InfoLevel, & comp##ControlBlock, #comp, pKey); \
} \
void \
comp##SetOption(DWORD Option, BOOL On, BOOL Global) \
{ \
_DbgSetOption( comp##ControlBlock, Option, On, Global); \
} \
void \
comp##SetLoggingOption(BOOL On) \
{ \
_DbgSetLoggingOption(comp##ControlBlock, On); \
} \
void \
comp##UnloadDebug(void) \
{ \
_UnloadDebug( comp##ControlBlock ); \
comp##ControlBlock = NULL ; \
}
//
// Use this when you don't control when you are initialized, e.g. a static
// library like the gluon code.
//
#define DEFINE_DEBUG_DEFER(comp,keys) \
PVOID comp##ControlBlock = INVALID_HANDLE_VALUE; \
DWORD comp##InfoLevel; \
PDEBUG_KEY comp##__DebugKeys = keys; \
void comp##DebugPrint( \
ULONG Mask, \
CHAR * Format, \
... ) \
{ \
va_list ArgList; \
va_start(ArgList, Format); \
if (comp##ControlBlock == INVALID_HANDLE_VALUE) \
{ \
_InitDebug(DSYSDBG_DEMAND_OPEN, & comp##InfoLevel, & comp##ControlBlock, #comp, comp##__DebugKeys); \
} \
_DebugOut( comp##ControlBlock, Mask, Format, ArgList); \
} \
void \
comp##InitDebugEx(DWORD Flags, PDEBUG_KEY pKey) \
{ \
comp##__DebugKeys = pKey; \
_InitDebug(Flags, & comp##InfoLevel, & comp##ControlBlock, #comp, pKey); \
} \
void \
comp##InitDebug(PDEBUG_KEY pKey) \
{ \
_InitDebug(DSYSDBG_DEMAND_OPEN, & comp##InfoLevel, & comp##ControlBlock, #comp, pKey); \
} \
void \
comp##UnloadDebug(void) \
{ \
_UnloadDebug( comp##ControlBlock ); \
}
#else // NOT DEBUG_SUPPORT
//
// Empty defines for the retail case:
//
#define DECLARE_DEBUG2(comp)
#define DEFINE_DEBUG2(comp)
#define DEFINE_DEBUG_DEFER(x, y)
#endif // DEBUG_SUPPORT
#if DBG
//
// Moved assertions to new section, so no asserts occur in retail builds
// with DEBUG_SUPPORT.
//
// Assertions: Most should use DsysAssert or DsysAssertMsg. These forward on
// the call to dsysdbg.lib, with the continue code set to drop into the
// debugger. The more sophisticated can call DsysAssertEx, which allows you
// to specify one of the assert codes from above:
//
#define DsysAssertEx(exp, ContinueCode) \
if (!(exp)) \
_DsysAssertEx( #exp, __FILE__, __LINE__, NULL, ContinueCode);
#define DsysAssertMsgEx(exp, Message, ContinueCode) \
if (!(exp)) \
_DsysAssertEx( #exp, __FILE__, __LINE__, Message, ContinueCode);
#define DsysAssertMsg(exp, Message) DsysAssertMsgEx(exp, Message, DSYSDBG_ASSERT_DEBUGGER)
#define DsysAssert(exp) DsysAssertMsgEx(exp, NULL, DSYSDBG_ASSERT_DEBUGGER)
#define DsysException(p) DbgpDumpException(p)
#define SZ_DEFAULT_PROFILE_STRING "Error"
#else // retail builds cannot contain asserts...
#define DsysAssertEx(x,y)
#define DsysAssertMsgEx(x, y, z)
#define DsysAssert(x)
#define DsysAssertMsg(x, y)
#define DsysException(p)
#define SZ_DEFAULT_PROFILE_STRING ""
#endif // dbg
#ifndef DEB_ERROR
#define DEB_ERROR 0x00000001
#endif
#ifndef DEB_WARN
#define DEB_WARN 0x00000002
#endif
#ifndef DEB_TRACE
#define DEB_TRACE 0x00000004
#endif
#define DSYSDBG_FORCE 0x80000000
#define DSYSDBG_CLEAN 0x40000000
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // __DSYSDBG_H__