2 * COPYRIGHT: GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/base/kddll/kddll.h
5 * PURPOSE: Base definitions for the kernel debugger.
22 // #define KDDEBUG /* uncomment to enable debugging this dll */
24 /* To undefine once https://sourceware.org/bugzilla/show_bug.cgi?id=17397 is resolved */
28 #define KDDBGPRINT(...)
30 extern ULONG
KdpDbgPrint(const char* Format
, ...);
31 #define KDDBGPRINT KdpDbgPrint
34 /* GDB doesn't like pid - tid 0, so +1 them */
35 FORCEINLINE HANDLE
gdb_tid_to_handle(UINT_PTR Tid
)
37 return (HANDLE
)(Tid
- 1);
39 #define gdb_pid_to_handle gdb_tid_to_handle
41 FORCEINLINE UINT_PTR
handle_to_gdb_tid(HANDLE Handle
)
43 return (UINT_PTR
)Handle
+ 1;
45 #define handle_to_gdb_pid handle_to_gdb_tid
49 InitManipulateFromStateChange(
51 _In_
const DBGKD_ANY_WAIT_STATE_CHANGE
* StateChange
,
52 _Out_ DBGKD_MANIPULATE_STATE64
* Manipulate
)
54 Manipulate
->ApiNumber
= ApiNumber
;
55 Manipulate
->Processor
= StateChange
->Processor
;
56 Manipulate
->ProcessorLevel
= StateChange
->ProcessorLevel
;
59 /* Callbacks to simulate a KdReceive <-> KdSend loop without GDB being aware of it */
60 typedef VOID (*KDP_SEND_HANDLER
)(
61 _In_ ULONG PacketType
,
62 _In_ PSTRING MessageHeader
,
63 _In_ PSTRING MessageData
65 typedef KDSTATUS (*KDP_MANIPULATESTATE_HANDLER
)(
66 _Out_ DBGKD_MANIPULATE_STATE64
* State
,
67 _Out_ PSTRING MessageData
,
68 _Out_ PULONG MessageLength
,
69 _Inout_ PKD_CONTEXT KdContext
73 extern UINT_PTR gdb_dbg_tid
;
74 extern UINT_PTR gdb_dbg_pid
;
75 extern KDSTATUS
gdb_receive_and_interpret_packet(_Out_ DBGKD_MANIPULATE_STATE64
* State
, _Out_ PSTRING MessageData
, _Out_ PULONG MessageLength
, _Inout_ PKD_CONTEXT KdContext
);
78 extern CHAR gdb_input
[];
79 KDSTATUS NTAPI
gdb_receive_packet(_Inout_ PKD_CONTEXT KdContext
);
80 char hex_value(char ch
);
83 KDSTATUS
send_gdb_packet(_In_
const CHAR
* Buffer
);
84 void start_gdb_packet(void);
85 void send_gdb_partial_packet(_In_
const CHAR
* Buffer
);
86 KDSTATUS
finish_gdb_packet(void);
87 KDSTATUS
send_gdb_memory(_In_
const VOID
* Buffer
, size_t Length
);
88 void send_gdb_partial_memory(_In_
const VOID
* Buffer
, _In_
size_t Length
);
89 ULONG
send_gdb_partial_binary(_In_
const VOID
* Buffer
, _In_
size_t Length
);
90 KDSTATUS
gdb_send_debug_io(_In_ PSTRING String
, _In_ BOOLEAN WithPrefix
);
91 KDSTATUS
gdb_send_exception(void);
92 void send_gdb_ntstatus(_In_ NTSTATUS Status
);
93 extern const char hex_chars
[];
96 KDSTATUS NTAPI
KdpPollBreakIn(VOID
);
97 VOID NTAPI
KdpSendByte(_In_ UCHAR Byte
);
98 KDSTATUS NTAPI
KdpReceiveByte(_Out_ PUCHAR OutByte
);
101 extern DBGKD_ANY_WAIT_STATE_CHANGE CurrentStateChange
;
102 extern CONTEXT CurrentContext
;
103 extern DBGKD_GET_VERSION64 KdVersion
;
104 extern KDDEBUGGER_DATA64
* KdDebuggerDataBlock
;
105 extern LIST_ENTRY
* ProcessListHead
;
106 extern LIST_ENTRY
* ModuleListHead
;
107 extern KDP_SEND_HANDLER KdpSendPacketHandler
;
108 extern KDP_MANIPULATESTATE_HANDLER KdpManipulateStateHandler
;
109 /* Common ManipulateState handlers */
110 extern KDSTATUS
ContinueManipulateStateHandler(_Out_ DBGKD_MANIPULATE_STATE64
* State
, _Out_ PSTRING MessageData
, _Out_ PULONG MessageLength
, _Inout_ PKD_CONTEXT KdContext
);
111 extern KDSTATUS
SetContextManipulateHandler(_Out_ DBGKD_MANIPULATE_STATE64
* State
, _Out_ PSTRING MessageData
, _Out_ PULONG MessageLength
, _Inout_ PKD_CONTEXT KdContext
);
112 extern PEPROCESS TheIdleProcess
;
113 extern PETHREAD TheIdleThread
;
116 extern PEPROCESS
find_process( _In_ UINT_PTR Pid
);
117 extern PETHREAD
find_thread(_In_ UINT_PTR Pid
, _In_ UINT_PTR Tid
);
120 extern KDSTATUS
gdb_send_register(void);
121 extern KDSTATUS
gdb_send_registers(void);
123 /* Architecture specific defines. See ntoskrnl/include/internal/arch/ke.h */
125 /* Handling passing over the breakpoint instruction */
126 # define KdpGetContextPc(Context) \
128 # define KdpSetContextPc(Context, ProgramCounter) \
129 ((Context)->Eip = (ProgramCounter))
130 # define KD_BREAKPOINT_TYPE UCHAR
131 # define KD_BREAKPOINT_SIZE sizeof(UCHAR)
132 # define KD_BREAKPOINT_VALUE 0xCC
133 /* Single step mode */
134 # define KdpSetSingleStep(Context) \
135 ((Context)->EFlags |= EFLAGS_TF)
137 # error "Please define relevant macros for your architecture"
140 #endif /* _KDGDB_H_ */