/** * @brief Terminates the current thread. * @param[in] status the exit status. * @note This routine causes a small memory leak, * because it doesn't deallocate the initial stack. * On the other hand, such deallocation seems to be * not easy and even if we'll find a proper solution * for, let's say XP, we cannot guarantee its work * on other systems. */ void winx_exit_thread(NTSTATUS status) { NTSTATUS s = ZwTerminateThread(NtCurrentThread(),status); if(!NT_SUCCESS(s)){ strace(s,"cannot terminate thread"); } }
VOID RtlAssert( IN PVOID FailedAssertion, IN PVOID FileName, IN ULONG LineNumber, IN PCHAR Message OPTIONAL ) { #if DBG || RTL_ASSERT_ALWAYS_ENABLED char Response[ 2 ]; CONTEXT Context; #ifndef BLDR_KERNEL_RUNTIME RtlCaptureContext( &Context ); #endif while (TRUE) { DbgPrint( "\n*** Assertion failed: %s%s\n*** Source File: %s, line %ld\n\n", Message ? Message : "", FailedAssertion, FileName, LineNumber ); DbgPrompt( "Break, Ignore, Terminate Process or Terminate Thread (bipt)? ", Response, sizeof( Response ) ); switch (Response[0]) { case 'B': case 'b': DbgPrint( "Execute '!cxr %p' to dump context\n", &Context); DbgBreakPoint(); break; case 'I': case 'i': return; case 'P': case 'p': ZwTerminateProcess( NtCurrentProcess(), STATUS_UNSUCCESSFUL ); break; case 'T': case 't': ZwTerminateThread( NtCurrentThread(), STATUS_UNSUCCESSFUL ); break; } } DbgBreakPoint(); ZwTerminateProcess( NtCurrentProcess(), STATUS_UNSUCCESSFUL ); #endif }
/* * @implemented */ VOID NTAPI RtlAssert(IN PVOID FailedAssertion, IN PVOID FileName, IN ULONG LineNumber, IN PCHAR Message OPTIONAL) { CHAR Action[2]; CONTEXT Context; /* Capture caller's context for the debugger */ RtlCaptureContext(&Context); /* Enter prompt loop */ for (;;) { /* Print the assertion */ DbgPrint("\n*** Assertion failed: %s%s\n" "*** Source File: %s, line %lu\n\n", Message != NULL ? Message : "", (PSTR)FailedAssertion, (PSTR)FileName, LineNumber); /* Prompt for action */ DbgPrompt("Break repeatedly, break Once, Ignore," " terminate Process or terminate Thread (boipt)? ", Action, sizeof(Action)); switch (Action[0]) { /* Break repeatedly */ case 'B': case 'b': /* Do a breakpoint, then prompt again */ DbgPrint("Execute '.cxr %p' to dump context\n", &Context); DbgBreakPoint(); break; /* Ignore */ case 'I': case 'i': /* Return to caller */ return; /* Break once */ case 'O': case 'o': /* Do a breakpoint and return */ DbgPrint("Execute '.cxr %p' to dump context\n", &Context); DbgBreakPoint(); return; /* Terminate process*/ case 'P': case 'p': /* Terminate us */ ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL); break; /* Terminate thread */ case 'T': case 't': /* Terminate us */ ZwTerminateThread(ZwCurrentThread(), STATUS_UNSUCCESSFUL); break; /* Unrecognized */ default: /* Prompt again */ break; } } /* Shouldn't get here */ DbgBreakPoint(); ZwTerminateProcess(ZwCurrentProcess(), STATUS_UNSUCCESSFUL); }