windows-nt/Source/XPSP1/NT/base/ntos/kd64/kddata.c

452 lines
12 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1990-2001 Microsoft Corporation
Module Name:
kddata.c
Abstract:
This module contains global data for the portable kernel debgger.
Author:
Mark Lucovsky 1-Nov-1993
Revision History:
--*/
#include "kdp.h"
#include "ke.h"
#include "pool.h"
#include "stdio.h"
//
// Miscellaneous data from all over the kernel
//
extern PHANDLE_TABLE PspCidTable;
extern LIST_ENTRY ExpSystemResourcesList;
extern PPOOL_DESCRIPTOR ExpPagedPoolDescriptor;
extern ULONG ExpNumberOfPagedPools;
extern ULONG KeTimeIncrement;
extern LIST_ENTRY KeBugCheckCallbackListHead;
extern ULONG_PTR KiBugCheckData[];
extern LIST_ENTRY IopErrorLogListHead;
extern POBJECT_DIRECTORY ObpRootDirectoryObject;
extern POBJECT_TYPE ObpTypeObjectType;
extern PVOID MmSystemCacheStart;
extern PVOID MmSystemCacheEnd;
extern PVOID MmPfnDatabase;
extern ULONG MmSystemPtesStart[];
extern ULONG MmSystemPtesEnd[];
extern ULONG MmSubsectionBase;
extern ULONG MmNumberOfPagingFiles;
extern ULONG MmLowestPhysicalPage;
extern ULONG MmHighestPhysicalPage;
extern PFN_COUNT MmNumberOfPhysicalPages;
extern ULONG MmMaximumNonPagedPoolInBytes;
extern PVOID MmNonPagedSystemStart;
extern PVOID MmNonPagedPoolStart;
extern PVOID MmNonPagedPoolEnd;
extern PVOID MmPagedPoolStart;
extern PVOID MmPagedPoolEnd;
extern ULONG MmPagedPoolInfo[];
extern ULONG MmSizeOfPagedPoolInBytes;
extern ULONG MmTotalCommitLimit;
extern ULONG MmTotalCommittedPages;
extern ULONG MmSharedCommit;
extern ULONG MmDriverCommit;
extern ULONG MmProcessCommit;
extern ULONG MmPagedPoolCommit;
extern MMPFNLIST MmZeroedPageListHead;
extern MMPFNLIST MmFreePageListHead;
extern MMPFNLIST MmStandbyPageListHead;
extern MMPFNLIST MmModifiedPageListHead;
extern MMPFNLIST MmModifiedNoWritePageListHead;
extern ULONG MmAvailablePages;
extern LONG MmResidentAvailablePages;
extern LIST_ENTRY MmLoadedUserImageList;
extern PPOOL_TRACKER_TABLE PoolTrackTable;
extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
extern PUNLOADED_DRIVERS MmUnloadedDrivers;
extern ULONG MmLastUnloadedDriver;
extern ULONG MmTriageActionTaken;
extern ULONG MmSpecialPoolTag;
extern LOGICAL KernelVerifier;
extern PVOID MmVerifierData;
extern PFN_NUMBER MmAllocatedNonPagedPool;
extern SIZE_T MmPeakCommitment;
extern SIZE_T MmTotalCommitLimitMaximum;
extern ULONG_PTR MmSessionBase;
extern ULONG_PTR MmSessionSize;
#ifdef _IA64_
extern PFN_NUMBER MmSystemParentTablePage;
#endif
//
// These blocks of data needs to always be present because crashdumps
// need the information. Otherwise, things like PAGE_SIZE are not available
// in crashdumps, and extensions like !pool fail.
//
DBGKD_GET_VERSION64 KdVersionBlock = {
0,
0,
DBGKD_64BIT_PROTOCOL_VERSION2,
#if defined(_M_AMD64)
DBGKD_VERS_FLAG_PTR64 | DBGKD_VERS_FLAG_DATA,
IMAGE_FILE_MACHINE_AMD64,
#elif defined(_M_IX86)
DBGKD_VERS_FLAG_DATA,
IMAGE_FILE_MACHINE_I386,
#elif defined(_M_IA64)
DBGKD_VERS_FLAG_HSS| DBGKD_VERS_FLAG_PTR64 | DBGKD_VERS_FLAG_DATA,
IMAGE_FILE_MACHINE_IA64,
#endif
PACKET_TYPE_MAX,
0,
0,
0,
0,
0,
0,
0
};
KDDEBUGGER_DATA64 KdDebuggerDataBlock = {
{0}, // DBGKD_DEBUG_DATA_HEADER Header;
(ULONG64)0,
(ULONG64)RtlpBreakWithStatusInstruction,
(ULONG64)0,
(USHORT)FIELD_OFFSET(KTHREAD, CallbackStack), // USHORT ThCallbackStack;
#if defined(_AMD64_)
(USHORT)FIELD_OFFSET(KCALLOUT_FRAME, CallbackStack), // USHORT NextCallback;
#else
(USHORT)FIELD_OFFSET(KCALLOUT_FRAME, CbStk), // USHORT NextCallback;
#endif
#if defined(_X86_)
(USHORT)FIELD_OFFSET(KCALLOUT_FRAME, Ebp),
#else
(USHORT)0, // USHORT FramePointer;
#endif
#if defined(_X86PAE_) || defined(_AMD64_)
(USHORT)1,
#else
(USHORT)0, // USHORT PaeEnabled;
#endif
(ULONG64)KiCallUserMode,
(ULONG64)0,
(ULONG64)&PsLoadedModuleList,
(ULONG64)&PsActiveProcessHead,
(ULONG64)&PspCidTable,
(ULONG64)&ExpSystemResourcesList,
(ULONG64)&ExpPagedPoolDescriptor,
(ULONG64)&ExpNumberOfPagedPools,
(ULONG64)&KeTimeIncrement,
(ULONG64)&KeBugCheckCallbackListHead,
(ULONG64)KiBugCheckData,
(ULONG64)&IopErrorLogListHead,
(ULONG64)&ObpRootDirectoryObject,
(ULONG64)&ObpTypeObjectType,
(ULONG64)&MmSystemCacheStart,
(ULONG64)&MmSystemCacheEnd,
(ULONG64)&MmSystemCacheWs,
(ULONG64)&MmPfnDatabase,
(ULONG64)MmSystemPtesStart,
(ULONG64)MmSystemPtesEnd,
(ULONG64)&MmSubsectionBase,
(ULONG64)&MmNumberOfPagingFiles,
(ULONG64)&MmLowestPhysicalPage,
(ULONG64)&MmHighestPhysicalPage,
(ULONG64)&MmNumberOfPhysicalPages,
(ULONG64)&MmMaximumNonPagedPoolInBytes,
(ULONG64)&MmNonPagedSystemStart,
(ULONG64)&MmNonPagedPoolStart,
(ULONG64)&MmNonPagedPoolEnd,
(ULONG64)&MmPagedPoolStart,
(ULONG64)&MmPagedPoolEnd,
(ULONG64)&MmPagedPoolInfo,
(ULONG64)PAGE_SIZE,
(ULONG64)&MmSizeOfPagedPoolInBytes,
(ULONG64)&MmTotalCommitLimit,
(ULONG64)&MmTotalCommittedPages,
(ULONG64)&MmSharedCommit,
(ULONG64)&MmDriverCommit,
(ULONG64)&MmProcessCommit,
(ULONG64)&MmPagedPoolCommit,
(ULONG64)0,
(ULONG64)&MmZeroedPageListHead,
(ULONG64)&MmFreePageListHead,
(ULONG64)&MmStandbyPageListHead,
(ULONG64)&MmModifiedPageListHead,
(ULONG64)&MmModifiedNoWritePageListHead,
(ULONG64)&MmAvailablePages,
(ULONG64)&MmResidentAvailablePages,
(ULONG64)&PoolTrackTable,
(ULONG64)&NonPagedPoolDescriptor,
(ULONG64)&MmHighestUserAddress,
(ULONG64)&MmSystemRangeStart,
(ULONG64)&MmUserProbeAddress,
(ULONG64)KdPrintCircularBuffer,
(ULONG64)KdPrintCircularBuffer+sizeof(KdPrintCircularBuffer),
(ULONG64)&KdPrintWritePointer,
(ULONG64)&KdPrintRolloverCount,
(ULONG64)&MmLoadedUserImageList,
// Nt 5.1 additions
(ULONG64)NtBuildLab,
#if defined(_IA64_)
(ULONG64)KiNormalSystemCall,
#else
(ULONG64)0,
#endif
//
(ULONG64)KiProcessorBlock,
(ULONG64)&MmUnloadedDrivers,
(ULONG64)&MmLastUnloadedDriver,
(ULONG64)&MmTriageActionTaken,
(ULONG64)&MmSpecialPoolTag,
(ULONG64)&KernelVerifier,
(ULONG64)&MmVerifierData,
(ULONG64)&MmAllocatedNonPagedPool,
(ULONG64)&MmPeakCommitment,
(ULONG64)&MmTotalCommitLimitMaximum,
(ULONG64)&CmNtCSDVersion,
// Nt 5.1 additions
(ULONG64)&MmPhysicalMemoryBlock,
(ULONG64)&MmSessionBase,
(ULONG64)&MmSessionSize,
#ifdef _IA64_
(ULONG64)&MmSystemParentTablePage,
#else
0,
#endif
};
//
// Initialize the component name debug print filter table.
//
ULONG Kd_WIN2000_Mask = 1;
#include "dpfilter.c"
ULONG KdComponentTableSize = sizeof(KdComponentTable) / sizeof(PULONG);
//
// All dta from here on will be paged out if the kernel debugger is
// not enabled.
//
#ifdef _X86_
#ifdef ALLOC_PRAGMA
#pragma data_seg("PAGEKD")
#endif
#endif // _X86_
UCHAR KdPrintCircularBuffer[KDPRINTBUFFERSIZE] = {0};
PUCHAR KdPrintWritePointer = KdPrintCircularBuffer;
ULONG KdPrintRolloverCount = 0;
BREAKPOINT_ENTRY KdpBreakpointTable[BREAKPOINT_TABLE_SIZE] = {0};
// The message buffer needs to be 64-bit aligned.
UCHAR DECLSPEC_ALIGN(8) KdpMessageBuffer[KDP_MESSAGE_BUFFER_SIZE] = {0};
UCHAR KdpPathBuffer[KDP_MESSAGE_BUFFER_SIZE] = {0};
DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS] = {0};
KD_REMOTE_FILE KdpRemoteFiles[KD_MAX_REMOTE_FILES];
LARGE_INTEGER KdPerformanceCounterRate = {0,0};
LARGE_INTEGER KdTimerStart = {0,0} ;
LARGE_INTEGER KdTimerStop = {0,0};
LARGE_INTEGER KdTimerDifference = {0,0};
ULONG_PTR KdpCurrentSymbolStart = 0;
ULONG_PTR KdpCurrentSymbolEnd = 0;
LONG KdpNextCallLevelChange = 0; // used only over returns to the debugger.
ULONG_PTR KdSpecialCalls[DBGKD_MAX_SPECIAL_CALLS] = {0};
ULONG KdNumberOfSpecialCalls = 0;
ULONG_PTR InitialSP = 0;
ULONG KdpNumInternalBreakpoints = 0;
KTIMER InternalBreakpointTimer = {0};
KDPC InternalBreakpointCheckDpc = {0};
BOOLEAN KdpPortLocked = FALSE;
DBGKD_TRACE_DATA TraceDataBuffer[TRACE_DATA_BUFFER_MAX_SIZE] = {0};
ULONG TraceDataBufferPosition = 1; // Element # to write next
// Recall elt 0 is a length
TRACE_DATA_SYM TraceDataSyms[256] = {0};
UCHAR NextTraceDataSym = 0; // what's the next one to be replaced
UCHAR NumTraceDataSyms = 0; // how many are valid?
ULONG IntBPsSkipping = 0; // number of exceptions that are being skipped
// now
BOOLEAN WatchStepOver = FALSE;
BOOLEAN BreakPointTimerStarted = FALSE;
PVOID WSOThread = NULL; // thread doing stepover
ULONG_PTR WSOEsp = 0; // stack pointer of thread doing stepover (yes, we need it)
ULONG WatchStepOverHandle = 0;
ULONG_PTR WatchStepOverBreakAddr = 0; // where the WatchStepOver break is set
BOOLEAN WatchStepOverSuspended = FALSE;
ULONG InstructionsTraced = 0;
BOOLEAN SymbolRecorded = FALSE;
LONG CallLevelChange = 0;
LONG_PTR oldpc = 0;
BOOLEAN InstrCountInternal = FALSE; // Processing a non-COUNTONLY?
BOOLEAN BreakpointsSuspended = FALSE;
BOOLEAN KdpControlCPressed = FALSE;
KDP_BREAKPOINT_TYPE KdpBreakpointInstruction = KDP_BREAKPOINT_VALUE;
KD_CONTEXT KdpContext;
LIST_ENTRY KdpDebuggerDataListHead = {NULL,NULL};
//
// !search support variables (page hit database)
//
PFN_NUMBER KdpSearchPageHits [SEARCH_PAGE_HIT_DATABASE_SIZE] = {0};
ULONG KdpSearchPageHitOffsets [SEARCH_PAGE_HIT_DATABASE_SIZE] = {0};
ULONG KdpSearchPageHitIndex = 0;
LOGICAL KdpSearchInProgress = FALSE;
PFN_NUMBER KdpSearchStartPageFrame = 0;
PFN_NUMBER KdpSearchEndPageFrame = 0;
ULONG_PTR KdpSearchAddressRangeStart = 0;
ULONG_PTR KdpSearchAddressRangeEnd = 0;
PFN_NUMBER KdpSearchPfnValue = 0;
ULONG KdpSearchCheckPoint = KDP_SEARCH_SYMBOL_CHECK;
BOOLEAN KdpDebuggerStructuresInitialized = FALSE ;
#ifdef _X86_
#ifdef ALLOC_PRAGMA
#pragma data_seg()
#endif
#endif // _X86_
KSPIN_LOCK KdpPrintSpinLock = 0;
KSPIN_LOCK KdpDataSpinLock = 0;
KSPIN_LOCK KdpTimeSlipEventLock = 0;
PVOID KdpTimeSlipEvent = NULL;
KDPC KdpTimeSlipDpc = {0};
WORK_QUEUE_ITEM KdpTimeSlipWorkItem = {NULL};
KTIMER KdpTimeSlipTimer = {0};
ULONG KdpTimeSlipPending = 1;
BOOLEAN KdDebuggerNotPresent = FALSE;
BOOLEAN KdDebuggerEnabled = FALSE;
BOOLEAN KdPitchDebugger = TRUE;
BOOLEAN KdpOweBreakpoint = FALSE;
ULONG KdEnteredDebugger = FALSE;
#if defined(_AMD64_)
//
// No checks for now.
//
#elif defined(_X86_)
C_ASSERT(sizeof(KPRCB) == X86_NT51_KPRCB_SIZE);
C_ASSERT(sizeof(EPROCESS) == X86_NT51_EPROCESS_SIZE);
C_ASSERT(FIELD_OFFSET(EPROCESS, Peb) == X86_PEB_IN_EPROCESS);
#if !defined (PERF_DATA)
C_ASSERT(sizeof(ETHREAD) == X86_ETHREAD_SIZE);
#endif
C_ASSERT(sizeof(CONTEXT) == sizeof(X86_NT5_CONTEXT));
C_ASSERT(FIELD_OFFSET(KTHREAD, NextProcessor) == X86_NT51_KTHREAD_NEXTPROCESSOR_OFFSET);
#elif defined(_IA64_)
C_ASSERT(sizeof(KPRCB) == IA64_KPRCB_SIZE);
C_ASSERT(sizeof(EPROCESS) == IA64_EPROCESS_SIZE);
C_ASSERT(FIELD_OFFSET(EPROCESS, Peb) == IA64_2259_PEB_IN_EPROCESS);
#if !defined (PERF_DATA)
C_ASSERT(sizeof(ETHREAD) == IA64_ETHREAD_SIZE);
#endif
C_ASSERT(sizeof(CONTEXT) == sizeof(IA64_CONTEXT));
C_ASSERT(FIELD_OFFSET(KTHREAD, NextProcessor) == IA64_KTHREAD_NEXTPROCESSOR_OFFSET);
#include <ia64\miia64.h>
C_ASSERT(IA64_PAGE_SIZE == PAGE_SIZE);
C_ASSERT(IA64_PAGE_SHIFT == PAGE_SHIFT);
C_ASSERT(IA64_MM_PTE_TRANSITION_MASK == MM_PTE_TRANSITION_MASK);
C_ASSERT(IA64_MM_PTE_PROTOTYPE_MASK == MM_PTE_PROTOTYPE_MASK);
#else
#error "no target architecture"
#endif