Author: hbelusca Date: Sun Jan 6 23:29:05 2013 New Revision: 58135
URL: http://svn.reactos.org/svn/reactos?rev=58135&view=rev Log: [REACTOS] - Fix the debugging macros I've introduced in r58132; in particular do not use while(true); for forbidding the user to continue execution, but instead raise an exception with EXCEPTION_NONCONTINUABLE flag (included when called RtlRaiseStatus). - Adjust the definition of RtlRaiseStatus (in kernel-mode it is ExRaiseStatus which is used).
Modified: trunk/reactos/include/reactos/debug.h
Modified: trunk/reactos/include/reactos/debug.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/debug.h?rev... ============================================================================== --- trunk/reactos/include/reactos/debug.h [iso-8859-1] (original) +++ trunk/reactos/include/reactos/debug.h [iso-8859-1] Sun Jan 6 23:29:05 2013 @@ -15,7 +15,7 @@ #ifndef __INTERNAL_DEBUG #define __INTERNAL_DEBUG
-/* Define DbgPrint/DbgPrintEx/RtlAssert unless the NDK is used */ +/* Define DbgPrint/DbgPrintEx/RtlAssert/RtlRaiseStatus unless the NDK is used */ #if !defined(_RTLFUNCS_H) && !defined(_NTDDK_)
/* Make sure we have basic types (some people include us *before* SDK)... */ @@ -51,7 +51,27 @@ PCHAR Message );
+#ifndef _NTDEF_ /* Guard against redefinition from ntdef.h */ + typedef _Return_type_success_(return >= 0) LONG NTSTATUS; +#endif +__analysis_noreturn +NTSYSAPI +VOID +NTAPI +RtlRaiseStatus( + _In_ NTSTATUS Status +); + #endif /* !defined(_RTLFUNCS_H) && !defined(_NTDDK_) */ + + +/* Fix usage of RtlRaiseStatus */ +#if !defined(_RTLFUNCS_H) && defined(_NTDDK_) + #define RaiseStatus ExRaiseStatus +#else + #define RaiseStatus RtlRaiseStatus +#endif /* !defined(_RTLFUNCS_H) && defined(_NTDDK_) */ +
#ifndef assert #ifndef NASSERT @@ -136,11 +156,7 @@
#endif /* not DBG */
-/* - * These macros are designed to display an optional printf-like - * user-defined message and to break into the debugger. - * After that they allow to continue the program execution. - */ +/******************************************************************************/ /* For internal purposes only */ #define __ERROR_DBGBREAK(...) \ do { \ @@ -148,6 +164,18 @@ DbgBreakPoint(); \ } while (0)
+/* For internal purposes only */ +#define __ERROR_FATAL(Status, ...) \ +do { \ + DbgPrint("" __VA_ARGS__); \ + RaiseStatus((Status)); \ +} while (0) + +/* + * These macros are designed to display an optional printf-like + * user-defined message and to break into the debugger. + * After that they allow to continue the program execution. + */ #define ERROR_DBGBREAK(...) \ do { \ __NOTICE(ERROR, "\n"); \ @@ -165,19 +193,18 @@ * user-defined message and to break into the debugger. * After that they halt the execution of the current thread. */ -#define ERROR_FATAL(...) \ -do { \ - __NOTICE(UNRECOVERABLE ERROR, "\n"); \ - __ERROR_DBGBREAK(__VA_ARGS__); \ - while (TRUE); \ +#define ERROR_FATAL(...) \ +do { \ + __NOTICE(UNRECOVERABLE ERROR, "\n"); \ + __ERROR_FATAL(STATUS_ASSERTION_FAILURE, __VA_ARGS__); \ } while (0)
#define UNIMPLEMENTED_FATAL(...) \ do { \ __NOTICE(UNRECOVERABLE ERROR, "is UNIMPLEMENTED!\n"); \ - __ERROR_DBGBREAK(__VA_ARGS__); \ - while (TRUE); \ -} while (0) + __ERROR_FATAL(STATUS_NOT_IMPLEMENTED, __VA_ARGS__); \ +} while (0) +/******************************************************************************/
#define ASSERT_IRQL_LESS_OR_EQUAL(x) ASSERT(KeGetCurrentIrql()<=(x)) #define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql()==(x))