3 * Copyright (C) 1998, 1999, 2000, 2001, 2002 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * PROJECT: ReactOS kernel
22 * FILE: ntoskrnl/ke/bug.c
23 * PURPOSE: Graceful system shutdown if a bug is detected
24 * PROGRAMMER: David Welch (welch@cwcom.net)
25 * PORTABILITY: Unchecked
28 * Phillip Susi: 12/8/99: Minor fix
31 /* INCLUDES *****************************************************************/
33 #include <ddk/ntddk.h>
34 #include <internal/ke.h>
35 #include <internal/ps.h>
37 #include <internal/debug.h>
39 /* GLOBALS ******************************************************************/
41 static LIST_ENTRY BugcheckCallbackListHead = {NULL,NULL};
42 static ULONG InBugCheck;
44 VOID PsDumpThreads(VOID);
46 /* FUNCTIONS *****************************************************************/
49 KeInitializeBugCheck(VOID)
51 InitializeListHead(&BugcheckCallbackListHead);
56 KeDeregisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
62 KeRegisterBugCheckCallback(PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
63 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
68 InsertTailList(&BugcheckCallbackListHead, &CallbackRecord->Entry);
69 CallbackRecord->Length = Length;
70 CallbackRecord->Buffer = Buffer;
71 CallbackRecord->Component = Component;
72 CallbackRecord->CallbackRoutine = CallbackRoutine;
77 KeBugCheckWithTf(ULONG BugCheckCode,
78 ULONG BugCheckParameter1,
79 ULONG BugCheckParameter2,
80 ULONG BugCheckParameter3,
81 ULONG BugCheckParameter4,
85 KeRaiseIrql(HIGH_LEVEL, &oldIrql);
86 DbgPrint("Bug detected code: 0x%X\n", BugCheckCode);
87 KiDumpTrapFrame(Tf, BugCheckParameter1, BugCheckParameter2);
88 MmDumpToPagingFile(BugCheckCode, BugCheckParameter1,
89 BugCheckParameter2, BugCheckParameter3,
90 BugCheckParameter4, Tf);
95 KeBugCheckEx(ULONG BugCheckCode,
96 ULONG BugCheckParameter1,
97 ULONG BugCheckParameter2,
98 ULONG BugCheckParameter3,
99 ULONG BugCheckParameter4)
101 * FUNCTION: Brings the system down in a controlled manner when an
102 * inconsistency that might otherwise cause corruption has been detected
104 * BugCheckCode = Specifies the reason for the bug check
105 * BugCheckParameter[1-4] = Additional information about bug
109 PRTL_MESSAGE_RESOURCE_ENTRY Message;
113 DbgPrint("Bug detected (code %x param %x %x %x %x)\n",
120 Status = RtlFindMessage((PVOID)KERNEL_BASE, //0xC0000000,
121 11, //RT_MESSAGETABLE,
125 if (NT_SUCCESS(Status))
127 if (Message->Flags == 0)
128 DbgPrint(" %s\n", Message->Text);
130 DbgPrint(" %S\n", (PWSTR)Message->Text);
134 DbgPrint(" No message text found!\n\n");
139 DbgPrint("Recursive bug check halting now\n");
146 if (PsGetCurrentProcess() != NULL)
148 DbgPrint("Pid: %x <", PsGetCurrentProcess()->UniqueProcessId);
149 DbgPrint("%.8s> ", PsGetCurrentProcess()->ImageFileName);
151 if (PsGetCurrentThread() != NULL)
153 DbgPrint("Thrd: %x Tid: %x\n",
154 PsGetCurrentThread(),
155 PsGetCurrentThread()->Cid.UniqueThread);
157 KeDumpStackFrames((PULONG)__builtin_frame_address(0));
158 MmDumpToPagingFile(BugCheckCode, BugCheckParameter1,
159 BugCheckParameter2, BugCheckParameter3,
160 BugCheckParameter4, NULL);
162 if (KdDebuggerEnabled)
172 KeBugCheck(ULONG BugCheckCode)
174 * FUNCTION: Brings the system down in a controlled manner when an
175 * inconsistency that might otherwise cause corruption has been detected
177 * BugCheckCode = Specifies the reason for the bug check
181 KeBugCheckEx(BugCheckCode, 0, 0, 0, 0);