* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Run-Time Library
* PURPOSE: Implements RtlAssert used by the ASSERT
* and ASSERTMSG debugging macros
* FILE: lib/rtl/assert.c
* PROGRAMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
*/
#include <rtl.h>
#define NDEBUG
#include <debug.h>
* @implemented
*/
VOID
NTAPI
RtlAssert(IN PVOID FailedAssertion,
IN PVOID FileName,
IN ULONG LineNumber,
IN PCHAR Message OPTIONAL)
{
CHAR Action[2];
CONTEXT Context;
RtlCaptureContext(&Context);
for (;;)
{
DbgPrint("\n*** Assertion failed: %s%s\n"
"*** Source File: %s, line %lu\n\n",
Message != NULL ? Message : "",
(PSTR)FailedAssertion,
(PSTR)FileName,
LineNumber);
if (RtlGetNtGlobalFlags() & FLG_DISABLE_DEBUG_PROMPTS)
{
RtlRaiseStatus(STATUS_ASSERTION_FAILURE);
}
DbgPrompt("Break repeatedly, break Once, Ignore, "
"terminate Process or terminate Thread (boipt)? ",
Action,
sizeof(Action));
switch (Action[0])
{
case 'B': case 'b':
case 'O': case 'o':
DbgPrint("Execute '.cxr %p' to dump context\n", &Context);
DbgBreakPoint();
if ((Action[0] == 'B') || (Action[0] == 'b'))
break;
case 'I': case 'i':
return;
case 'P': case 'p':
ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL);
break;
case 'T': case 't':
ZwTerminateThread(ZwCurrentThread(), STATUS_UNSUCCESSFUL);
break;
default:
break;
}
}
DbgBreakPoint();
ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL);
}