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

📄 kdp.h

📁 WinCE5.0部分核心源码
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -