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?re…
==============================================================================
--- 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))