📄 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 4VOID 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 2typedef 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);#endifVOIDKdpReboot ( VOID );BOOLEANKdpPrintString ( IN LPCWSTR Output );ULONGKdpAddBreakpoint ( IN PVOID Address );BOOLEANKdpDeleteBreakpoint ( IN ULONG Handle );ULONGKdpMoveMemory ( IN PCHAR Destination, IN PCHAR Source, IN ULONG Length );VOIDKdpQuickMoveMemory ( IN PCHAR Destination, IN PCHAR Source, IN ULONG Length );USHORTKdpReceivePacket ( IN ULONG ExpectedPacketType, OUT PSTRING MessageHeader, OUT PSTRING MessageData, OUT PULONG DataLength );VOIDKdpSetLoadState( IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange, IN CONTEXT *ContextRecord );VOIDKdpSetStateChange( IN PDBGKD_WAIT_STATE_CHANGE WaitStateChange, IN PEXCEPTION_RECORD ExceptionRecord, IN CONTEXT * ContextRecord, IN BOOLEAN SecondChance );VOIDKdpGetStateChange( IN PDBGKD_MANIPULATE_STATE ManipulateState, IN CONTEXT * ContextRecord );VOIDKdpSendPacket ( IN ULONG PacketType, IN PSTRING MessageHeader, IN PSTRING MessageData OPTIONAL );ULONGKdpTrap ( IN PEXCEPTION_RECORD ExceptionRecord, IN CONTEXT * ContextRecord, IN BOOLEAN SecondChance );VOIDKdpDisplayString ( IN PCHAR Output );VOIDKdpWriteComPacket ( USHORT, USHORT, PVOID, PVOID, PVOID );BOOLEANKdpReadComPacket ( VOID );BOOLEANKdpReportExceptionStateChange ( IN PEXCEPTION_RECORD ExceptionRecord, IN OUT CONTEXT * ContextRecord, IN BOOLEAN SecondChance );BOOLEANKdpReportLoadSymbolsStateChange ( IN PSTRING PathName, IN PKD_SYMBOLS_INFO SymbolInfo, IN BOOLEAN UnloadSymbols, IN OUT CONTEXT * ContextRecord );KCONTINUE_STATUSKdpSendWaitContinue( IN ULONG PacketType, IN PSTRING MessageHeader, IN PSTRING MessageData OPTIONAL, IN OUT CONTEXT * ContextRecord );VOIDKdpReadVirtualMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpWriteVirtualMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpReadPhysicalMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpWritePhysicalMemory( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpGetContext( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpSetContext( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpWriteBreakpoint( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpRestoreBreakpoint( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpReadControlSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpWriteControlSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpReadIoSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpWriteIoSpace( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );VOIDKdpGetVersion( IN PDBGKD_MANIPULATE_STATE m );NTSTATUSKdpWriteBreakPointEx( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context ); VOIDKdpRestoreBreakPointEx( IN PDBGKD_MANIPULATE_STATE m, IN PSTRING AdditionalData, IN CONTEXT * Context );NTSTATUSKdpManipulateBreakPoint( 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 20extern DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS];void CpuContextToContext(CONTEXT *pCtx, CPUCONTEXT *pCpuCtx);//// Prototypes...//USHORTKdPortGetByte ( OUT PUCHAR Input );VOIDKdPortPutByte ( IN UCHAR Output );VOIDKeStallExecutionProcessor ( ULONG Seconds );BOOLEANSH3KdInit( VOID );VOIDDumpKdContext( IN CONTEXT *ContextRecord );//// Private procedure prototypes//VOIDKdpInitCom( VOID );USHORTKdpReceivePacketLeader ( IN ULONG PacketType, OUT PULONG PacketLeader );VOIDKdClearCommError ( VOID );// Ethernet debug routinesBOOL FillEdbgBuffer();BOOL WriteEdbgBuffer();// Function called to switch over to ethernet transportBOOL SwitchKdbgToEther(BOOL ToEther);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -