⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kdp.h

📁 可用于嵌入式编程学习
💻 H
📖 第 1 页 / 共 2 页
字号:
    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 + -