windows-nt/Source/XPSP1/NT/base/ntos/kd64/kdp.h

951 lines
20 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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