951 lines
20 KiB
C
951 lines
20 KiB
C
/*++
|
|
|
|
Copyright (c) 1990-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
kdp.h
|
|
|
|
Abstract:
|
|
|
|
Private include file for the Kernel Debugger subcomponent
|
|
of the NTOS project
|
|
|
|
Author:
|
|
|
|
Mike O'Leary (mikeol) 29-June-1989
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "ntos.h"
|
|
#include "ki.h"
|
|
|
|
#define NOEXTAPI
|
|
#include "wdbgexts.h"
|
|
#include "ntdbg.h"
|
|
#include "string.h"
|
|
#include "stdlib.h"
|
|
#include "kddll.h"
|
|
|
|
|
|
#if defined(_ALPHA_)
|
|
|
|
#include "alphaops.h"
|
|
|
|
//
|
|
// Define KD private PCR routines.
|
|
//
|
|
// Using the following private KD routines allows the kernel debugger to
|
|
// step over breakpoints in modules that call the standard PCR routines.
|
|
//
|
|
|
|
PKPCR KdpGetPcr();
|
|
|
|
ULONG KdpReadInternalProcessorState(PVOID, ULONG);
|
|
ULONG KdpReadInternalProcessorCounters(PVOID, ULONG);
|
|
|
|
struct _KPRCB *
|
|
KdpGetCurrentPrcb();
|
|
|
|
struct _KTHREAD *
|
|
KdpGetCurrentThread();
|
|
|
|
//
|
|
// Redefine the standard PCR routines
|
|
//
|
|
|
|
#undef KiPcr
|
|
#define KiPcr KdpGetPcr()
|
|
|
|
#undef KeGetPcr
|
|
#undef KeGetCurrentPrcb
|
|
#undef KeGetCurrentThread
|
|
#undef KeIsExecutingDpc
|
|
#define KeGetPcr() KdpGetPcr()
|
|
#define KeGetCurrentPrcb() KdpGetCurrentPrcb()
|
|
#define KeGetCurrentThread() KdpGetCurrentThread()
|
|
|
|
//
|
|
// Define TYPES
|
|
//
|
|
|
|
#define KDP_BREAKPOINT_TYPE ULONG
|
|
#define KDP_BREAKPOINT_BUFFER sizeof(ULONG)
|
|
|
|
// longword aligned
|
|
#define KDP_BREAKPOINT_ALIGN 3
|
|
#define KDP_BREAKPOINT_INSTR_ALIGN 3
|
|
|
|
// actual instruction is "call_pal kbpt"
|
|
#define KDP_BREAKPOINT_VALUE KBPT_FUNC
|
|
|
|
|
|
#elif defined(_IA64_)
|
|
|
|
// IA64 instruction is in a 128-bit bundle. Each bundle consists of 3 instruction slots.
|
|
// Each instruction slot is 41-bit long.
|
|
//
|
|
//
|
|
// 127 87 86 46 45 5 4 1 0
|
|
// ------------------------------------------------------------
|
|
// | slot 2 | slot 1 | slot 0 |template|S|
|
|
// ------------------------------------------------------------
|
|
//
|
|
// 127 96 95 64 63 32 31 0
|
|
// ------------------------------------------------------------
|
|
// | byte 3 | byte 2 | byte 1 | byte 0 |
|
|
// ------------------------------------------------------------
|
|
//
|
|
// This presents two incompatibilities with conventional processors:
|
|
// 1. The IA64 IP address is at the bundle bundary. The instruction slot number is
|
|
// stored in ISR.ei at the time of exception.
|
|
// 2. The 41-bit instruction format is not byte-aligned.
|
|
//
|
|
// Break instruction insertion must be done with proper bit-shifting to align with the selected
|
|
// instruction slot. Further, to insert break instruction insertion at a specific slot, we must
|
|
// be able to specify instruction slot as part of the address. We therefore define an EM address as
|
|
// bundle address + slot number with the least significant two bit always zero:
|
|
//
|
|
// 31 4 3 2 1 0
|
|
// --------------------------------
|
|
// | bundle address |slot#|0 0|
|
|
// --------------------------------
|
|
//
|
|
// The EM address as defined is the byte-aligned address that is closest to the actual instruction slot.
|
|
// i.e., The EM instruction address of slot #0 is equal to bundle address.
|
|
// slot #1 is equal to bundle address + 4.
|
|
// slot #2 is equal to bundle address + 8.
|
|
|
|
//
|
|
// Upon exception, the bundle address is kept in IIP, and the instruction slot which caused
|
|
// the exception is in ISR.ei. Kernel exception handler will construct the flat address and
|
|
// export it in ExceptionRecord.ExceptionAddress.
|
|
|
|
|
|
#define KDP_BREAKPOINT_TYPE ULONGLONG // 64-bit ULONGLONG type is needed to cover 41-bit EM break instruction.
|
|
#define KDP_BREAKPOINT_BUFFER (2 * sizeof(ULONGLONG))
|
|
#define KDP_BREAKPOINT_ALIGN 0x3 // An EM address consists of bundle and slot number and is 32-bit aligned.
|
|
#define KDP_BREAKPOINT_INSTR_ALIGN 0xf
|
|
#define KDP_BREAKPOINT_VALUE (BREAK_INSTR | (BREAKPOINT_STOP << 6))
|
|
|
|
#elif defined(_X86_) || defined(_AMD64_)
|
|
|
|
#define KDP_BREAKPOINT_TYPE UCHAR
|
|
#define KDP_BREAKPOINT_BUFFER sizeof(UCHAR)
|
|
#define KDP_BREAKPOINT_ALIGN 0
|
|
#define KDP_BREAKPOINT_INSTR_ALIGN 0
|
|
#define KDP_BREAKPOINT_VALUE 0xcc
|
|
|
|
#endif
|
|
|
|
//
|
|
// Define constants.
|
|
//
|
|
|
|
//
|
|
// 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
|
|
#define KD_BREAKPOINT_NEEDS_REPLACE 0x00000008
|
|
// IA64 specific defines
|
|
#define KD_BREAKPOINT_STATE_MASK 0x0000000f
|
|
#define KD_BREAKPOINT_IA64_MASK 0x000f0000
|
|
#define KD_BREAKPOINT_IA64_MODE 0x00010000 // IA64 mode
|
|
#define KD_BREAKPOINT_IA64_MOVL 0x00020000 // MOVL instruction displaced
|
|
|
|
typedef struct _BREAKPOINT_ENTRY {
|
|
ULONG Flags;
|
|
ULONG_PTR DirectoryTableBase;
|
|
PVOID Address;
|
|
KDP_BREAKPOINT_TYPE Content;
|
|
} BREAKPOINT_ENTRY, *PBREAKPOINT_ENTRY;
|
|
|
|
//
|
|
// Misc defines
|
|
//
|
|
|
|
#define MAXIMUM_RETRIES 20
|
|
|
|
#define DBGKD_MAX_SPECIAL_CALLS 10
|
|
|
|
typedef struct _TRACE_DATA_SYM {
|
|
ULONG SymMin;
|
|
ULONG SymMax;
|
|
} TRACE_DATA_SYM, *PTRACE_DATA_SYM;
|
|
|
|
#define KD_MAX_REMOTE_FILES 16
|
|
|
|
typedef struct _KD_REMOTE_FILE {
|
|
ULONG64 RemoteHandle;
|
|
} KD_REMOTE_FILE, *PKD_REMOTE_FILE;
|
|
|
|
//
|
|
// Define function prototypes.
|
|
//
|
|
|
|
NTSTATUS
|
|
KdpPrint(
|
|
IN ULONG ComponentId,
|
|
IN ULONG Level,
|
|
IN PCHAR Message,
|
|
IN USHORT Length,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame,
|
|
OUT PBOOLEAN Completion
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpPrintString (
|
|
IN PSTRING Output
|
|
);
|
|
|
|
USHORT
|
|
KdpPrompt(
|
|
IN PCHAR Message,
|
|
IN USHORT MessageLength,
|
|
IN OUT PCHAR Reply,
|
|
IN USHORT ReplyLength,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpPromptString (
|
|
IN PSTRING Output,
|
|
IN OUT PSTRING Input
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpReport(
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame,
|
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
IN PCONTEXT ContextRecord,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN BOOLEAN SecondChance
|
|
);
|
|
|
|
VOID
|
|
KdpSymbol(
|
|
IN PSTRING String,
|
|
IN PKD_SYMBOLS_INFO Symbol,
|
|
IN BOOLEAN Unload,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN PCONTEXT ContextRecord,
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame
|
|
);
|
|
|
|
VOID
|
|
KdpCommandString(
|
|
IN PSTRING Name,
|
|
IN PSTRING Command,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN PCONTEXT ContextRecord,
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame
|
|
);
|
|
|
|
ULONG
|
|
KdpAddBreakpoint (
|
|
IN PVOID Address
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpDeleteBreakpoint (
|
|
IN ULONG Handle
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpDeleteBreakpointRange (
|
|
IN PVOID Lower,
|
|
IN PVOID Upper
|
|
);
|
|
|
|
#if defined(_IA64_)
|
|
|
|
BOOLEAN
|
|
KdpSuspendBreakpointRange (
|
|
IN PVOID Lower,
|
|
IN PVOID Upper
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpRestoreBreakpointRange (
|
|
IN PVOID Lower,
|
|
IN PVOID Upper
|
|
);
|
|
#endif
|
|
|
|
#if i386
|
|
|
|
BOOLEAN
|
|
KdpCheckTracePoint(
|
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
IN OUT PCONTEXT ContextRecord
|
|
);
|
|
|
|
NTSTATUS
|
|
KdGetTraceInformation (
|
|
OUT PVOID TraceInformation,
|
|
IN ULONG TraceInformationLength,
|
|
OUT PULONG RequiredLength
|
|
);
|
|
|
|
VOID
|
|
KdSetInternalBreakpoint (
|
|
IN PDBGKD_MANIPULATE_STATE64 m
|
|
);
|
|
|
|
#endif
|
|
|
|
NTSTATUS
|
|
KdQuerySpecialCalls (
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN ULONG Length,
|
|
OUT PULONG RequiredLength
|
|
);
|
|
|
|
VOID
|
|
KdSetSpecialCall (
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PCONTEXT ContextRecord
|
|
);
|
|
|
|
VOID
|
|
KdClearSpecialCalls (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
KdpQuickMoveMemory (
|
|
IN PCHAR Destination,
|
|
IN PCHAR Source,
|
|
IN ULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpCopyMemoryChunks(
|
|
ULONG64 Address,
|
|
PVOID Buffer,
|
|
ULONG TotalSize,
|
|
ULONG ChunkSize,
|
|
ULONG Flags,
|
|
PULONG ActualSize OPTIONAL
|
|
);
|
|
|
|
//
|
|
// KdpCopyMemoryChunks always copies between an untrusted address
|
|
// and a trusted buffer. The following two macros express a read
|
|
// form of this and a write form in a way similar to RtlCopyMemory
|
|
// for convenient replacement of RtlCopyMemory calls.
|
|
//
|
|
|
|
// Read memory from an untrusted pointer into a trusted buffer.
|
|
#define KdpCopyFromPtr(Dst, Src, Size, Done) \
|
|
KdpCopyMemoryChunks((ULONG_PTR)(Src), Dst, Size, 0, \
|
|
MMDBG_COPY_UNSAFE, Done)
|
|
// Write memory from a trusted buffer through an untrusted pointer.
|
|
#define KdpCopyToPtr(Dst, Src, Size, Done) \
|
|
KdpCopyMemoryChunks((ULONG_PTR)(Dst), Src, Size, 0, \
|
|
MMDBG_COPY_WRITE | MMDBG_COPY_UNSAFE, Done)
|
|
|
|
ULONG
|
|
KdpReceivePacket (
|
|
IN ULONG ExpectedPacketType,
|
|
OUT PSTRING MessageHeader,
|
|
OUT PSTRING MessageData,
|
|
OUT PULONG DataLength
|
|
);
|
|
|
|
VOID
|
|
KdpSetContextState(
|
|
IN OUT PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
|
|
IN PCONTEXT ContextRecord
|
|
);
|
|
|
|
VOID
|
|
KdpSetStateChange(
|
|
IN OUT PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange,
|
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
IN PCONTEXT ContextRecord,
|
|
IN BOOLEAN SecondChance
|
|
);
|
|
|
|
VOID
|
|
KdpGetStateChange(
|
|
IN PDBGKD_MANIPULATE_STATE64 ManipulateState,
|
|
IN PCONTEXT ContextRecord
|
|
);
|
|
|
|
VOID
|
|
KdpSendPacket (
|
|
IN ULONG PacketType,
|
|
IN PSTRING MessageHeader,
|
|
IN PSTRING MessageData OPTIONAL
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpStub (
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame,
|
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
IN PCONTEXT ContextRecord,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN BOOLEAN SecondChance
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpTrap (
|
|
IN PKTRAP_FRAME TrapFrame,
|
|
IN PKEXCEPTION_FRAME ExceptionFrame,
|
|
IN PEXCEPTION_RECORD ExceptionRecord64,
|
|
IN PCONTEXT ContextRecord,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
IN BOOLEAN SecondChance
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpSwitchProcessor (
|
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
IN OUT PCONTEXT ContextRecord,
|
|
IN BOOLEAN SecondChance
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpReportExceptionStateChange (
|
|
IN PEXCEPTION_RECORD ExceptionRecord,
|
|
IN OUT PCONTEXT ContextRecord,
|
|
IN BOOLEAN SecondChance
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpReportLoadSymbolsStateChange (
|
|
IN PSTRING PathName,
|
|
IN PKD_SYMBOLS_INFO SymbolInfo,
|
|
IN BOOLEAN UnloadSymbols,
|
|
IN OUT PCONTEXT ContextRecord
|
|
);
|
|
|
|
VOID
|
|
KdpReportCommandStringStateChange (
|
|
IN PSTRING Name,
|
|
IN PSTRING Command,
|
|
IN OUT PCONTEXT ContextRecord
|
|
);
|
|
|
|
KCONTINUE_STATUS
|
|
KdpSendWaitContinue(
|
|
IN ULONG PacketType,
|
|
IN PSTRING MessageHeader,
|
|
IN PSTRING MessageData OPTIONAL,
|
|
IN OUT PCONTEXT ContextRecord
|
|
);
|
|
|
|
VOID
|
|
KdpReadVirtualMemory(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
#if 0
|
|
VOID
|
|
KdpReadVirtualMemory64(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
#endif
|
|
|
|
VOID
|
|
KdpWriteVirtualMemory(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
#if 0
|
|
VOID
|
|
KdpWriteVirtualMemory64(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
#endif
|
|
|
|
VOID
|
|
KdpReadPhysicalMemory(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpWritePhysicalMemory(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpCheckLowMemory(
|
|
IN PDBGKD_MANIPULATE_STATE64 m
|
|
);
|
|
|
|
VOID
|
|
KdpGetContext(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpSetContext(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpWriteBreakpoint(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpRestoreBreakpoint(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpReadControlSpace(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpWriteControlSpace(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpReadIoSpace(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpWriteIoSpace(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpReadIoSpaceExtended (
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpWriteIoSpaceExtended (
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpReadMachineSpecificRegister(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpWriteMachineSpecificRegister(
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpGetBusData (
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpSetBusData (
|
|
IN PDBGKD_MANIPULATE_STATE64 m,
|
|
IN PSTRING AdditionalData,
|
|
IN PCONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
KdpSendTraceData(
|
|
PSTRING Data
|
|
);
|
|
|
|
|
|
VOID
|
|
KdpSuspendBreakpoint (
|
|
ULONG Handle
|
|
);
|
|
|
|
VOID
|
|
KdpSuspendAllBreakpoints (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
KdpRestoreAllBreakpoints (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
KdpTimeSlipDpcRoutine (
|
|
PKDPC Dpc,
|
|
PVOID DeferredContext,
|
|
PVOID SystemArgument1,
|
|
PVOID SystemArgument2
|
|
);
|
|
|
|
VOID
|
|
KdpTimeSlipWork (
|
|
IN PVOID Context
|
|
);
|
|
|
|
//
|
|
// Routines shared between the debugger and
|
|
// NtSystemDebugControl.
|
|
//
|
|
|
|
VOID
|
|
KdpSysGetVersion(
|
|
PDBGKD_GET_VERSION64 Version
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysReadControlSpace(
|
|
ULONG Processor,
|
|
ULONG64 Address,
|
|
PVOID Buffer,
|
|
ULONG Request,
|
|
PULONG Actual
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysWriteControlSpace(
|
|
ULONG Processor,
|
|
ULONG64 Address,
|
|
PVOID Buffer,
|
|
ULONG Request,
|
|
PULONG Actual
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysReadIoSpace(
|
|
INTERFACE_TYPE InterfaceType,
|
|
ULONG BusNumber,
|
|
ULONG AddressSpace,
|
|
ULONG64 Address,
|
|
PVOID Buffer,
|
|
ULONG Request,
|
|
PULONG Actual
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysWriteIoSpace(
|
|
INTERFACE_TYPE InterfaceType,
|
|
ULONG BusNumber,
|
|
ULONG AddressSpace,
|
|
ULONG64 Address,
|
|
PVOID Buffer,
|
|
ULONG Request,
|
|
PULONG Actual
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysReadMsr(
|
|
ULONG Msr,
|
|
PULONG64 Data
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysWriteMsr(
|
|
ULONG Msr,
|
|
PULONG64 Data
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysReadBusData(
|
|
BUS_DATA_TYPE BusDataType,
|
|
ULONG BusNumber,
|
|
ULONG SlotNumber,
|
|
ULONG Address,
|
|
PVOID Buffer,
|
|
ULONG Request,
|
|
PULONG Actual
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysWriteBusData(
|
|
BUS_DATA_TYPE BusDataType,
|
|
ULONG BusNumber,
|
|
ULONG SlotNumber,
|
|
ULONG Address,
|
|
PVOID Buffer,
|
|
ULONG Request,
|
|
PULONG Actual
|
|
);
|
|
|
|
NTSTATUS
|
|
KdpSysCheckLowMemory(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Define dummy prototype so the address of the standard breakpoint instruction
|
|
// can be captured.
|
|
//
|
|
// N.B. This function is NEVER called.
|
|
//
|
|
|
|
VOID
|
|
RtlpBreakWithStatusInstruction (
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Define external references.
|
|
//
|
|
|
|
#define KDP_MESSAGE_BUFFER_SIZE 4096
|
|
|
|
extern BREAKPOINT_ENTRY KdpBreakpointTable[BREAKPOINT_TABLE_SIZE];
|
|
extern KD_REMOTE_FILE KdpRemoteFiles[KD_MAX_REMOTE_FILES];
|
|
extern KSPIN_LOCK KdpDebuggerLock;
|
|
extern PKDEBUG_ROUTINE KiDebugRoutine;
|
|
extern PKDEBUG_SWITCH_ROUTINE KiDebugSwitchRoutine;
|
|
extern KDP_BREAKPOINT_TYPE KdpBreakpointInstruction;
|
|
extern UCHAR DECLSPEC_ALIGN(8) KdpMessageBuffer[KDP_MESSAGE_BUFFER_SIZE];
|
|
extern UCHAR KdpPathBuffer[KDP_MESSAGE_BUFFER_SIZE];
|
|
extern BOOLEAN KdpOweBreakpoint;
|
|
|
|
extern LARGE_INTEGER KdPerformanceCounterRate;
|
|
extern LARGE_INTEGER KdTimerStart;
|
|
extern LARGE_INTEGER KdTimerStop;
|
|
extern LARGE_INTEGER KdTimerDifference;
|
|
|
|
extern ULONG KdComponentTableSize;
|
|
extern PULONG KdComponentTable[];
|
|
|
|
extern BOOLEAN BreakpointsSuspended;
|
|
extern LIST_ENTRY KdpDebuggerDataListHead;
|
|
|
|
typedef struct {
|
|
ULONG64 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
|
|
ULONG64 ReturnAddress; // return address (if not COUNTONLY)
|
|
} DBGKD_INTERNAL_BREAKPOINT, *PDBGKD_INTERNAL_BREAKPOINT;
|
|
|
|
|
|
extern DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS];
|
|
|
|
extern ULONG_PTR KdpCurrentSymbolStart;
|
|
extern ULONG_PTR KdpCurrentSymbolEnd;
|
|
extern LONG KdpNextCallLevelChange;
|
|
extern ULONG_PTR KdSpecialCalls[];
|
|
extern ULONG KdNumberOfSpecialCalls;
|
|
extern ULONG_PTR InitialSP;
|
|
extern ULONG KdpNumInternalBreakpoints;
|
|
extern KTIMER InternalBreakpointTimer;
|
|
extern KDPC InternalBreakpointCheckDpc;
|
|
extern BOOLEAN KdpPortLocked;
|
|
extern LARGE_INTEGER KdpTimeEntered;
|
|
|
|
extern DBGKD_TRACE_DATA TraceDataBuffer[];
|
|
extern ULONG TraceDataBufferPosition;
|
|
extern TRACE_DATA_SYM TraceDataSyms[];
|
|
extern UCHAR NextTraceDataSym;
|
|
extern UCHAR NumTraceDataSyms;
|
|
extern ULONG IntBPsSkipping;
|
|
extern BOOLEAN WatchStepOver;
|
|
extern BOOLEAN BreakPointTimerStarted;
|
|
extern PVOID WSOThread;
|
|
extern ULONG_PTR WSOEsp;
|
|
extern ULONG WatchStepOverHandle;
|
|
extern ULONG_PTR WatchStepOverBreakAddr;
|
|
extern BOOLEAN WatchStepOverSuspended;
|
|
extern ULONG InstructionsTraced;
|
|
extern BOOLEAN SymbolRecorded;
|
|
extern LONG CallLevelChange;
|
|
extern LONG_PTR oldpc;
|
|
extern BOOLEAN InstrCountInternal;
|
|
extern BOOLEAN BreakpointsSuspended;
|
|
extern BOOLEAN KdpControlCPressed;
|
|
extern KD_CONTEXT KdpContext;
|
|
|
|
extern KDP_BREAKPOINT_TYPE KdpBreakpointInstruction;
|
|
extern UCHAR KdPrintCircularBuffer[KDPRINTBUFFERSIZE];
|
|
extern PUCHAR KdPrintWritePointer;
|
|
extern ULONG KdPrintRolloverCount;
|
|
extern KSPIN_LOCK KdpPrintSpinLock;
|
|
extern KSPIN_LOCK KdpDataSpinLock;
|
|
extern LIST_ENTRY KdpDebuggerDataListHead;
|
|
extern DBGKD_GET_VERSION64 KdVersionBlock;
|
|
extern KDDEBUGGER_DATA64 KdDebuggerDataBlock;
|
|
extern KDPC KdpTimeSlipDpc;
|
|
extern WORK_QUEUE_ITEM KdpTimeSlipWorkItem;
|
|
extern KTIMER KdpTimeSlipTimer;
|
|
extern ULONG KdpTimeSlipPending;
|
|
extern KSPIN_LOCK KdpTimeSlipEventLock;
|
|
extern PVOID KdpTimeSlipEvent;
|
|
extern BOOLEAN KdpDebuggerStructuresInitialized;
|
|
extern ULONG KdEnteredDebugger;
|
|
|
|
//
|
|
// !search support (page hit database)
|
|
//
|
|
|
|
//
|
|
// Hit database where search results are stored (kddata.c).
|
|
// The debugger extensions know how to extract the information
|
|
// from here.
|
|
//
|
|
// Note that the size of the hit database is large enough to
|
|
// accomodate any searches because the !search extension works
|
|
// in batches of pages < PAGE_SIZE and for every page we register only
|
|
// one hit.
|
|
//
|
|
|
|
#define SEARCH_PAGE_HIT_DATABASE_SIZE PAGE_SIZE
|
|
|
|
extern PFN_NUMBER KdpSearchPageHits[SEARCH_PAGE_HIT_DATABASE_SIZE];
|
|
extern ULONG KdpSearchPageHitOffsets[SEARCH_PAGE_HIT_DATABASE_SIZE];
|
|
|
|
extern ULONG KdpSearchPageHitIndex;
|
|
|
|
//
|
|
// Set to true while a physical memory search is in progress.
|
|
// Reset at the end of the search. This is done in the debugger
|
|
// extension and it is a flag used by KdpCheckLowMemory to get
|
|
// onto a different code path.
|
|
//
|
|
|
|
extern LOGICAL KdpSearchInProgress;
|
|
|
|
//
|
|
// These variables store the current state of the search operation.
|
|
// They can be used to restore an interrupted search.
|
|
//
|
|
|
|
extern PFN_NUMBER KdpSearchStartPageFrame;
|
|
extern PFN_NUMBER KdpSearchEndPageFrame;
|
|
|
|
extern ULONG_PTR KdpSearchAddressRangeStart;
|
|
extern ULONG_PTR KdpSearchAddressRangeEnd;
|
|
|
|
extern PFN_NUMBER KdpSearchPfnValue;
|
|
|
|
//
|
|
// Checkpoint variable used to test if we have the right
|
|
// debugging symbols.
|
|
//
|
|
|
|
#define KDP_SEARCH_SYMBOL_CHECK 0xABCDDCBA
|
|
|
|
extern ULONG KdpSearchCheckPoint;
|
|
|
|
//
|
|
// Page search flags
|
|
//
|
|
|
|
#define KDP_SEARCH_ALL_OFFSETS_IN_PAGE 0x0001
|
|
|
|
|
|
|
|
//
|
|
// Private procedure prototypes
|
|
//
|
|
|
|
BOOLEAN
|
|
KdpAcquireBreakpoint(
|
|
IN ULONG Number
|
|
);
|
|
|
|
VOID
|
|
KdpInitCom(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
KdpPortLock(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
KdpPortUnlock(
|
|
VOID
|
|
);
|
|
|
|
BOOLEAN
|
|
KdpPollBreakInWithPortLock(
|
|
VOID
|
|
);
|
|
|
|
USHORT
|
|
KdpReceivePacketLeader (
|
|
IN ULONG PacketType,
|
|
OUT PULONG PacketLeader
|
|
);
|
|
|
|
#if DBG
|
|
|
|
#include <stdio.h>
|
|
#define DPRINT(s) KdpDprintf s
|
|
|
|
VOID
|
|
KdpDprintf(
|
|
IN PCHAR f,
|
|
...
|
|
);
|
|
|
|
#else
|
|
|
|
#define DPRINT(s)
|
|
|
|
#endif
|