30static void resolveStopCode(
char** s, uint64_t stopcode) {
33 *s =
"DIVIDE_BY_ZERO";
39 *s =
"NON_MASKABLE_INTERRUPT";
51 *s =
"INVALID_OPCODE";
54 *s =
"NO_COPROCESSOR";
60 *s =
"COPROCESSOR_SEGMENT_OVERRUN";
66 *s =
"SEGMENT_SELECTOR_NOTPRESENT";
69 *s =
"STACK_SEGMENT_OVERRUN";
72 *s =
"GENERAL_PROTECTION_FAULT";
81 *s =
"FLOATING_POINT_ERROR";
84 *s =
"ALIGNMENT_CHECK";
87 *s =
"SEVERE_MACHINE_CHECK";
90 *s =
"MEMORY_MAP_SIZE_OVERRUN";
93 *s =
"MANUALLY_INITIATED_CRASH";
99 *s =
"BLOCK_DEVICE_LIMIT_REACHED";
102 *s =
"NULL_POINTER_DEREFERENCE";
105 *s =
"FILESYSTEM_PANIC";
108 *s =
"UNABLE_TO_INIT_TRACELASTFUNC";
111 *s =
"FRAME_LIMIT_REACHED";
114 *s =
"IRQL_NOT_LESS_OR_EQUAL";
117 *s =
"INVALID_IRQL_SUPPLIED";
120 *s =
"NULL_CTX_RECEIVED";
123 *s =
"THREAD_EXIT_FAILURE";
126 *s =
"BAD_AHCI_COUNT";
129 *s =
"AHCI_INIT_FAILED";
132 *s =
"MEMORY_LIMIT_REACHED";
135 *s =
"HEAP_ALLOCATION_FAILED";
141 *s =
"FATAL_IRQL_CORRUPTION";
144 *s =
"THREAD_ID_CREATION_FAILURE";
147 *s =
"ASSERTION_FAILURE";
150 *s =
"FRAME_ALLOCATION_FAILED";
153 *s =
"FRAME_BITMAP_CREATION_FAILURE";
156 *s =
"MEMORY_INVALID_FREE";
159 *s =
"MEMORY_CORRUPT_HEADER";
162 *s =
"MEMORY_DOUBLE_FREE";
165 *s =
"MEMORY_CORRUPT_FOOTER";
168 *s =
"GUARD_PAGE_DEREFERENCE";
171 *s =
"IRQL_NOT_GREATER_OR_EQUAL";
174 *s =
"KERNEL_STACK_OVERFLOWN";
177 *s =
"BAD_POOL_CALLER";
180 *s =
"KMODE_EXCEPTION_NOT_HANDLED";
183 *s =
"ATTEMPTED_SWITCH_FROM_DPC";
186 *s =
"ATTEMPTED_WRITE_TO_READONLY_MEMORY";
189 *s =
"PSMGR_INIT_FAILED";
192 *s =
"PAGE_FAULT_IN_FREED_NONPAGED_POOL";
195 *s =
"PAGE_FAULT_IN_FREED_PAGED_POOL";
198 *s =
"PSWORKER_INIT_FAILED";
201 *s =
"MANUALLY_INITIATED_CRASH2";
204 *s =
"DPC_NOT_INITIALIZED";
207 *s =
"INVALID_PROCESS_ATTACH_ATTEMPT";
210 *s =
"ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY";
213 *s =
"UNKNOWN_BUGCHECK_CODE";
247 IN void* BugCheckParameter1,
248 IN void* BugCheckParameter2,
249 IN void* BugCheckParameter3,
250 IN void* BugCheckParameter4
306 gop_printf(0xFFFFFFFF,
"FATAL ERROR: Your system has encountered a fatal error.\n\n");
307 gop_printf(0xFFFFFFFF,
"Your system has been stopped for safety.\n\n");
308 char* stopCodeToStr =
"";
309 resolveStopCode(&stopCodeToStr, BugCheckCode);
312 gop_printf(0xFF00FF00,
" (numerical: %d)**\n", BugCheckCode);
322 (
char*)BugCheckParameter1,
323 (
char*)BugCheckParameter2,
324 (
char*)BugCheckParameter3,
325 (
long long)(intptr_t)BugCheckParameter4);
331 "Parameter 1: (Pointer: %p | Decimal: %lld | Pure Hex: %llx)\n"
332 "Parameter 2: (Pointer: %p | Decimal: %lld | Pure Hex: %llx)\n"
333 "Parameter 3: (Pointer: %p | Decimal: %lld | Pure Hex: %llx)\n"
334 "Parameter 4: (Pointer: %p | Decimal: %lld | Pure Hex: %llx)\n",
335 (
void*)(uintptr_t)BugCheckParameter1, (
long long)(intptr_t)BugCheckParameter1, (
unsigned long long)(uintptr_t)BugCheckParameter1,
336 (
void*)(uintptr_t)BugCheckParameter2, (
long long)(intptr_t)BugCheckParameter2, (
unsigned long long)(uintptr_t)BugCheckParameter2,
337 (
void*)(uintptr_t)BugCheckParameter3, (
long long)(intptr_t)BugCheckParameter3, (
unsigned long long)(uintptr_t)BugCheckParameter3,
338 (
void*)(uintptr_t)BugCheckParameter4, (
long long)(intptr_t)BugCheckParameter4, (
unsigned long long)(uintptr_t)BugCheckParameter4);
344 gop_printf(0xFFFFA500,
"**Last IRQL: %d**\n", recordedIrql);
348 gop_printf(0xFFFFFF00,
"Current Thread ID: %d\n", currTid);
360 uintptr_t StackLimit = StackBase - StackSize;
362 gop_printf(
COLOR_WHITE,
"Thread Stack Range | %p - %p | Last saved top: %p\n", (
void*)StackLimit, (
void*)StackBase, (
void*)ThreadTop);
FORCEINLINE bool InterlockedExchangeBool(volatile bool *target, bool value)
NORETURN void MeBugCheck(IN enum _BUGCHECK_CODES BugCheckCode)
NORETURN void MeBugCheckEx(IN enum _BUGCHECK_CODES BugCheckCode, IN void *BugCheckParameter1, IN void *BugCheckParameter2, IN void *BugCheckParameter3, IN void *BugCheckParameter4)
struct _GOP_PARAMS GOP_PARAMS
void MgAcquireExclusiveGopOwnerShip(void)
void gop_printf(uint32_t color, const char *fmt,...)
void gop_clear_screen(GOP_PARAMS *gop, uint32_t color)
FORCEINLINE void __pause(void)
FORCEINLINE uint64_t __read_rsp(void)
FORCEINLINE void __hlt(void)
FORCEINLINE void __cli(void)
FORCEINLINE uint64_t __read_cr3(void)
void _MeSetIrql(IN IRQL NewIrql)
@ MANUALLY_INITIATED_CRASH
@ NULL_POINTER_DEREFERENCE
@ ATTEMPTED_WRITE_TO_READONLY_MEMORY
@ COPROCESSOR_SEGMENT_OVERRUN
@ PAGE_FAULT_IN_FREED_NONPAGED_POOL
@ IRQL_NOT_GREATER_OR_EQUAL
@ MEMORY_MAP_SIZE_OVERRUN
Custom ones.
@ ATTEMPTED_SWITCH_FROM_DPC
@ KMODE_EXCEPTION_NOT_HANDLED
@ BLOCK_DEVICE_LIMIT_REACHED
@ FRAME_BITMAP_CREATION_FAILURE
@ FRAME_ALLOCATION_FAILED
@ UNABLE_TO_INIT_TRACELASTFUNC
@ THREAD_ID_CREATION_FAILURE
@ PAGE_FAULT_IN_FREED_PAGED_POOL
@ MANUALLY_INITIATED_CRASH2
@ GENERAL_PROTECTION_FAULT
@ ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY
@ SEGMENT_SELECTOR_NOTPRESENT
@ INVALID_PROCESS_ATTACH_ATTEMPT
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
FORCEINLINE PRIVILEGE_MODE MeGetPreviousMode(void)
struct _IPI_PARAMS IPI_PARAMS
#define MI_LARGE_STACK_SIZE
void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter)
struct _ITHREAD InternalThread
struct _TRAP_FRAME TrapRegisters
struct _ITHREAD * currentThread
PETHREAD PsGetCurrentThread(void)