From 959e4790c62e89b82d7a557ab0b9b3e8f7d54e93 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 6 Jan 2013 23:29:05 +0000 Subject: [PATCH] [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). svn path=/trunk/; revision=58135 --- reactos/include/reactos/debug.h | 53 +++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/reactos/include/reactos/debug.h b/reactos/include/reactos/debug.h index 233cff2793e..52fd684b31f 100644 --- a/reactos/include/reactos/debug.h +++ b/reactos/include/reactos/debug.h @@ -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,8 +51,28 @@ RtlAssert( 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 #define assert(x) if (!(x)) { RtlAssert((PVOID)#x, (PVOID)__FILE__, __LINE__, ""); } @@ -136,11 +156,7 @@ RtlAssert( #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 @@ do { \ 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 @@ do { \ * 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); \ + __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)) -- 2.17.1