Create the AHCI branch for Aman's work
[reactos.git] / sdk / lib / rtl / assert.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Run-Time Library
4 * PURPOSE: Implements RtlAssert used by the ASSERT
5 * and ASSERTMSG debugging macros
6 * FILE: lib/rtl/assert.c
7 * PROGRAMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
8 */
9
10 /* INCLUDES *****************************************************************/
11
12 #include <rtl.h>
13 #define NDEBUG
14 #include <debug.h>
15
16 /* PUBLIC FUNCTIONS **********************************************************/
17
18 /*
19 * @implemented
20 */
21 VOID
22 NTAPI
23 RtlAssert(IN PVOID FailedAssertion,
24 IN PVOID FileName,
25 IN ULONG LineNumber,
26 IN PCHAR Message OPTIONAL)
27 {
28 CHAR Action[2];
29 CONTEXT Context;
30
31 /* Capture caller's context for the debugger */
32 RtlCaptureContext(&Context);
33
34 /* Enter prompt loop */
35 for (;;)
36 {
37 /* Print the assertion */
38 DbgPrint("\n*** Assertion failed: %s%s\n"
39 "*** Source File: %s, line %ld\n\n",
40 Message != NULL ? Message : "",
41 (PSTR)FailedAssertion,
42 (PSTR)FileName,
43 LineNumber);
44
45 /* Prompt for action */
46 DbgPrompt("Break repeatedly, break Once, Ignore,"
47 " terminate Process or terminate Thread (boipt)? ",
48 Action,
49 sizeof(Action));
50 switch (Action[0])
51 {
52 /* Break repeatedly */
53 case 'B': case 'b':
54
55 /* Do a breakpoint, then prompt again */
56 DbgPrint("Execute '.cxr %p' to dump context\n", &Context);
57 DbgBreakPoint();
58 break;
59
60 /* Ignore */
61 case 'I': case 'i':
62
63 /* Return to caller */
64 return;
65
66 /* Break once */
67 case 'O': case 'o':
68
69 /* Do a breakpoint and return */
70 DbgPrint("Execute '.cxr %p' to dump context\n", &Context);
71 DbgBreakPoint();
72 return;
73
74 /* Terminate process*/
75 case 'P': case 'p':
76
77 /* Terminate us */
78 ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL);
79 break;
80
81 /* Terminate thread */
82 case 'T': case 't':
83
84 /* Terminate us */
85 ZwTerminateThread(ZwCurrentThread(), STATUS_UNSUCCESSFUL);
86 break;
87
88 /* Unrecognized */
89 default:
90
91 /* Prompt again */
92 break;
93 }
94 }
95
96 /* Shouldn't get here */
97 DbgBreakPoint();
98 ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL);
99 }