📄 kdp.h
字号:
#define KD_ASSERT(exp)
DEBUGGERMSG (KDZONE_ALERT, (L"**** KD_ASSERT ****" L##exp "\r\n"))
#else
#define KD_ASSERT(exp)
#endif
#define BREAKPOINT_TABLE_SIZE (256) // TODO: move this in HDSTUB.h
//
// Define breakpoint table entry structure.
//
// FLAGS
#define KD_BREAKPOINT_SUSPENDED (0x01) // original instruction of SW BP is temporary restored (typically to prevent KD hitting that BP)
#define KD_BREAKPOINT_16BIT (0x02)
#define KD_BREAKPOINT_INROM (0x04) // Indicate that the BP is in ROM (this is useful only to detect duplicates using both current Address and KAddress)
#define KD_BREAKPOINT_WRITTEN (0x08) // Indicate that the BP was written. (useful for delayed assembly breakpoints.)
typedef struct _BREAKPOINT_ENTRY {
PVOID Address; // Address that the user specified for bp
PVOID KAddr; // Address that the breakpoint was written to. We need to keep this around
// for cases in which the virtual mapping for a module's memory is lost before
// the unload notification.
WORD wRefCount;
BYTE Flags;
KDP_BREAKPOINT_TYPE Content;
} BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
// Breakpoint special Handles for error passing
#define KD_BPHND_ROMBP_SUCCESS (1)
#define KD_BPHND_INVALID_GEN_ERR (0)
#define KD_BPHND_ROMBP_ERROR_INSUFFICIENT_PAGES (-1)
#define KD_BPHND_ERROR_COPY_FAILED (-2)
#define KD_BPHND_ROMBP_ERROR_REMAP_FAILED (-3)
// ROM Breakpoints structures
#define NB_ROM2RAM_PAGES (10)
typedef struct _ROM2RAM_PAGE_ENTRY
{
void* pvROMAddr;
BYTE* pbRAMAddr;
void* pvROMAddrKern;
int nBPCount;
} ROM2RAM_PAGE_ENTRY;
extern ROM2RAM_PAGE_ENTRY g_aRom2RamPageTable [NB_ROM2RAM_PAGES];
extern BYTE g_abRom2RamDataPool [((NB_ROM2RAM_PAGES + 1) * PAGE_SIZE) - 1];
#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) || defined (ARM)
VOID FPUFlushContext (VOID);
#endif
#if defined(SHx) && !defined(SH3e) && !defined(SH4)
VOID DSPFlushContext (VOID);
#endif
void KdpResetBps (void);
VOID
KdpReboot (
IN BOOL fReboot
);
ULONG
KdpAddBreakpoint (
IN PVOID Address
);
BOOLEAN
KdpDeleteBreakpoint (
IN ULONG Handle
);
VOID
KdpDeleteAllBreakpoints (
VOID
);
ULONG
KdpMoveMemory (
IN PVOID Destination,
IN PVOID Source,
IN ULONG Length
);
HDATA *
KdHandleToPtr (
IN HANDLE hHandle
);
BOOL
KdValidateHandle (
IN HANDLE hHandle
);
BOOL
KdValidateHandlePtr (
IN HDATA *phHandle
);
UINT
KdGetProcHandleRef (
IN HDATA *phHandle,
IN UINT nPID
);
NTSTATUS
KdQueryHandleFields (
IN OUT DBGKD_HANDLE_DESC_DATA *pHandleFields,
IN UINT nBufLen
);
NTSTATUS
KdQueryOneHandle (
IN HANDLE hHandle,
OUT DBGKD_HANDLE_GET_DATA *pHandleBuffer,
IN UINT nBufLen
);
NTSTATUS
KdQueryHandleList (
IN OUT DBGKD_HANDLE_GET_DATA *pHandleBuffer,
IN UINT nBufLen
);
USHORT
KdpReceiveCmdPacket (
OUT PSTRING MessageHeader,
OUT PSTRING MessageData,
OUT PULONG DataLength,
OUT GUID *pguidClient
);
VOID
KdpSendPacket (
IN WORD dwPacketType,
IN GUID guidClient,
IN PSTRING MessageHeader,
IN PSTRING MessageData OPTIONAL
);
VOID
KdpSendKdApiCmdPacket (
IN PSTRING MessageHeader,
IN PSTRING MessageData OPTIONAL
);
ULONG
KdpTrap (
IN PEXCEPTION_RECORD ExceptionRecord,
IN CONTEXT * ContextRecord,
IN BOOLEAN SecondChance
);
BOOL KdpModLoad (DWORD);
BOOL KdpModUnload (DWORD);
BOOL
KdpSanitize(
BYTE* pbClean,
VOID* pvMem,
ULONG nSize,
BOOL fAlwaysCopy
);
BOOLEAN
KdpReportExceptionNotif (
IN PEXCEPTION_RECORD ExceptionRecord,
IN BOOLEAN SecondChance
);
BOOLEAN
KdpSendNotifAndDoCmdLoop(
IN PSTRING MessageHeader,
IN PSTRING MessageData OPTIONAL
);
VOID
KdpReadVirtualMemory(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpWriteVirtualMemory(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpReadPhysicalMemory(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpWritePhysicalMemory(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpSetContext(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpWriteBreakpoint(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpRestoreBreakpoint(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpReadControlSpace(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpWriteControlSpace(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpReadIoSpace(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData,
IN BOOL fSendPacket
);
VOID
KdpWriteIoSpace(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData,
IN BOOL fSendPacket
);
NTSTATUS
KdpWriteBreakPointEx(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpRestoreBreakPointEx(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID
KdpManipulateBreakPoint(
IN DBGKD_COMMAND *pdbgkdCmdPacket,
IN PSTRING AdditionalData
);
VOID KdpSuspendAllBreakpoints(
VOID
);
VOID
KdpReinstateSuspendedBreakpoints(
VOID
);
BOOLEAN
KdpSuspendBreakpointIfHitByKd(
IN VOID* Address
);
BOOL
KdpHandlePageIn(
IN ULONG ulAddress,
IN ULONG ulNumPages,
IN BOOL bWrite
);
VOID
KdpHandlePageInBreakpoints(
ULONG ulAddress,
ULONG ulNumPages
);
void EnableHDNotifs (BOOL fEnable);
// Define external references.
extern int g_nTotalNumDistinctSwCodeBps;
extern UCHAR g_abMessageBuffer[KDP_MESSAGE_BUFFER_SIZE];
extern BOOL g_fDbgConnected;
extern CRITICAL_SECTION csDbg;
extern CONTEXT *g_pctxException;
// primary interface between nk and kd
extern KERNDATA g_kdKernData;
extern void (*g_pfnOutputDebugString)(char*, ...);
extern HDSTUB_DATA Hdstub;
extern HDSTUB_CLIENT g_KdstubClient;
extern SAVED_THREAD_STATE g_svdThread;
#define pTOC (g_kdKernData.pTOC)
#define kdpKData (g_kdKernData.pKData)
#define kdProcArray (g_kdKernData.pProcArray)
#define pHandleList (g_kdKernData.pHandleList)
#define pVAcs (g_kdKernData.pVAcs)
#define NullSection (*(g_kdKernData.pNullSection))
#define NKSection (*(g_kdKernData.pNKSection))
#define KCall (g_kdKernData.pKCall)
#define kdpInvalidateRange (g_kdKernData.pInvalidateRange)
#define DoVirtualCopy (g_kdKernData.pDoVirtualCopy)
#define KdVirtualFree (g_kdKernData.pVirtualFree)
#define KdCloseHandle (g_kdKernData.pCloseHandle)
#define kdpIsROM (g_kdKernData.pkdpIsROM)
#define KdCleanup (g_kdKernData.pKdCleanup)
#define KDEnableInt (g_kdKernData.pKDEnableInt)
#define pfnIsDesktopDbgrExist (g_kdKernData.pfnIsDesktopDbgrExist)
#define NKwvsprintfW (g_kdKernData.pNKwvsprintfW)
#define NKDbgPrintfW (g_kdKernData.pNKDbgPrintfW)
#define pulHDEventFilter (g_kdKernData.pulHDEventFilter)
#if defined(MIPS)
#define InterlockedDecrement (g_kdKernData.pInterlockedDecrement)
#define InterlockedIncrement (g_kdKernData.pInterlockedIncrement)
#endif
#if defined(ARM)
#define InSysCall (g_kdKernData.pInSysCall)
#endif
#if defined(x86)
#define MD_CBRtn (*(DWORD*)g_kdKernData.pMD_CBRtn)
#else
#define MD_CBRtn (g_kdKernData.pMD_CBRtn)
#endif
extern BOOL KDIoControl (DWORD dwIoControlCode, LPVOID lpBuf, DWORD nBufSize);
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 MapPtrInProc(Ptr, Proc) (((DWORD)(Ptr)>>VA_SECTION) ? (LPVOID)(Ptr) : \
(LPVOID)((DWORD)(Ptr)|(DWORD)Proc->dwVMBase))
void CpuContextToContext(CONTEXT *pCtx, CPUCONTEXT *pCpuCtx);
#ifdef MIPSII
#define Is16BitSupported (kdpKData->fMIPS16Sup)
#elif defined (THUMBSUPPORT)
#define Is16BitSupported (1)
#else
#define Is16BitSupported (0)
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -