bba011535905310877d1f0455faed497369ffb24
[reactos.git] / reactos / ntoskrnl / include / internal / kd.h
1 /* $Id$
2 *
3 * kernel debugger prototypes
4 */
5
6 #ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
7 #define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H
8
9 #include <internal/ke.h>
10 #include <internal/ldr.h>
11 #include <ntdll/ldr.h>
12
13 struct _KD_DISPATCH_TABLE;
14 #define KdPrintEx(_x_) DbgPrintEx _x_
15
16 #ifdef DBG
17 #include "kdgdb.h"
18 #include "kdbochs.h"
19 #endif
20
21 /* SYMBOL ROUTINES **********************************************************/
22
23 #if defined(KDBG) || defined(DBG)
24
25 VOID
26 KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule);
27
28 VOID
29 KdbSymFreeProcessSymbols(IN PEPROCESS Process);
30
31 VOID
32 KdbSymLoadDriverSymbols(IN PUNICODE_STRING Filename,
33 IN PMODULE_OBJECT Module);
34
35 VOID
36 KdbSymUnloadDriverSymbols(IN PMODULE_OBJECT ModuleObject);
37
38 VOID
39 KdbSymProcessBootSymbols(IN PCHAR FileName);
40
41 VOID
42 KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection,
43 IN PMODULE_TEXT_SECTION LdrHalTextSection);
44
45 BOOLEAN
46 KdbSymPrintAddress(IN PVOID Address);
47
48 VOID
49 KdbDeleteProcessHook(IN PEPROCESS Process);
50
51 NTSTATUS
52 KdbSymGetAddressInformation(IN PROSSYM_INFO RosSymInfo,
53 IN ULONG_PTR RelativeAddress,
54 OUT PULONG LineNumber OPTIONAL,
55 OUT PCH FileName OPTIONAL,
56 OUT PCH FunctionName OPTIONAL);
57
58 typedef struct _KDB_MODULE_INFO
59 {
60 WCHAR Name[256];
61 ULONG_PTR Base;
62 ULONG Size;
63 PROSSYM_INFO RosSymInfo;
64 } KDB_MODULE_INFO, *PKDB_MODULE_INFO;
65
66 /* MACROS FOR NON-KDBG BUILDS ************************************************/
67
68 # define KDB_LOADUSERMODULE_HOOK(LDRMOD) KdbSymLoadUserModuleSymbols(LDRMOD)
69 # define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE)
70 # define KDB_UNLOADDRIVER_HOOK(MODULE) KdbSymUnloadDriverSymbols(MODULE)
71 # define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbSymInit(NTOS, HAL)
72 # define KDB_SYMBOLFILE_HOOK(FILENAME) KdbSymProcessBootSymbols(FILENAME)
73 #else
74 # define KDB_LOADUSERMODULE_HOOK(LDRMOD) do { } while (0)
75 # define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0)
76 # define KDB_UNLOADDRIVER_HOOK(MODULE) do { } while (0)
77 # define KDB_LOADERINIT_HOOK(NTOS, HAL) do { } while (0)
78 # define KDB_SYMBOLFILE_HOOK(FILENAME) do { } while (0)
79 # define KDB_CREATE_THREAD_HOOK(CONTEXT) do { } while (0)
80 #endif
81
82 #if defined(KDBG) || defined(DBG)
83 # define KeRosPrintAddress(ADDRESS) KdbSymPrintAddress(ADDRESS)
84 #else
85 # define KeRosPrintAddress(ADDRESS) KiRosPrintAddress(ADDRESS)
86 #endif
87
88 #ifdef KDBG
89 # define KdbInit() KdbpCliInit()
90 # define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME)
91 # define KDB_DELETEPROCESS_HOOK(PROCESS) KdbDeleteProcessHook(PROCESS)
92 #else
93 # define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException
94 # define KdbInit() do { } while (0)
95 # define KdbEnter() do { } while (0)
96 # define KdbModuleLoaded(X) do { } while (0)
97 # define KDB_DELETEPROCESS_HOOK(PROCESS) do { } while (0)
98 #endif
99
100 /* KD ROUTINES ***************************************************************/
101
102 typedef enum _KD_CONTINUE_TYPE
103 {
104 kdContinue = 0,
105 kdDoNotHandleException,
106 kdHandleException
107 } KD_CONTINUE_TYPE;
108
109 typedef
110 VOID
111 (STDCALL*PKDP_INIT_ROUTINE)(struct _KD_DISPATCH_TABLE *DispatchTable,
112 ULONG BootPhase);
113
114 typedef
115 VOID
116 (STDCALL*PKDP_PRINT_ROUTINE)(PCH String);
117
118 typedef
119 VOID
120 (STDCALL*PKDP_PROMPT_ROUTINE)(PCH String);
121
122 typedef
123 KD_CONTINUE_TYPE
124 (STDCALL*PKDP_EXCEPTION_ROUTINE)(PEXCEPTION_RECORD ExceptionRecord,
125 PCONTEXT Context,
126 PKTRAP_FRAME TrapFrame);
127
128 /* INIT ROUTINES *************************************************************/
129
130 VOID
131 STDCALL
132 KdpScreenInit(struct _KD_DISPATCH_TABLE *DispatchTable,
133 ULONG BootPhase);
134
135 VOID
136 STDCALL
137 KdpSerialInit(struct _KD_DISPATCH_TABLE *DispatchTable,
138 ULONG BootPhase);
139
140 VOID
141 STDCALL
142 KdpInitDebugLog(struct _KD_DISPATCH_TABLE *DispatchTable,
143 ULONG BootPhase);
144
145 /* KD ROUTINES ***************************************************************/
146
147 KD_CONTINUE_TYPE
148 STDCALL
149 KdpEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
150 KPROCESSOR_MODE PreviousMode,
151 PCONTEXT Context,
152 PKTRAP_FRAME TrapFrame,
153 BOOLEAN FirstChance,
154 BOOLEAN Gdb);
155
156 ULONG
157 STDCALL
158 KdpPrintString(PANSI_STRING String);
159
160 BOOLEAN
161 STDCALL
162 KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
163
164 /* KD GLOBALS ***************************************************************/
165
166 /* serial debug connection */
167 #define DEFAULT_DEBUG_PORT 2 /* COM2 */
168 #define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */
169 #define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */
170 #define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
171
172 /* KD Native Modes */
173 #define KdScreen 0
174 #define KdSerial 1
175 #define KdFile 2
176 #define KdMax 3
177
178 /* KD Private Debug Modes */
179 typedef struct _KDP_DEBUG_MODE
180 {
181 union {
182 struct {
183 /* Native Modes */
184 UCHAR Screen :1;
185 UCHAR Serial :1;
186 UCHAR File :1;
187
188 /* Currently Supported Wrappers */
189 UCHAR Pice :1;
190 UCHAR Gdb :1;
191 UCHAR Bochs :1;
192 };
193
194 /* Generic Value */
195 ULONG Value;
196 };
197 } KDP_DEBUG_MODE;
198
199 /* KD Internal Debug Services */
200 typedef enum _KDP_DEBUG_SERVICE
201 {
202 DumpNonPagedPool = 0x1e, /* a */
203 ManualBugCheck = 0x30, /* b */
204 DumpNonPagedPoolStats = 0x2e, /* c */
205 DumpNewNonPagedPool = 0x20, /* d */
206 DumpNewNonPagedPoolStats = 0x12, /* e */
207 DumpAllThreads = 0x21, /* f */
208 DumpUserThreads = 0x22, /* g */
209 KdSpare1 = 0x23, /* h */
210 KdSpare2 = 0x17, /* i */
211 KdSpare3 = 0x24, /* j */
212 EnterDebugger = 0x25 /* k */
213 } KDP_DEBUG_SERVICE;
214
215 /* Dispatch Table for Wrapper Functions */
216 typedef struct _KD_DISPATCH_TABLE
217 {
218 LIST_ENTRY KdProvidersList;
219 PKDP_INIT_ROUTINE KdpInitRoutine;
220 PKDP_PRINT_ROUTINE KdpPrintRoutine;
221 PKDP_PROMPT_ROUTINE KdpPromptRoutine;
222 PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine;
223 } KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
224
225 /* The current Debugging Mode */
226 extern KDP_DEBUG_MODE KdpDebugMode;
227
228 /* The current Port IRQ */
229 extern ULONG KdpPortIrq;
230
231 /* The current Port */
232 extern ULONG KdpPort;
233
234 /* Port Information for the Serial Native Mode */
235 extern KD_PORT_INFORMATION SerialPortInfo;
236
237 /* Init Functions for Native Providers */
238 extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
239
240 /* Wrapper Init Function */
241 extern PKDP_INIT_ROUTINE WrapperInitRoutine;
242
243 /* Dispatch Tables for Native Providers */
244 extern KD_DISPATCH_TABLE DispatchTable[KdMax];
245
246 /* Dispatch Table for the Wrapper */
247 extern KD_DISPATCH_TABLE WrapperTable;
248
249 /* The KD Native Provider List */
250 extern LIST_ENTRY KdProviders;
251
252 #endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */