Merge 14551:14980 from trunk
[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
112 (*PKDP_INIT_ROUTINE)(struct _KD_DISPATCH_TABLE *DispatchTable,
113 ULONG BootPhase);
114
115 typedef
116 VOID
117 STDCALL
118 (*PKDP_PRINT_ROUTINE)(PCH String);
119
120 typedef
121 VOID
122 STDCALL
123 (*PKDP_PROMPT_ROUTINE)(PCH String);
124
125 typedef
126 KD_CONTINUE_TYPE
127 STDCALL
128 (*PKDP_EXCEPTION_ROUTINE)(PEXCEPTION_RECORD ExceptionRecord,
129 PCONTEXT Context,
130 PKTRAP_FRAME TrapFrame);
131
132 /* INIT ROUTINES *************************************************************/
133
134 VOID
135 STDCALL
136 KdpScreenInit(struct _KD_DISPATCH_TABLE *DispatchTable,
137 ULONG BootPhase);
138
139 VOID
140 STDCALL
141 KdpSerialInit(struct _KD_DISPATCH_TABLE *DispatchTable,
142 ULONG BootPhase);
143
144 VOID
145 STDCALL
146 KdpInitDebugLog(struct _KD_DISPATCH_TABLE *DispatchTable,
147 ULONG BootPhase);
148
149 /* KD ROUTINES ***************************************************************/
150
151 KD_CONTINUE_TYPE
152 STDCALL
153 KdpEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
154 KPROCESSOR_MODE PreviousMode,
155 PCONTEXT Context,
156 PKTRAP_FRAME TrapFrame,
157 BOOLEAN FirstChance,
158 BOOLEAN Gdb);
159
160 ULONG
161 STDCALL
162 KdpPrintString(PANSI_STRING String);
163
164 BOOLEAN
165 STDCALL
166 KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
167
168 /* KD GLOBALS ***************************************************************/
169
170 /* serial debug connection */
171 #define DEFAULT_DEBUG_PORT 2 /* COM2 */
172 #define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */
173 #define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */
174 #define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
175
176 /* KD Native Modes */
177 #define KdScreen 0
178 #define KdSerial 1
179 #define KdFile 2
180 #define KdMax 3
181
182 /* KD Private Debug Modes */
183 typedef struct _KDP_DEBUG_MODE
184 {
185 union {
186 struct {
187 /* Native Modes */
188 UCHAR Screen :1;
189 UCHAR Serial :1;
190 UCHAR File :1;
191
192 /* Currently Supported Wrappers */
193 UCHAR Pice :1;
194 UCHAR Gdb :1;
195 UCHAR Bochs :1;
196 };
197
198 /* Generic Value */
199 ULONG Value;
200 };
201 } KDP_DEBUG_MODE;
202
203 /* KD Internal Debug Services */
204 typedef enum _KDP_DEBUG_SERVICE
205 {
206 DumpNonPagedPool = 0x1e, /* a */
207 ManualBugCheck = 0x30, /* b */
208 DumpNonPagedPoolStats = 0x2e, /* c */
209 DumpNewNonPagedPool = 0x20, /* d */
210 DumpNewNonPagedPoolStats = 0x12, /* e */
211 DumpAllThreads = 0x21, /* f */
212 DumpUserThreads = 0x22, /* g */
213 KdSpare1 = 0x23, /* h */
214 KdSpare2 = 0x17, /* i */
215 KdSpare3 = 0x24, /* j */
216 EnterDebugger = 0x25 /* k */
217 } KDP_DEBUG_SERVICE;
218
219 /* Dispatch Table for Wrapper Functions */
220 typedef struct _KD_DISPATCH_TABLE
221 {
222 LIST_ENTRY KdProvidersList;
223 PKDP_INIT_ROUTINE KdpInitRoutine;
224 PKDP_PRINT_ROUTINE KdpPrintRoutine;
225 PKDP_PROMPT_ROUTINE KdpPromptRoutine;
226 PKDP_EXCEPTION_ROUTINE KdpExceptionRoutine;
227 } KD_DISPATCH_TABLE, *PKD_DISPATCH_TABLE;
228
229 /* The current Debugging Mode */
230 extern KDP_DEBUG_MODE KdpDebugMode;
231
232 /* The current Port IRQ */
233 extern ULONG KdpPortIrq;
234
235 /* The current Port */
236 extern ULONG KdpPort;
237
238 /* Port Information for the Serial Native Mode */
239 extern KD_PORT_INFORMATION SerialPortInfo;
240
241 /* Init Functions for Native Providers */
242 extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
243
244 /* Wrapper Init Function */
245 extern PKDP_INIT_ROUTINE WrapperInitRoutine;
246
247 /* Dispatch Tables for Native Providers */
248 extern KD_DISPATCH_TABLE DispatchTable[KdMax];
249
250 /* Dispatch Table for the Wrapper */
251 extern KD_DISPATCH_TABLE WrapperTable;
252
253 /* The KD Native Provider List */
254 extern LIST_ENTRY KdProviders;
255
256 #endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */