2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/include/internal/kd64.h
5 * PURPOSE: Internal header for the KD64 Library
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
10 // Default size of the DbgPrint log buffer
13 #define KD_DEFAULT_LOG_BUFFER_SIZE 0x8000
15 #define KD_DEFAULT_LOG_BUFFER_SIZE 0x1000
19 // Maximum supported number of breakpoints
21 #define KD_BREAKPOINT_MAX 32
24 // Highest limit starting which we consider that breakpoint addresses
25 // are either in system space, or in user space but inside shared DLLs.
27 // I'm wondering whether this can be computed using MmHighestUserAddress
28 // or whether there is already some #define somewhere else...
29 // See http://www.drdobbs.com/windows/faster-dll-load-load/184416918
30 // and http://www.drdobbs.com/rebasing-win32-dlls/184416272
31 // for a tentative explanation.
33 #define KD_HIGHEST_USER_BREAKPOINT_ADDRESS (PVOID)0x60000000 // MmHighestUserAddress
36 // Breakpoint Status Flags
38 #define KD_BREAKPOINT_ACTIVE 0x01
39 #define KD_BREAKPOINT_PENDING 0x02
40 #define KD_BREAKPOINT_SUSPENDED 0x04
41 #define KD_BREAKPOINT_EXPIRED 0x08
44 // Structure for Breakpoints
46 typedef struct _BREAKPOINT_ENTRY
49 ULONG_PTR DirectoryTableBase
;
51 KD_BREAKPOINT_TYPE Content
;
52 } BREAKPOINT_ENTRY
, *PBREAKPOINT_ENTRY
;
55 // Debug and Multi-Processor Switch Routine Definitions
59 (NTAPI
*PKDEBUG_ROUTINE
)(
60 IN PKTRAP_FRAME TrapFrame
,
61 IN PKEXCEPTION_FRAME ExceptionFrame
,
62 IN PEXCEPTION_RECORD ExceptionRecord
,
64 IN KPROCESSOR_MODE PreviousMode
,
65 IN BOOLEAN SecondChance
70 (NTAPI
*PKDEBUG_SWITCH_ROUTINE
)(
71 IN PEXCEPTION_RECORD ExceptionRecord
,
73 IN BOOLEAN SecondChance
77 // Initialization Routines
83 PLOADER_PARAMETER_BLOCK LoaderBlock
93 // Determines if the kernel debugger must handle a particular trap
98 IN PEXCEPTION_RECORD ExceptionRecord
,
100 IN KPROCESSOR_MODE PreviousMode
104 // Multi-Processor Switch Support
109 IN PEXCEPTION_RECORD ExceptionRecord
,
110 IN OUT PCONTEXT ContextRecord
,
111 IN BOOLEAN SecondChanceException
125 KdpTimeSlipDpcRoutine(
127 IN PVOID DeferredContext
,
128 IN PVOID SystemArgument1
,
129 IN PVOID SystemArgument2
133 // Debug Trap Handlers
138 IN PKTRAP_FRAME TrapFrame
,
139 IN PKEXCEPTION_FRAME ExceptionFrame
,
140 IN PEXCEPTION_RECORD ExceptionRecord
,
141 IN PCONTEXT ContextRecord
,
142 IN KPROCESSOR_MODE PreviousMode
,
143 IN BOOLEAN SecondChanceException
149 IN PKTRAP_FRAME TrapFrame
,
150 IN PKEXCEPTION_FRAME ExceptionFrame
,
151 IN PEXCEPTION_RECORD ExceptionRecord
,
152 IN PCONTEXT ContextRecord
,
153 IN KPROCESSOR_MODE PreviousMode
,
154 IN BOOLEAN SecondChanceException
174 KdpPollBreakInWithPortLock(
179 // Debugger Enter, Exit, Enable and Disable
184 IN PKTRAP_FRAME TrapFrame
,
185 IN PKEXCEPTION_FRAME ExceptionFrame
196 KdEnableDebuggerWithLock(
202 KdDisableDebuggerWithLock(
207 // Debug Event Handlers
212 IN ULONG ComponentId
,
216 IN KPROCESSOR_MODE PreviousMode
,
217 IN PKTRAP_FRAME TrapFrame
,
218 IN PKEXCEPTION_FRAME ExceptionFrame
,
225 IN LPSTR PromptString
,
226 IN USHORT PromptLength
,
227 OUT LPSTR ResponseString
,
228 IN USHORT MaximumResponseLength
,
229 IN KPROCESSOR_MODE PreviousMode
,
230 IN PKTRAP_FRAME TrapFrame
,
231 IN PKEXCEPTION_FRAME ExceptionFrame
238 IN PKD_SYMBOLS_INFO SymbolInfo
,
240 IN KPROCESSOR_MODE PreviousMode
,
241 IN PCONTEXT ContextRecord
,
242 IN PKTRAP_FRAME TrapFrame
,
243 IN PKEXCEPTION_FRAME ExceptionFrame
249 IN PSTRING NameString
,
250 IN PSTRING CommandString
,
251 IN KPROCESSOR_MODE PreviousMode
,
252 IN PCONTEXT ContextRecord
,
253 IN PKTRAP_FRAME TrapFrame
,
254 IN PKEXCEPTION_FRAME ExceptionFrame
258 // State Change Notifications
262 KdpReportLoadSymbolsStateChange(
264 IN PKD_SYMBOLS_INFO SymbolInfo
,
266 IN OUT PCONTEXT Context
271 KdpReportCommandStringStateChange(
272 IN PSTRING NameString
,
273 IN PSTRING CommandString
,
274 IN OUT PCONTEXT Context
279 KdpReportExceptionStateChange(
280 IN PEXCEPTION_RECORD ExceptionRecord
,
281 IN OUT PCONTEXT Context
,
282 IN BOOLEAN SecondChanceException
286 // Breakpoint Support
296 KdSetOwedBreakpoints(
308 KdpDeleteBreakpointRange(
315 KdpSuspendBreakPoint(
321 KdpRestoreAllBreakpoints(
327 KdpSuspendAllBreakPoints(
332 // Routine to determine if it is safe to disable the debugger
341 // Safe memory read & write Support
351 OUT PULONG ActualSize OPTIONAL
355 // Internal memory handling routines for KD isolation
360 IN PVOID Destination
,
368 IN PVOID Destination
,
373 // Low Level Support Routines for the KD API
382 IN PDBGKD_GET_VERSION64 Version
391 IN PDBGKD_MANIPULATE_STATE64 State
,
398 IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange
,
409 OUT PLARGE_INTEGER MsrValue
416 IN PLARGE_INTEGER MsrValue
425 IN ULONG BusDataType
,
431 OUT PULONG ActualLength
437 IN ULONG BusDataType
,
443 OUT PULONG ActualLength
451 KdpSysReadControlSpace(
453 IN ULONG64 BaseAddress
,
456 OUT PULONG ActualLength
461 KdpSysWriteControlSpace(
463 IN ULONG64 BaseAddress
,
466 OUT PULONG ActualLength
475 IN ULONG InterfaceType
,
477 IN ULONG AddressSpace
,
478 IN ULONG64 IoAddress
,
481 OUT PULONG ActualDataSize
487 IN ULONG InterfaceType
,
489 IN ULONG AddressSpace
,
490 IN ULONG64 IoAddress
,
493 OUT PULONG ActualDataSize
501 KdpSysCheckLowMemory(
506 // Internal routine for sending strings directly to the debugger
518 extern DBGKD_GET_VERSION64 KdVersionBlock
;
519 extern KDDEBUGGER_DATA64 KdDebuggerDataBlock
;
520 extern LIST_ENTRY KdpDebuggerDataListHead
;
521 extern KSPIN_LOCK KdpDataSpinLock
;
522 extern LARGE_INTEGER KdPerformanceCounterRate
;
523 extern LARGE_INTEGER KdTimerStart
;
524 extern ULONG KdDisableCount
;
525 extern KD_CONTEXT KdpContext
;
526 extern PKDEBUG_ROUTINE KiDebugRoutine
;
527 extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine
;
528 extern BOOLEAN KdBreakAfterSymbolLoad
;
529 extern BOOLEAN KdPitchDebugger
;
530 extern BOOLEAN KdAutoEnableOnEvent
;
531 extern BOOLEAN KdBlockEnable
;
532 extern BOOLEAN KdIgnoreUmExceptions
;
533 extern BOOLEAN KdPreviouslyEnabled
;
534 extern BOOLEAN KdpDebuggerStructuresInitialized
;
535 extern BOOLEAN KdEnteredDebugger
;
536 extern KDPC KdpTimeSlipDpc
;
537 extern KTIMER KdpTimeSlipTimer
;
538 extern WORK_QUEUE_ITEM KdpTimeSlipWorkItem
;
539 extern LONG KdpTimeSlipPending
;
540 extern PKEVENT KdpTimeSlipEvent
;
541 extern KSPIN_LOCK KdpTimeSlipEventLock
;
542 extern BOOLEAN KdpPortLocked
;
543 extern BOOLEAN KdpControlCPressed
;
544 extern BOOLEAN KdpContextSent
;
545 extern KSPIN_LOCK KdpDebuggerLock
;
546 extern LARGE_INTEGER KdTimerStop
, KdTimerStart
, KdTimerDifference
;
547 extern ULONG KdComponentTableSize
;
548 extern ULONG Kd_WIN2000_Mask
;
549 extern PULONG KdComponentTable
[104];
550 extern CHAR KdpMessageBuffer
[0x1000], KdpPathBuffer
[0x1000];
551 extern CHAR KdPrintDefaultCircularBuffer
[KD_DEFAULT_LOG_BUFFER_SIZE
];
552 extern BREAKPOINT_ENTRY KdpBreakpointTable
[KD_BREAKPOINT_MAX
];
553 extern KD_BREAKPOINT_TYPE KdpBreakpointInstruction
;
554 extern BOOLEAN KdpOweBreakpoint
;
555 extern BOOLEAN BreakpointsSuspended
;
556 extern ULONG KdpNumInternalBreakpoints
;
557 extern ULONG_PTR KdpCurrentSymbolStart
, KdpCurrentSymbolEnd
;
558 extern ULONG TraceDataBuffer
[40];
559 extern ULONG TraceDataBufferPosition
;