[REACTOS]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 6 Jan 2013 23:29:05 +0000 (23:29 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 6 Jan 2013 23:29:05 +0000 (23:29 +0000)
- 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

index 233cff2..52fd684 100644 (file)
@@ -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))