📄 kdp.h
字号:
IN PVOID BaseOfDll;
IN ULONG ProcessId;
IN ULONG CheckSum;
IN ULONG SizeOfImage;
} KD_SYMBOLS_INFO, *PKD_SYMBOLS_INFO;
extern BOOLEAN KdDebuggerNotPresent;
typedef enum {
ContinueError = FALSE,
ContinueSuccess = TRUE,
ContinueProcessorReselected,
ContinueNextProcessor
} KCONTINUE_STATUS;
typedef ULONG KSPIN_LOCK;
//
// Miscellaneous
//
#if DBG
#define KD_ASSERT(exp) assert(exp)
#else
#define KD_ASSERT(exp)
#endif
//
// ReadControlSpace Api commands
//
#define HANDLE_PROCESS_INFO_REQUEST 0 #define HANDLE_GET_NEXT_OFFSET_REQUEST 1
#define HANDLE_STACKWALK_REQUEST 2
#define HANDLE_THREADSTACK_REQUEST 3
#define HANDLE_THREADSTACK_TERMINATE 4
#define HANDLE_RELOAD_MODULES_REQUEST 5
#define HANDLE_RELOAD_MODULES_INFO 6
#define HANDLE_PROCESS_ZONE_REQUEST 7
#define HANDLE_KERNEL_DATA_AREA 8 #define HANDLE_VERIFY_MODULE_LOAD 9 #define HANDLE_PROCESS_THREAD_INFO_REQ 10
#define HANDLE_GETCURPROCTHREAD 11
//
// WriteControlSpace Api commands
//
#define HANDLE_PROCESS_SWITCH_REQUEST 0
#define HANDLE_THREAD_SWITCH_REQUEST 1
#define HANDLE_STACKWALK_REQUEST 2
#define HANDLE_BKPT_GLOBAL_REQUEST 3
#define HANDLE_BKPT_THREAD_REQUEST 4
VOID NKDebuggerPrintfW(LPWSTR lpszFmt, ...);
/*************************************************************************/
extern int ppshfile;
extern int dwCurSetting;
#define KDZONE_MOVE 0x1
#define KDZONE_BREAK 0x2
#define KDZONE_API 0x4
#define KDZONE_TRAP 0x8
#define KDZONE_DBG 0x10
#define KDZONE_CTRL 0x20
#define KDZONE_STACKW 0x40
#define KDZONE_HAL 0x80
#define _O_RDONLY 0x0000 /* open for reading only */
#define _O_WRONLY 0x0001 /* open for writing only */
#define _O_RDWR 0x0002 /* open for reading and writing */
#define _O_APPEND 0x0008 /* writes done at eof */
#define _O_CREAT 0x0100 /* create and open file */
#define _O_TRUNC 0x0200 /* open and truncate */
#define _O_EXCL 0x0400 /* open only if file doesn't already exist */
WORD WINAPI ProcessZone(LPBYTE Buffer);
VOID NKOtherPrintfW(LPWSTR lpszFmt, ...);
#define DBGOTHER
#if defined(DBGOTHER)
#define DEBUGGERMSG(cond,printf_exp) \
if (cond & dwCurSetting) NKOtherPrintfW printf_exp
#elif defined(DEBUG_DEBUGGER)
#pragma message("Hello from the debug debugger\r\n")
#define DEBUG 1
#define DEBUGGERMSG(cond,printf_exp) \
((cond)?(NKDebuggerPrintfW printf_exp),1:0)
#define DEBUG_OUT(x) DebugPrint(x)
#define DEBUG_OUT1(x, a1) DebugPrint(x, a1)
#define DEBUG_OUT2(x, a1, a2) DebugPrint(x, a1, a2)
#define DEBUG_OUT3(x, a1, a2, a3) DebugPrint(x, a1, a2, a3)
#define DEBUG_OUT4(x, a1, a2, a3, a4) DebugPrint(x, a1, a2, a3, a4)
#else
#define DEBUGGERMSG(cond,printf_exp)
#define DEBUG_OUT(x)
#define DEBUG_OUT1(x, a1)
#define DEBUG_OUT2(x, a1, a2)
#define DEBUG_OUT3(x, a1, a2, a3)
#define DEBUG_OUT4(x, a1, a2, a3, a4)
#endif
/*************************************************************************/
//
// Define constants.
//
#define BREAKPOINT_TABLE_SIZE 32
//
// Addresses above GLOBAL_BREAKPOINT_LIMIT are either in system space
// or part of dynlink, so we treat them as global.
//
#define GLOBAL_BREAKPOINT_LIMIT 1610612736L // 1.5gigabytes
//
// Define breakpoint table entry structure.
//
#define KD_BREAKPOINT_IN_USE 0x00000001
#define KD_BREAKPOINT_NEEDS_WRITE 0x00000002
#define KD_BREAKPOINT_SUSPENDED 0x00000004
#if defined(THUMBSUPPORT) || defined(MIPS16SUPPORT)
#define KD_BREAKPOINT_16BIT 0x00000008
#endif
//
// status Constants for Packet waiting
//
#define KDP_PACKET_RECEIVED 0
#define KDP_PACKET_TIMEOUT 1
#define KDP_PACKET_RESEND 2
typedef struct _BREAKPOINT_ENTRY {
ULONG Flags;
ULONG DirectoryTableBase;
PVOID Address;
PVOID KAddress;
PTHREAD pThrd;
KDP_BREAKPOINT_TYPE Content;
} BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
extern BOOLEAN bGlobalBreakPoint;
//
// Generic test for success on any status value (non-negative numbers
// indicate success).
//
#define NT_SUCCESS(Status) ((long)(Status) >= 0)
#define ARGUMENT_PRESENT(ArgumentPointer) (\
(CHAR *)(ArgumentPointer) != (CHAR *)(NULL) )
#if defined(SHx)
void LoadDebugSymbols(void);
//
// User Break Controller memory-mapped addresses
//
#if SH4
#define UBCBarA 0xFF200000 // 32 bit Break Address A
#define UBCBamrA 0xFF200004 // 8 bit Break Address Mask A
#define UBCBbrA 0xFF200008 // 16 bit Break Bus Cycle A
#define UBCBasrA 0xFF000014 // 8 bit Break ASID A
#define UBCBarB 0xFF20000C // 32 bit Break Address B
#define UBCBamrB 0xFF200010 // 8 bit Break Address Mask B
#define UBCBbrB 0xFF200014 // 16 bit Break Bus Cycle A
#define UBCBasrB 0xFF000018 // 8 bit Break ASID B
#define UBCBdrB 0xFF200018 // 32 bit Break Data B
#define UBCBdmrB 0xFF20001C // 32 bit Break Data Mask B
#define UBCBrcr 0xFF200020 // 16 bit Break Control Register
#else
#define UBCBarA 0xffffffb0
#define UBCBamrA 0xffffffb4
#define UBCBbrA 0xffffffb8
#define UBCBasrA 0xffffffe4
#define UBCBarB 0xffffffa0
#define UBCBamrB 0xffffffa4
#define UBCBbrB 0xffffffa8
#define UBCBasrB 0xffffffe8
#define UBCBdrB 0xffffff90
#define UBCBdmrB 0xffffff94
#define UBCBrcr 0xffffff98
#endif
#endif
#define READ_REGISTER_UCHAR(addr) (*(volatile unsigned char *)(addr))
#define READ_REGISTER_USHORT(addr) (*(volatile unsigned short *)(addr))
#define READ_REGISTER_ULONG(addr) (*(volatile unsigned long *)(addr))
#define WRITE_REGISTER_UCHAR(addr,val) (*(volatile unsigned char *)(addr) = (val))
#define WRITE_REGISTER_USHORT(addr,val) (*(volatile unsigned short *)(addr) = (val))
#define WRITE_REGISTER_ULONG(addr,val) (*(volatile unsigned long *)(addr) = (val))
//
// Define Kd function prototypes.
//
#if defined(MIPS_HAS_FPU) || defined(SH4) || defined(x86)
VOID FPUFlushContext (VOID);
#endif
VOID
KdpReboot (
VOID
);
BOOLEAN
KdpPrintString (
IN LPCWSTR Output
);
ULONG
KdpAddBreakpoint (
IN PVOID Address
);
BOOLEAN
KdpDeleteBreakpoint (
IN ULONG Handle
);
ULONG
KdpMoveMemory (
IN PCHAR Destination,
IN PCHAR Source,
IN ULONG Length
);
VOID
KdpQuickMoveMemory (
IN PCHAR Destination,
IN PCHAR Source,
IN ULONG Length
);
USHORT
KdpReceivePacket (
IN ULONG ExpectedPacketType,
OUT PSTRING MessageHeader,
OUT PSTRING MessageData,
OUT PULONG DataLength
);
VOID
KdpSetLoadState(
IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange,
IN CONTEXT *ContextRecord
);
VOID
KdpSetStateChange(
IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange,
IN PEXCEPTION_RECORD ExceptionRecord,
IN CONTEXT * ContextRecord,
IN BOOLEAN SecondChance
);
VOID
KdpGetStateChange(
IN PDBGKD_MANIPULATE_STATE ManipulateState,
IN CONTEXT * ContextRecord
);
VOID
KdpSendPacket (
IN ULONG PacketType,
IN PSTRING MessageHeader,
IN PSTRING MessageData OPTIONAL
);
ULONG
KdpTrap (
IN PEXCEPTION_RECORD ExceptionRecord,
IN CONTEXT * ContextRecord,
IN BOOLEAN SecondChance
);
VOID
KdpDisplayString (
IN PCHAR Output
);
VOID
KdpWriteComPacket (
USHORT,
USHORT,
PVOID,
PVOID,
PVOID
);
BOOLEAN
KdpReadComPacket (
VOID
);
BOOLEAN
KdpReportExceptionStateChange (
IN PEXCEPTION_RECORD ExceptionRecord,
IN OUT CONTEXT * ContextRecord,
IN BOOLEAN SecondChance
);
BOOLEAN
KdpReportLoadSymbolsStateChange (
IN PSTRING PathName,
IN PKD_SYMBOLS_INFO SymbolInfo,
IN BOOLEAN UnloadSymbols,
IN OUT CONTEXT * ContextRecord
);
KCONTINUE_STATUS
KdpSendWaitContinue(
IN ULONG PacketType,
IN PSTRING MessageHeader,
IN PSTRING MessageData OPTIONAL,
IN OUT CONTEXT * ContextRecord
);
VOID
KdpReadVirtualMemory(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpWriteVirtualMemory(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpReadPhysicalMemory(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpWritePhysicalMemory(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpGetContext(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpSetContext(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpWriteBreakpoint(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpRestoreBreakpoint(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpReadControlSpace(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpWriteControlSpace(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpReadIoSpace(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpWriteIoSpace(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpGetVersion(
IN PDBGKD_MANIPULATE_STATE m
);
NTSTATUS
KdpWriteBreakPointEx(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
VOID
KdpRestoreBreakPointEx(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
NTSTATUS
KdpManipulateBreakPoint(
IN PDBGKD_MANIPULATE_STATE m,
IN PSTRING AdditionalData,
IN CONTEXT * Context
);
//
// Define external references.
//
extern BOOL KdpUseTCPSockets;
extern BOOL KdpUseUDPSockets;
extern BOOL KdpUseEdbg;
#define KDP_MESSAGE_BUFFER_SIZE (16384)
extern BREAKPOINT_ENTRY KdpBreakpointTable[BREAKPOINT_TABLE_SIZE];
extern KSPIN_LOCK KdpDebuggerLock;
extern KDP_BREAKPOINT_TYPE KdpBreakpointInstruction;
extern UCHAR KdpMessageBuffer[KDP_MESSAGE_BUFFER_SIZE];
extern ULONG KdpOweBreakpoint;
extern ULONG KdpNextPacketIdToSend;
extern ULONG KdpPacketIdExpected;
typedef struct {
ULONG Addr; // pc address of breakpoint
ULONG Flags; // Flags bits
ULONG Calls; // # of times traced routine called
ULONG CallsLastCheck; // # of calls at last periodic (1s) check
ULONG MaxCallsPerPeriod;
ULONG MinInstructions; // largest number of instructions for 1 call
ULONG MaxInstructions; // smallest # of instructions for 1 call
ULONG TotalInstructions; // total instructions for all calls
ULONG Handle; // handle in (regular) bpt table
PVOID Thread; // Thread that's skipping this BP
ULONG ReturnAddress; // return address (if not COUNTONLY)
} DBGKD_INTERNAL_BREAKPOINT, *PDBGKD_INTERNAL_BREAKPOINT;
#define DBGKD_MAX_INTERNAL_BREAKPOINTS 20
extern DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS];
void CpuContextToContext(CONTEXT *pCtx, CPUCONTEXT *pCpuCtx);
//
// Prototypes...
//
USHORT
KdPortGetByte (
OUT PUCHAR Input
);
VOID
KdPortPutByte (
IN UCHAR Output
);
VOID
KeStallExecutionProcessor (
ULONG Seconds
);
BOOLEAN
SH3KdInit(
VOID
);
VOID
DumpKdContext(
IN CONTEXT *ContextRecord
);
//
// Private procedure prototypes
//
VOID
KdpInitCom(
VOID
);
USHORT
KdpReceivePacketLeader (
IN ULONG PacketType,
OUT PULONG PacketLeader
);
VOID
KdClearCommError (
VOID
);
// Ethernet debug routines
BOOL FillEdbgBuffer();
BOOL WriteEdbgBuffer();
// Function called to switch over to ethernet transport
BOOL SwitchKdbgToEther(BOOL ToEther);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -