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 %lu\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 } 100