#include <windbgkd.h>
#include <kddll.h>
-// #define KDDEBUG /* uncomment to enable debugging this dll */
+#define KDDEBUG /* uncomment to enable debugging this dll */
#ifndef KDDEBUG
#define KDDBGPRINT(...)
#define KDDBGPRINT KdpDbgPrint
#endif
+/* Callbacks to simulate a KdReceive <-> KdSend loop without GDB being aware of it */
+typedef VOID (*KDP_SEND_HANDLER)(
+ _In_ ULONG PacketType,
+ _In_ PSTRING MessageHeader,
+ _In_ PSTRING MessageData
+);
+typedef KDSTATUS (*KDP_MANIPULATESTATE_HANDLER)(
+ _Out_ DBGKD_MANIPULATE_STATE64* State,
+ _Out_ PSTRING MessageData,
+ _Out_ PULONG MessageLength,
+ _Inout_ PKD_CONTEXT KdContext
+);
+
/* gdb_input.c */
extern HANDLE gdb_dbg_thread;
KDSTATUS gdb_interpret_input(_Out_ DBGKD_MANIPULATE_STATE64* State, _Out_ PSTRING MessageData, _Out_ PULONG MessageLength, _Inout_ PKD_CONTEXT KdContext);
void send_gdb_memory(_In_ VOID* Buffer, size_t Length);
void gdb_send_debug_io(_In_ PSTRING String);
void gdb_send_exception(void);
+void send_gdb_ntstatus(_In_ NTSTATUS Status);
/* kdcom.c */
KDSTATUS NTAPI KdpPollBreakIn(VOID);
extern DBGKD_ANY_WAIT_STATE_CHANGE CurrentStateChange;
extern DBGKD_GET_VERSION64 KdVersion;
extern KDDEBUGGER_DATA64* KdDebuggerDataBlock;
+extern KDP_SEND_HANDLER KdpSendPacketHandler;
+extern KDP_MANIPULATESTATE_HANDLER KdpManipulateStateHandler;
+
/* arch_sup.c */
void gdb_send_registers(void);
+/* Architecture specific defines. See ntoskrnl/include/internal/arch/ke.h */
+#ifdef _M_IX86
+# define KdpGetContextPc(Context) \
+ ((Context)->Eip)
+# define KdpSetContextPc(Context, ProgramCounter) \
+ ((Context)->Eip = (ProgramCounter))
+# define KD_BREAKPOINT_SIZE sizeof(UCHAR)
+#else
+# error "Please define relevant macros for your architecture"
+#endif
+
#endif /* _KDGDB_H_ */