ReactOS 0.4.16-dev-746-g329a414
kdapi.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for kdapi.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID NTAPI PspDumpThreads (BOOLEAN SystemThreads)
 
VOID NTAPI KdpMoveMemory (_In_ PVOID Destination, _In_ PVOID Source, _In_ SIZE_T Length)
 
VOID NTAPI KdpZeroMemory (_In_ PVOID Destination, _In_ SIZE_T Length)
 
NTSTATUS NTAPI KdpCopyMemoryChunks (_In_ ULONG64 Address, _In_ PVOID Buffer, _In_ ULONG TotalSize, _In_ ULONG ChunkSize, _In_ ULONG Flags, _Out_opt_ PULONG ActualSize)
 
VOID NTAPI KdpQueryMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context)
 
VOID NTAPI KdpSearchMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpFillMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteBreakpoint (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpRestoreBreakpoint (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
NTSTATUS NTAPI KdpWriteBreakPointEx (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpRestoreBreakPointEx (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteCustomBreakpoint (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI DumpTraceData (IN PSTRING TraceData)
 
VOID NTAPI KdpSetCommonState (IN ULONG NewState, IN PCONTEXT Context, IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange)
 
VOID NTAPI KdpSysGetVersion (_Out_ PDBGKD_GET_VERSION64 Version)
 
VOID NTAPI KdpGetVersion (IN PDBGKD_MANIPULATE_STATE64 State)
 
VOID NTAPI KdpReadVirtualMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteVirtualMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpReadPhysicalMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWritePhysicalMemory (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpReadControlSpace (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteControlSpace (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpGetContext (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpSetContext (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpGetContextEx (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpSetContextEx (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpCauseBugCheck (IN PDBGKD_MANIPULATE_STATE64 State)
 
VOID NTAPI KdpReadMachineSpecificRegister (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteMachineSpecificRegister (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpGetBusData (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpSetBusData (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpReadIoSpace (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteIoSpace (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpReadIoSpaceExtended (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpWriteIoSpaceExtended (IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
 
VOID NTAPI KdpCheckLowMemory (IN PDBGKD_MANIPULATE_STATE64 State)
 
VOID NTAPI KdpNotSupported (IN PDBGKD_MANIPULATE_STATE64 State)
 
static KCONTINUE_STATUS KdpSwitchProcessor (_In_ USHORT ProcessorIndex)
 
KCONTINUE_STATUS NTAPI KdpSendWaitContinue (IN ULONG PacketType, IN PSTRING SendHeader, IN PSTRING SendData OPTIONAL, IN OUT PCONTEXT Context)
 
VOID NTAPI KdpReportLoadSymbolsStateChange (IN PSTRING PathName, IN PKD_SYMBOLS_INFO SymbolInfo, IN BOOLEAN Unload, IN OUT PCONTEXT Context)
 
VOID NTAPI KdpReportCommandStringStateChange (IN PSTRING NameString, IN PSTRING CommandString, IN OUT PCONTEXT Context)
 
BOOLEAN NTAPI KdpReportExceptionStateChange (IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT Context, IN BOOLEAN SecondChanceException)
 
KCONTINUE_STATUS NTAPI KdReportProcessorChange (VOID)
 
VOID NTAPI KdpTimeSlipDpcRoutine (IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
 
VOID NTAPI KdpTimeSlipWork (IN PVOID Context)
 
LARGE_INTEGER NTAPI KdpQueryPerformanceCounter (IN PKTRAP_FRAME TrapFrame)
 
BOOLEAN NTAPI KdEnterDebugger (IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
 
VOID NTAPI KdExitDebugger (IN BOOLEAN Enable)
 
NTSTATUS NTAPI KdEnableDebuggerWithLock (IN BOOLEAN NeedLock)
 
NTSTATUS NTAPI KdDisableDebuggerWithLock (IN BOOLEAN NeedLock)
 
NTSTATUS NTAPI KdEnableDebugger (VOID)
 
NTSTATUS NTAPI KdDisableDebugger (VOID)
 
NTSTATUS NTAPI KdSystemDebugControl (_In_ SYSDBG_COMMAND Command, _In_reads_bytes_(InputBufferLength) PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_writes_bytes_(OutputBufferLength) PVOID OutputBuffer, _In_ ULONG OutputBufferLength, _Out_opt_ PULONG ReturnLength, _In_ KPROCESSOR_MODE PreviousMode)
 Perform various queries to the kernel debugger.
 
NTSTATUS NTAPI KdChangeOption (IN KD_OPTION Option, IN ULONG InBufferBytes OPTIONAL, IN PVOID InBuffer, IN ULONG OutBufferBytes OPTIONAL, OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL)
 
NTSTATUS NTAPI KdPowerTransition (IN DEVICE_POWER_STATE NewState)
 
BOOLEAN NTAPI KdRefreshDebuggerNotPresent (VOID)
 
NTSTATUS NTAPI NtQueryDebugFilterState (_In_ ULONG ComponentId, _In_ ULONG Level)
 
NTSTATUS NTAPI NtSetDebugFilterState (_In_ ULONG ComponentId, _In_ ULONG Level, _In_ BOOLEAN State)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 18 of file kdapi.c.

Function Documentation

◆ DumpTraceData()

VOID NTAPI DumpTraceData ( IN PSTRING  TraceData)

Definition at line 371 of file kdapi.c.

372{
373 /* Update the buffer */
375
376 /* Setup the trace data */
377 TraceData->Length = (USHORT)(TraceDataBufferPosition * sizeof(ULONG));
378 TraceData->Buffer = (PCHAR)TraceDataBuffer;
379
380 /* Reset the buffer location */
382}
ULONG TraceDataBufferPosition
Definition: kddata.c:110
ULONG TraceDataBuffer[40]
Definition: kddata.c:109
#define PCHAR
Definition: match.c:90
unsigned short USHORT
Definition: pedump.c:61
uint32_t ULONG
Definition: typedefs.h:59

Referenced by KdpReportExceptionStateChange().

◆ KdChangeOption()

NTSTATUS NTAPI KdChangeOption ( IN KD_OPTION  Option,
IN ULONG InBufferBytes  OPTIONAL,
IN PVOID  InBuffer,
IN ULONG OutBufferBytes  OPTIONAL,
OUT PVOID  OutBuffer,
OUT PULONG OutBufferNeeded  OPTIONAL 
)

Definition at line 2594 of file kdapi.c.

2600{
2601 /* Fail if there is no debugger */
2602 if (KdPitchDebugger)
2603 {
2604 /* No debugger, no options */
2606 }
2607
2608 /* Do we recognize this option? */
2609 if (Option != KD_OPTION_SET_BLOCK_ENABLE)
2610 {
2611 /* We don't, clear the output length and fail */
2612 if (OutBufferNeeded) *OutBufferNeeded = 0;
2614 }
2615
2616 /* Verify parameters */
2617 if ((InBufferBytes != sizeof(BOOLEAN)) ||
2618 (OutBufferBytes != 0) ||
2619 (OutBuffer != NULL))
2620 {
2621 /* Invalid parameters for this option, fail */
2623 }
2624
2625 /*
2626 * Check if the high bit is set, meaning we don't
2627 * allow the debugger to be enabled
2628 */
2629 if (KdBlockEnable & 0x80)
2630 {
2631 /* Fail regardless of what state the caller tried to set */
2633 }
2634
2635 /* Set the new block enable state */
2636 KdBlockEnable = *(PBOOLEAN)InBuffer;
2637
2638 /* No output buffer required for this option */
2639 if (OutBufferNeeded) *OutBufferNeeded = 0;
2640
2641 /* We are done */
2642 return STATUS_SUCCESS;
2643}
unsigned char BOOLEAN
#define NULL
Definition: types.h:112
BOOLEAN KdPitchDebugger
Definition: kddata.c:80
BOOLEAN KdBlockEnable
Definition: kddata.c:84
#define STATUS_DEBUGGER_INACTIVE
Definition: debugger.c:30
#define STATUS_ACCESS_VIOLATION
Definition: ntstatus.h:242
#define STATUS_INVALID_INFO_CLASS
Definition: ntstatus.h:240
_In_ UCHAR _In_ ULONG _Out_ PUCHAR _Outptr_result_bytebuffer_ OutBufferLength PVOID * OutBuffer
Definition: scsi.h:4071
#define STATUS_SUCCESS
Definition: shellext.h:65
unsigned char * PBOOLEAN
Definition: typedefs.h:53
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
@ KD_OPTION_SET_BLOCK_ENABLE
Definition: ketypes.h:524

Referenced by NtSystemDebugControl().

◆ KdDisableDebugger()

NTSTATUS NTAPI KdDisableDebugger ( VOID  )

Definition at line 2169 of file kdapi.c.

2170{
2171 /* Use the internal routine */
2173}
#define TRUE
Definition: types.h:120
NTSTATUS NTAPI KdDisableDebuggerWithLock(IN BOOLEAN NeedLock)
Definition: kdapi.c:2063

Referenced by NtSystemDebugControl(), and PcipGetFunctionLimits().

◆ KdDisableDebuggerWithLock()

NTSTATUS NTAPI KdDisableDebuggerWithLock ( IN BOOLEAN  NeedLock)

Definition at line 2063 of file kdapi.c.

2064{
2065 KIRQL OldIrql;
2067
2068#if defined(__GNUC__)
2069 /* Make gcc happy */
2071#endif
2072
2073 /*
2074 * If enabling the debugger is blocked
2075 * then there is nothing to disable (duh)
2076 */
2077 if (KdBlockEnable)
2078 {
2079 /* Fail */
2080 return STATUS_ACCESS_DENIED;
2081 }
2082
2083 /* Check if we need to acquire the lock */
2084 if (NeedLock)
2085 {
2086 /* Lock the port */
2088 KdpPortLock();
2089 }
2090
2091 /* Check if we're not disabled */
2092 if (!KdDisableCount)
2093 {
2094 /* Check if the debugger was never actually initialized */
2096 {
2097 /* It wasn't, so don't re-enable it later */
2099 }
2100 else
2101 {
2102 /* It was, so we will re-enable it later */
2104 }
2105
2106 /* Check if we were called from the exported API and are enabled */
2107 if ((NeedLock) && (KdPreviouslyEnabled))
2108 {
2109 /* Check if it is safe to disable the debugger */
2111 if (!NT_SUCCESS(Status))
2112 {
2113 /* Release the lock and fail */
2114 KdpPortUnlock();
2116 return Status;
2117 }
2118 }
2119
2120 /* Only disable the debugger if it is enabled */
2122 {
2123 /*
2124 * Disable the debugger; suspend breakpoints
2125 * and reset the debug stub
2126 */
2129
2130 /* We are disabled now */
2132 SharedUserData->KdDebuggerEnabled = FALSE;
2133 }
2134 }
2135
2136 /* Increment the disable count */
2138
2139 /* Check if we had locked the port before */
2140 if (NeedLock)
2141 {
2142 /* Yes, now unlock it */
2143 KdpPortUnlock();
2145 }
2146
2147 /* We're done */
2148 return STATUS_SUCCESS;
2149}
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define KeRaiseIrql(irql, oldIrql)
Definition: env_spec_w32.h:597
#define KeLowerIrql(oldIrql)
Definition: env_spec_w32.h:602
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
Status
Definition: gdiplustypes.h:25
BOOLEAN KdPreviouslyEnabled
Definition: kddata.c:86
VOID NTAPI KdpPortLock(VOID)
Definition: kdlock.c:19
ULONG KdDisableCount
Definition: kddata.c:89
PKDEBUG_ROUTINE KiDebugRoutine
Definition: kddata.c:74
VOID NTAPI KdpPortUnlock(VOID)
Definition: kdlock.c:27
BOOLEAN NTAPI KdpStub(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChanceException)
Definition: kdtrap.c:266
NTSTATUS NTAPI KdpAllowDisable(VOID)
Definition: kdx64.c:372
VOID NTAPI KdpSuspendAllBreakPoints(VOID)
Definition: kdbreak.c:407
BOOLEAN KdDebuggerEnabled
Definition: kddata.c:82
#define SharedUserData
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by KdDisableDebugger(), and KdInitSystem().

◆ KdEnableDebugger()

NTSTATUS NTAPI KdEnableDebugger ( VOID  )

Definition at line 2158 of file kdapi.c.

2159{
2160 /* Use the internal routine */
2162}
NTSTATUS NTAPI KdEnableDebuggerWithLock(IN BOOLEAN NeedLock)
Definition: kdapi.c:1987

Referenced by KdpStub(), NtSystemDebugControl(), and PcipGetFunctionLimits().

◆ KdEnableDebuggerWithLock()

NTSTATUS NTAPI KdEnableDebuggerWithLock ( IN BOOLEAN  NeedLock)

Definition at line 1987 of file kdapi.c.

1988{
1989 KIRQL OldIrql;
1990
1991#if defined(__GNUC__)
1992 /* Make gcc happy */
1994#endif
1995
1996 /* Check if enabling the debugger is blocked */
1997 if (KdBlockEnable)
1998 {
1999 /* It is, fail the enable */
2000 return STATUS_ACCESS_DENIED;
2001 }
2002
2003 /* Check if we need to acquire the lock */
2004 if (NeedLock)
2005 {
2006 /* Lock the port */
2008 KdpPortLock();
2009 }
2010
2011 /* Check if we're not disabled */
2012 if (!KdDisableCount)
2013 {
2014 /* Check if we had locked the port before */
2015 if (NeedLock)
2016 {
2017 /* Do the unlock */
2018 KdpPortUnlock();
2020
2021 /* Fail: We're already enabled */
2023 }
2024 else
2025 {
2026 /*
2027 * This can only happen if we are called from a bugcheck
2028 * and were never initialized, so initialize the debugger now.
2029 */
2030 KdInitSystem(0, NULL);
2031
2032 /* Return success since we initialized */
2033 return STATUS_SUCCESS;
2034 }
2035 }
2036
2037 /* Decrease the disable count */
2038 if (!(--KdDisableCount))
2039 {
2040 /* We're now enabled again! Were we enabled before, too? */
2042 {
2043 /* Reinitialize the Debugger */
2044 KdInitSystem(0, NULL);
2046 }
2047 }
2048
2049 /* Check if we had locked the port before */
2050 if (NeedLock)
2051 {
2052 /* Yes, now unlock it */
2053 KdpPortUnlock();
2055 }
2056
2057 /* We're done */
2058 return STATUS_SUCCESS;
2059}
BOOLEAN NTAPI KdInitSystem(_In_ ULONG BootPhase, _In_opt_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kdinit.c:164
VOID NTAPI KdpRestoreAllBreakpoints(VOID)
Definition: kdbreak.c:368

Referenced by KdEnableDebugger(), and KeBugCheckWithTf().

◆ KdEnterDebugger()

BOOLEAN NTAPI KdEnterDebugger ( IN PKTRAP_FRAME  TrapFrame,
IN PKEXCEPTION_FRAME  ExceptionFrame 
)

Definition at line 1898 of file kdapi.c.

1900{
1902
1903 /* Check if we have a trap frame */
1904 if (TrapFrame)
1905 {
1906 /* Calculate the time difference for the enter */
1910 }
1911 else
1912 {
1913 /* No trap frame, so can't calculate */
1915 }
1916
1917 /* Save the current IRQL */
1918 KeGetCurrentPrcb()->DebuggerSavedIRQL = KeGetCurrentIrql();
1919
1920 /* Freeze all CPUs, raising also the IRQL to HIGH_LEVEL */
1921 Enable = KeFreezeExecution(TrapFrame, ExceptionFrame);
1922
1923 /* Lock the port, save its state and set the debugger entered flag */
1925 KdSave(FALSE);
1927
1928 /* Check freeze flag */
1929 if (KiFreezeFlag & 1)
1930 {
1931 /* Print out errror */
1932 KdpDprintf("FreezeLock was jammed! Backup SpinLock was used!\n");
1933 }
1934
1935 /* Check processor state */
1936 if (KiFreezeFlag & 2)
1937 {
1938 /* Print out errror */
1939 KdpDprintf("Some processors not frozen in debugger!\n");
1940 }
1941
1942 /* Make sure we acquired the port */
1943 if (!KdpPortLocked) KdpDprintf("Port lock was not acquired!\n");
1944
1945 /* Return if interrupts needs to be re-enabled */
1946 return Enable;
1947}
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
LARGE_INTEGER KdTimerStop
Definition: kddata.c:121
BOOLEAN KdEnteredDebugger
Definition: kddata.c:88
LARGE_INTEGER KdTimerStart
Definition: kd64.h:541
KSPIN_LOCK KdpDebuggerLock
Definition: kddata.c:67
BOOLEAN KdpPortLocked
Definition: kddata.c:66
LARGE_INTEGER KdTimerDifference
Definition: kd64.h:541
LARGE_INTEGER NTAPI KdpQueryPerformanceCounter(IN PKTRAP_FRAME TrapFrame)
Definition: kdapi.c:1881
NTSTATUS NTAPI KdSave(IN BOOLEAN SleepTransition)
Definition: kdcom.c:113
#define KdpDprintf(...)
Definition: mmdbg.c:19
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1182
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN Enable
Definition: ntddpcm.h:142
ULONG KiFreezeFlag
Definition: freeze.c:20
BOOLEAN NTAPI KeFreezeExecution(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
Definition: freeze.c:26
BOOLEAN FASTCALL KeTryToAcquireSpinLockAtDpcLevel(IN OUT PKSPIN_LOCK SpinLock)
Definition: spinlock.c:309
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by KdpCommandString(), KdpPrint(), KdpPrompt(), KdpReport(), KdpSymbol(), KdRefreshDebuggerNotPresent(), and KdSetOwedBreakpoints().

◆ KdExitDebugger()

VOID NTAPI KdExitDebugger ( IN BOOLEAN  Enable)

Definition at line 1951 of file kdapi.c.

1952{
1953 ULONG TimeSlip;
1954
1955 /* Reset the debugger entered flag, restore the port state and unlock it */
1959
1960 /* Unfreeze the CPUs, restoring also the IRQL */
1962
1963 /* Compare time with the one from KdEnterDebugger */
1964 if (!KdTimerStop.QuadPart)
1965 {
1966 /* We didn't get a trap frame earlier in so never got the time */
1968 }
1969 else
1970 {
1971 /* Query the timer */
1973 }
1974
1975 /* Check if a Time Slip was on queue */
1977 if (TimeSlip == 1)
1978 {
1979 /* Queue a DPC for the time slip */
1981 KeInsertQueueDpc(&KdpTimeSlipDpc, NULL, NULL); // FIXME: this can trigger context switches!
1982 }
1983}
#define InterlockedIncrement
Definition: armddk.h:53
BOOLEAN NTAPI KeInsertQueueDpc(IN PKDPC Dpc, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:725
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
LONG KdpTimeSlipPending
Definition: kddata.c:118
KDPC KdpTimeSlipDpc
Definition: kddata.c:115
NTSTATUS NTAPI KdRestore(IN BOOLEAN SleepTransition)
Definition: kdcom.c:121
VOID NTAPI KeThawExecution(IN BOOLEAN Enable)
Definition: freeze.c:65

Referenced by KdpCommandString(), KdpPrint(), KdpPrompt(), KdpReport(), KdpSymbol(), KdRefreshDebuggerNotPresent(), and KdSetOwedBreakpoints().

◆ KdpCauseBugCheck()

VOID NTAPI KdpCauseBugCheck ( IN PDBGKD_MANIPULATE_STATE64  State)

Definition at line 950 of file kdapi.c.

951{
952 /* Crash with the special code */
953 KeBugCheck(MANUALLY_INITIATED_CRASH);
954}
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1434

Referenced by KdpSendWaitContinue().

◆ KdpCheckLowMemory()

VOID NTAPI KdpCheckLowMemory ( IN PDBGKD_MANIPULATE_STATE64  State)

Definition at line 1220 of file kdapi.c.

1221{
1222 STRING Header;
1223
1224 /* Setup the header */
1225 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1226 Header.Buffer = (PCHAR)State;
1227
1228 /* Call the internal routine */
1230
1231 /* Send the reply */
1233 &Header,
1234 NULL,
1235 &KdpContext);
1236}
Definition: Header.h:9
std::wstring STRING
Definition: fontsub.cpp:33
NTSTATUS NTAPI KdpSysCheckLowMemory(IN ULONG Flags)
Definition: kdx64.c:364
KD_CONTEXT KdpContext
Definition: kddata.c:65
VOID NTAPI KdSendPacket(IN ULONG PacketType, IN PSTRING MessageHeader, IN PSTRING MessageData, IN OUT PKD_CONTEXT KdContext)
Definition: kddll.c:314
#define MMDBG_COPY_UNSAFE
Definition: mm.h:77
#define PACKET_TYPE_KD_STATE_MANIPULATE
Definition: windbgkd.h:43
struct _DBGKD_MANIPULATE_STATE64 DBGKD_MANIPULATE_STATE64

Referenced by KdpSendWaitContinue().

◆ KdpCopyMemoryChunks()

NTSTATUS NTAPI KdpCopyMemoryChunks ( _In_ ULONG64  Address,
_In_ PVOID  Buffer,
_In_ ULONG  TotalSize,
_In_ ULONG  ChunkSize,
_In_ ULONG  Flags,
_Out_opt_ PULONG  ActualSize 
)

Definition at line 55 of file kdapi.c.

62{
64 ULONG RemainingLength, CopyChunk;
65
66 /* Check if we didn't get a chunk size or if it is too big */
67 if (ChunkSize == 0)
68 {
69 /* Default to 4 byte chunks */
70 ChunkSize = 4;
71 }
73 {
74 /* Normalize to maximum size */
76 }
77
78 /* Copy the whole range in aligned chunks */
79 RemainingLength = TotalSize;
80 CopyChunk = 1;
81 while (RemainingLength > 0)
82 {
83 /*
84 * Determine the best chunk size for this round.
85 * The ideal size is aligned, isn't larger than the
86 * the remaining length and respects the chunk limit.
87 */
88 while (((CopyChunk * 2) <= RemainingLength) &&
89 (CopyChunk < ChunkSize) &&
90 ((Address & ((CopyChunk * 2) - 1)) == 0))
91 {
92 /* Increase it */
93 CopyChunk *= 2;
94 }
95
96 /*
97 * The chunk size can be larger than the remaining size if this
98 * isn't the first round, so check if we need to shrink it back.
99 */
100 while (CopyChunk > RemainingLength)
101 {
102 /* Shrink it */
103 CopyChunk /= 2;
104 }
105
106 /* Do the copy */
107 Status = MmDbgCopyMemory(Address, Buffer, CopyChunk, Flags);
108 if (!NT_SUCCESS(Status))
109 {
110 /* Copy failed, break out */
111 break;
112 }
113
114 /* Update pointers and length for the next run */
115 Address = Address + CopyChunk;
116 Buffer = (PVOID)((ULONG_PTR)Buffer + CopyChunk);
117 RemainingLength = RemainingLength - CopyChunk;
118 }
119
120 /* We may have modified executable code, flush the instruction cache */
121 KeSweepICache((PVOID)(ULONG_PTR)Address, TotalSize);
122
123 /*
124 * Return the size we managed to copy and return
125 * success if we could copy the whole range.
126 */
127 if (ActualSize) *ActualSize = TotalSize - RemainingLength;
128 return RemainingLength == 0 ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
129}
Definition: bufpool.h:45
FORCEINLINE VOID KeSweepICache(IN PVOID BaseAddress, IN SIZE_T FlushSize)
Definition: ke.h:280
#define MMDBG_COPY_MAX_SIZE
Definition: mm.h:85
NTSTATUS NTAPI MmDbgCopyMemory(IN ULONG64 Address, IN PVOID Buffer, IN ULONG Size, IN ULONG Flags)
Definition: mmdbg.c:124
static WCHAR Address[46]
Definition: ping.c:68
void * PVOID
Definition: typedefs.h:50
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR _Out_ PULONG ChunkSize
Definition: rtlfuncs.h:2294

Referenced by KdbpSafeReadMemory(), KdbpSafeWriteMemory(), KdpAddBreakpoint(), KdpLowRestoreBreakpoint(), KdpLowWriteContent(), KdpReadPhysicalMemory(), KdpReadVirtualMemory(), KdpReportCommandStringStateChange(), KdpReportLoadSymbolsStateChange(), KdpSetCommonState(), KdpSysReadControlSpace(), KdpSysWriteControlSpace(), KdpWritePhysicalMemory(), KdpWriteVirtualMemory(), KdSetOwedBreakpoints(), and KdSystemDebugControl().

◆ KdpFillMemory()

VOID NTAPI KdpFillMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 214 of file kdapi.c.

217{
218 //PDBGKD_FILL_MEMORY FillMemory = &State->u.FillMemory;
220
221 /* TODO */
222 KdpDprintf("Memory Fill support is unimplemented!\n");
223
224 /* Send a failure packet */
225 State->ReturnStatus = STATUS_UNSUCCESSFUL;
226 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
227 Header.Buffer = (PCHAR)State;
229 &Header,
230 NULL,
231 &KdpContext);
232}

Referenced by KdpSendWaitContinue().

◆ KdpGetBusData()

VOID NTAPI KdpGetBusData ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 1014 of file kdapi.c.

1017{
1018 STRING Header;
1019 PDBGKD_GET_SET_BUS_DATA GetBusData = &State->u.GetSetBusData;
1020 ULONG Length;
1021
1022 /* Setup the header */
1023 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1024 Header.Buffer = (PCHAR)State;
1025 ASSERT(Data->Length == 0);
1026
1027 /* Check the length requested */
1028 Length = GetBusData->Length;
1030 {
1031 /* Use maximum allowed */
1033 }
1034
1035 /* Call the internal routine */
1036 State->ReturnStatus = KdpSysReadBusData(GetBusData->BusDataType,
1037 GetBusData->BusNumber,
1038 GetBusData->SlotNumber,
1039 GetBusData->Offset,
1040 Data->Buffer,
1041 Length,
1042 &Length);
1043
1044 /* Return the actual length read */
1045 GetBusData->Length = Length;
1046 Data->Length = (USHORT)Length;
1047
1048 /* Send the reply */
1050 &Header,
1051 Data,
1052 &KdpContext);
1053}
NTSTATUS NTAPI KdpSysReadBusData(_In_ BUS_DATA_TYPE BusDataType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _In_ ULONG Offset, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:136
#define ASSERT(a)
Definition: mode.c:44
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define PACKET_MAX_SIZE
Definition: windbgkd.h:18

Referenced by KdpSendWaitContinue().

◆ KdpGetContext()

VOID NTAPI KdpGetContext ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 719 of file kdapi.c.

722{
725
726 /* Setup the header */
727 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
728 Header.Buffer = (PCHAR)State;
729 ASSERT(Data->Length == 0);
730
731 /* Make sure that this is a valid request */
732 if (State->Processor < KeNumberProcessors)
733 {
734 /* Check if the request is for this CPU */
735 if (State->Processor == KeGetCurrentPrcb()->Number)
736 {
737 /* We're just copying our own context */
739 }
740 else
741 {
742 /* Get the context from the PRCB array */
743 TargetContext = &KiProcessorBlock[State->Processor]->
744 ProcessorState.ContextFrame;
745 }
746
747 /* Copy it over to the debugger */
748 KdpMoveMemory(Data->Buffer,
750 sizeof(CONTEXT));
751 Data->Length = sizeof(CONTEXT);
752
753 /* Let the debugger set the context now */
755
756 /* Finish up */
757 State->ReturnStatus = STATUS_SUCCESS;
758 }
759 else
760 {
761 /* Invalid request */
762 State->ReturnStatus = STATUS_UNSUCCESSFUL;
763 }
764
765 /* Send the reply */
767 &Header,
768 Data,
769 &KdpContext);
770}
_In_ PLIST_ENTRY _In_ PSTRING _In_ USHORT _In_opt_ PSTRING _In_opt_ PSTRING _In_ ULONG _In_ ULONG _In_opt_ PVOID TargetContext
Definition: fsrtlfuncs.h:745
BOOLEAN KdpContextSent
Definition: kddata.c:69
VOID NTAPI KdpMoveMemory(_In_ PVOID Destination, _In_ PVOID Source, _In_ SIZE_T Length)
Definition: kdapi.c:27
struct _CONTEXT CONTEXT
PKPRCB KiProcessorBlock[]
Definition: krnlinit.c:31
CCHAR KeNumberProcessors
Definition: processor.c:16
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
Definition: ntpoapi.h:207

Referenced by KdpSendWaitContinue().

◆ KdpGetContextEx()

VOID NTAPI KdpGetContextEx ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 826 of file kdapi.c.

829{
831 PDBGKD_CONTEXT_EX ContextEx;
833 ASSERT(Data->Length == 0);
834
835 /* Get our struct */
836 ContextEx = &State->u.ContextEx;
837
838 /* Set up the header */
839 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
840 Header.Buffer = (PCHAR)State;
841
842 /* Make sure that this is a valid request */
843 if ((State->Processor < KeNumberProcessors) &&
844 (ContextEx->Offset + ContextEx->ByteCount) <= sizeof(CONTEXT))
845 {
846 /* Check if the request is for this CPU */
847 if (State->Processor == KeGetCurrentPrcb()->Number)
848 {
849 /* We're just copying our own context */
851 }
852 else
853 {
854 /* Get the context from the PRCB array */
855 TargetContext = &KiProcessorBlock[State->Processor]->
856 ProcessorState.ContextFrame;
857 }
858
859 /* Copy what is requested */
860 KdpMoveMemory(Data->Buffer,
861 (PVOID)((ULONG_PTR)TargetContext + ContextEx->Offset),
862 ContextEx->ByteCount);
863
864 /* KD copies all */
865 Data->Length = ContextEx->BytesCopied = ContextEx->ByteCount;
866
867 /* Let the debugger set the context now */
869
870 /* Finish up */
871 State->ReturnStatus = STATUS_SUCCESS;
872 }
873 else
874 {
875 /* Invalid request */
876 ContextEx->BytesCopied = 0;
877 State->ReturnStatus = STATUS_UNSUCCESSFUL;
878 }
879
880 /* Send the reply */
882 &Header,
883 Data,
884 &KdpContext);
885}

Referenced by KdpSendWaitContinue().

◆ KdpGetVersion()

VOID NTAPI KdpGetVersion ( IN PDBGKD_MANIPULATE_STATE64  State)

Definition at line 444 of file kdapi.c.

445{
447
448 /* Fill out the header */
449 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
450 Header.Buffer = (PCHAR)State;
451
452 /* Get the version block */
453 KdpSysGetVersion(&State->u.GetVersion64);
454
455 /* Fill out the state */
456 State->ApiNumber = DbgKdGetVersionApi;
457 State->ReturnStatus = STATUS_SUCCESS;
458
459 /* Send the packet */
461 &Header,
462 NULL,
463 &KdpContext);
464}
VOID NTAPI KdpSysGetVersion(_Out_ PDBGKD_GET_VERSION64 Version)
Definition: kdapi.c:433
#define DbgKdGetVersionApi
Definition: windbgkd.h:96

Referenced by KdpSendWaitContinue().

◆ KdpMoveMemory()

VOID NTAPI KdpMoveMemory ( _In_ PVOID  Destination,
_In_ PVOID  Source,
_In_ SIZE_T  Length 
)

Definition at line 27 of file kdapi.c.

31{
32 PCHAR DestinationBytes, SourceBytes;
33
34 /* Copy the buffers 1 byte at a time */
35 DestinationBytes = Destination;
36 SourceBytes = Source;
37 while (Length--) *DestinationBytes++ = *SourceBytes++;
38}
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3169
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3016
char * PCHAR
Definition: typedefs.h:51

Referenced by KdLogDbgPrint(), KdpCommandString(), KdpGetContext(), KdpGetContextEx(), KdpPrintFromUser(), KdpPrintString(), KdpPrompt(), KdpPromptString(), KdpReport(), KdpReportExceptionStateChange(), KdpSetContext(), KdpSetContextEx(), KdpSymbol(), and KdpSysGetVersion().

◆ KdpNotSupported()

VOID NTAPI KdpNotSupported ( IN PDBGKD_MANIPULATE_STATE64  State)

Definition at line 1240 of file kdapi.c.

1241{
1242 STRING Header;
1243
1244 /* Set failure */
1245 State->ReturnStatus = STATUS_UNSUCCESSFUL;
1246
1247 /* Setup the packet */
1248 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1249 Header.Buffer = (PCHAR)State;
1250
1251 /* Send it */
1253 &Header,
1254 NULL,
1255 &KdpContext);
1256}

Referenced by KdpSendWaitContinue().

◆ KdPowerTransition()

NTSTATUS NTAPI KdPowerTransition ( IN DEVICE_POWER_STATE  NewState)

Definition at line 2650 of file kdapi.c.

2651{
2652 /* Check what power state this is */
2653 if (NewState == PowerDeviceD0)
2654 {
2655 /* Wake up the debug port */
2657 return STATUS_SUCCESS;
2658 }
2659 else if ((NewState == PowerDeviceD1) ||
2660 (NewState == PowerDeviceD2) ||
2661 (NewState == PowerDeviceD3))
2662 {
2663 /* Power down the debug port */
2665 return STATUS_SUCCESS;
2666 }
2667 else
2668 {
2669 /* Invalid state! */
2671 }
2672}
NTSTATUS NTAPI KdD0Transition(VOID)
Definition: kdcom.c:99
NTSTATUS NTAPI KdD3Transition(VOID)
Definition: kdcom.c:106
@ PowerDeviceD1
Definition: ntpoapi.h:50
@ PowerDeviceD0
Definition: ntpoapi.h:49
@ PowerDeviceD2
Definition: ntpoapi.h:51
@ PowerDeviceD3
Definition: ntpoapi.h:52
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:475

◆ KdpQueryMemory()

VOID NTAPI KdpQueryMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PCONTEXT  Context 
)

Definition at line 133 of file kdapi.c.

135{
136 PDBGKD_QUERY_MEMORY Memory = &State->u.QueryMemory;
139
140 /* Validate the address space */
141 if (Memory->AddressSpace == DBGKD_QUERY_MEMORY_VIRTUAL)
142 {
143 /* Check if this is process memory */
145 {
146 /* It is */
147 Memory->AddressSpace = DBGKD_QUERY_MEMORY_PROCESS;
148 }
149 else
150 {
151 /* Check if it's session space */
153 {
154 /* It is */
155 Memory->AddressSpace = DBGKD_QUERY_MEMORY_SESSION;
156 }
157 else
158 {
159 /* Not session space but some other kernel memory */
160 Memory->AddressSpace = DBGKD_QUERY_MEMORY_KERNEL;
161 }
162 }
163
164 /* Set flags */
168 }
169 else
170 {
171 /* Invalid */
173 }
174
175 /* Return structure */
176 State->ReturnStatus = Status;
177 Memory->Reserved = 0;
178
179 /* Build header */
180 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
181 Header.Buffer = (PCHAR)State;
182
183 /* Send the packet */
185 &Header,
186 NULL,
187 &KdpContext);
188}
BOOLEAN NTAPI MmIsSessionAddress(IN PVOID Address)
Definition: session.c:48
PVOID MmHighestUserAddress
Definition: rtlcompat.c:29
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _Strict_type_match_ POOL_TYPE _In_opt_ ULONG _In_ _Out_ WDFMEMORY * Memory
Definition: wdfmemory.h:169
#define DBGKD_QUERY_MEMORY_PROCESS
Definition: windbgkd.h:160
#define DBGKD_QUERY_MEMORY_READ
Definition: windbgkd.h:167
#define DBGKD_QUERY_MEMORY_SESSION
Definition: windbgkd.h:161
#define DBGKD_QUERY_MEMORY_WRITE
Definition: windbgkd.h:168
#define DBGKD_QUERY_MEMORY_EXECUTE
Definition: windbgkd.h:169
#define DBGKD_QUERY_MEMORY_VIRTUAL
Definition: windbgkd.h:159
#define DBGKD_QUERY_MEMORY_KERNEL
Definition: windbgkd.h:162

Referenced by KdpSendWaitContinue().

◆ KdpQueryPerformanceCounter()

LARGE_INTEGER NTAPI KdpQueryPerformanceCounter ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 1881 of file kdapi.c.

1882{
1883 LARGE_INTEGER Null = {{0}};
1884
1885 /* Check if interrupts were disabled */
1886 if (!KeGetTrapFrameInterruptState(TrapFrame))
1887 {
1888 /* Nothing to return */
1889 return Null;
1890 }
1891
1892 /* Otherwise, do the call */
1894}
#define KeGetTrapFrameInterruptState(TrapFrame)
Definition: ke.h:233

Referenced by KdEnterDebugger().

◆ KdpReadControlSpace()

VOID NTAPI KdpReadControlSpace ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 651 of file kdapi.c.

654{
655 PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;
658
659 /* Setup the header */
660 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
661 Header.Buffer = (PCHAR)State;
662 ASSERT(Data->Length == 0);
663
664 /* Check the length requested */
665 Length = ReadMemory->TransferCount;
667 {
668 /* Use maximum allowed */
670 }
671
672 /* Call the internal routine */
673 State->ReturnStatus = KdpSysReadControlSpace(State->Processor,
674 ReadMemory->TargetBaseAddress,
675 Data->Buffer,
676 Length,
677 &Length);
678
679 /* Return the actual length read */
680 ReadMemory->ActualBytesRead = Length;
681 Data->Length = (USHORT)Length;
682
683 /* Send the reply */
685 &Header,
686 Data,
687 &KdpContext);
688}
NTSTATUS NTAPI KdpSysReadControlSpace(_In_ ULONG Processor, _In_ ULONG64 BaseAddress, _Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:166
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY ReadMemory
Definition: wdfusb.h:2000

Referenced by KdpSendWaitContinue().

◆ KdpReadIoSpace()

VOID NTAPI KdpReadIoSpace ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 1086 of file kdapi.c.

1089{
1090 STRING Header;
1091 PDBGKD_READ_WRITE_IO64 ReadIo = &State->u.ReadWriteIo;
1092
1093 /* Setup the header */
1094 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1095 Header.Buffer = (PCHAR)State;
1096 ASSERT(Data->Length == 0);
1097
1098 /*
1099 * Clear the value so 1 or 2 byte reads
1100 * don't leave the higher bits unmodified
1101 */
1102 ReadIo->DataValue = 0;
1103
1104 /* Call the internal routine */
1105 State->ReturnStatus = KdpSysReadIoSpace(Isa,
1106 0,
1107 1,
1108 ReadIo->IoAddress,
1109 &ReadIo->DataValue,
1110 ReadIo->DataSize,
1111 &ReadIo->DataSize);
1112
1113 /* Send the reply */
1115 &Header,
1116 NULL,
1117 &KdpContext);
1118}
@ Isa
Definition: hwresource.cpp:138
NTSTATUS NTAPI KdpSysReadIoSpace(_In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber, _In_ ULONG AddressSpace, _In_ ULONG64 IoAddress, _Out_writes_bytes_(DataSize) PVOID DataValue, _In_ ULONG DataSize, _Out_ PULONG ActualDataSize)
Definition: kdx64.c:250

Referenced by KdpSendWaitContinue().

◆ KdpReadIoSpaceExtended()

VOID NTAPI KdpReadIoSpaceExtended ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 1152 of file kdapi.c.

1155{
1156 STRING Header;
1157 PDBGKD_READ_WRITE_IO_EXTENDED64 ReadIoExtended = &State->u.
1158 ReadWriteIoExtended;
1159
1160 /* Setup the header */
1161 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1162 Header.Buffer = (PCHAR)State;
1163 ASSERT(Data->Length == 0);
1164
1165 /*
1166 * Clear the value so 1 or 2 byte reads
1167 * don't leave the higher bits unmodified
1168 */
1169 ReadIoExtended->DataValue = 0;
1170
1171 /* Call the internal routine */
1172 State->ReturnStatus = KdpSysReadIoSpace(ReadIoExtended->InterfaceType,
1173 ReadIoExtended->BusNumber,
1174 ReadIoExtended->AddressSpace,
1175 ReadIoExtended->IoAddress,
1176 &ReadIoExtended->DataValue,
1177 ReadIoExtended->DataSize,
1178 &ReadIoExtended->DataSize);
1179
1180 /* Send the reply */
1182 &Header,
1183 NULL,
1184 &KdpContext);
1185}

Referenced by KdpSendWaitContinue().

◆ KdpReadMachineSpecificRegister()

VOID NTAPI KdpReadMachineSpecificRegister ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 958 of file kdapi.c.

961{
963 PDBGKD_READ_WRITE_MSR ReadMsr = &State->u.ReadWriteMsr;
964 ULARGE_INTEGER MsrValue;
965
966 /* Setup the header */
967 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
968 Header.Buffer = (PCHAR)State;
969 ASSERT(Data->Length == 0);
970
971 /* Call the internal routine */
972 State->ReturnStatus = KdpSysReadMsr(ReadMsr->Msr, &MsrValue.QuadPart);
973
974 /* Return the data */
975 ReadMsr->DataValueLow = MsrValue.LowPart;
976 ReadMsr->DataValueHigh = MsrValue.HighPart;
977
978 /* Send the reply */
980 &Header,
981 NULL,
982 &KdpContext);
983}
NTSTATUS NTAPI KdpSysReadMsr(_In_ ULONG Msr, _Out_ PULONGLONG MsrValue)
Definition: kdx64.c:96
$ULONG LowPart
Definition: ntbasedef.h:577
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:578

Referenced by KdpSendWaitContinue().

◆ KdpReadPhysicalMemory()

VOID NTAPI KdpReadPhysicalMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 538 of file kdapi.c.

541{
542 PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;
544 ULONG Length = ReadMemory->TransferCount;
545 ULONG Flags, CacheFlags;
546
547 /* Setup the header */
548 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
549 Header.Buffer = (PCHAR)State;
550 ASSERT(Data->Length == 0);
551
552 /* Validate length */
554 {
555 /* Overflow, set it to maximum possible */
557 }
558
559 /* Start with the default flags */
561
562 /* Get the caching flags and check if a type is specified */
563 CacheFlags = ReadMemory->ActualBytesRead;
564 if (CacheFlags == DBGKD_CACHING_CACHED)
565 {
566 /* Cached */
568 }
569 else if (CacheFlags == DBGKD_CACHING_UNCACHED)
570 {
571 /* Uncached */
573 }
574 else if (CacheFlags == DBGKD_CACHING_WRITE_COMBINED)
575 {
576 /* Write Combined */
578 }
579
580 /* Do the read */
581 State->ReturnStatus = KdpCopyMemoryChunks(ReadMemory->TargetBaseAddress,
582 Data->Buffer,
583 Length,
584 0,
585 Flags,
586 &Length);
587
588 /* Return the actual length read */
589 ReadMemory->ActualBytesRead = Length;
590 Data->Length = (USHORT)Length;
591
592 /* Send the packet */
594 &Header,
595 Data,
596 &KdpContext);
597}
NTSTATUS NTAPI KdpCopyMemoryChunks(_In_ ULONG64 Address, _In_ PVOID Buffer, _In_ ULONG TotalSize, _In_ ULONG ChunkSize, _In_ ULONG Flags, _Out_opt_ PULONG ActualSize)
Definition: kdapi.c:55
#define MMDBG_COPY_PHYSICAL
Definition: mm.h:76
#define MMDBG_COPY_WRITE_COMBINED
Definition: mm.h:80
#define MMDBG_COPY_CACHED
Definition: mm.h:78
#define MMDBG_COPY_UNCACHED
Definition: mm.h:79
#define DBGKD_CACHING_WRITE_COMBINED
Definition: windbgkd.h:192
#define DBGKD_CACHING_CACHED
Definition: windbgkd.h:190
#define DBGKD_CACHING_UNCACHED
Definition: windbgkd.h:191

Referenced by KdpSendWaitContinue().

◆ KdpReadVirtualMemory()

VOID NTAPI KdpReadVirtualMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 468 of file kdapi.c.

471{
472 PDBGKD_READ_MEMORY64 ReadMemory = &State->u.ReadMemory;
474 ULONG Length = ReadMemory->TransferCount;
475
476 /* Setup the header */
477 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
478 Header.Buffer = (PCHAR)State;
479 ASSERT(Data->Length == 0);
480
481 /* Validate length */
483 {
484 /* Overflow, set it to maximum possible */
486 }
487
488 /* Do the read */
489 State->ReturnStatus = KdpCopyMemoryChunks(ReadMemory->TargetBaseAddress,
490 Data->Buffer,
491 Length,
492 0,
494 &Length);
495
496 /* Return the actual length read */
497 ReadMemory->ActualBytesRead = Length;
498 Data->Length = (USHORT)Length;
499
500 /* Send the packet */
502 &Header,
503 Data,
504 &KdpContext);
505}

Referenced by KdpSendWaitContinue().

◆ KdpReportCommandStringStateChange()

VOID NTAPI KdpReportCommandStringStateChange ( IN PSTRING  NameString,
IN PSTRING  CommandString,
IN OUT PCONTEXT  Context 
)

Definition at line 1674 of file kdapi.c.

1677{
1679 DBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange;
1680 ULONG Length, ActualLength, TotalLength;
1682
1683 /* Start wait loop */
1684 do
1685 {
1686 /* Build the architecture common parts of the message */
1688 Context,
1689 &WaitStateChange);
1690
1691 /* Set the context */
1692 KdpSetContextState(&WaitStateChange, Context);
1693
1694 /* Clear the command string structure */
1695 KdpZeroMemory(&WaitStateChange.u.CommandString,
1696 sizeof(DBGKD_COMMAND_STRING));
1697
1698 /* Normalize name string to max */
1699 Length = min(128 - 1, NameString->Length);
1700
1701 /* Copy it to the message buffer */
1702 KdpCopyMemoryChunks((ULONG_PTR)NameString->Buffer,
1704 Length,
1705 0,
1707 &ActualLength);
1708
1709 /* Null terminate and calculate the total length */
1710 TotalLength = ActualLength;
1712
1713 /* Check if the command string is too long */
1714 Length = CommandString->Length;
1715 if (Length > (PACKET_MAX_SIZE -
1717 {
1718 /* Use maximum possible size */
1721 }
1722
1723 /* Copy it to the message buffer */
1724 KdpCopyMemoryChunks((ULONG_PTR)CommandString->Buffer,
1726 Length,
1727 0,
1729 &ActualLength);
1730
1731 /* Null terminate and calculate the total length */
1732 TotalLength += ActualLength;
1734
1735 /* Now set up the header and the data */
1736 Header.Length = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
1737 Header.Buffer = (PCHAR)&WaitStateChange;
1738 Data.Length = (USHORT)TotalLength;
1739 Data.Buffer = KdpMessageBuffer;
1740
1741 /* Send State Change packet and wait for a reply */
1743 &Header,
1744 &Data,
1745 Context);
1747}
VOID NTAPI KdpSetContextState(IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange, IN PCONTEXT Context)
Definition: kdx64.c:66
CHAR KdpMessageBuffer[KDP_MSG_BUFFER_SIZE]
Definition: kddata.c:126
VOID NTAPI KdpSetCommonState(IN ULONG NewState, IN PCONTEXT Context, IN PDBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange)
Definition: kdapi.c:386
VOID NTAPI KdpZeroMemory(_In_ PVOID Destination, _In_ SIZE_T Length)
Definition: kdapi.c:42
KCONTINUE_STATUS NTAPI KdpSendWaitContinue(IN ULONG PacketType, IN PSTRING SendHeader, IN PSTRING SendData OPTIONAL, IN OUT PCONTEXT Context)
Definition: kdapi.c:1282
#define min(a, b)
Definition: monoChain.cc:55
enum _KCONTINUE_STATUS KCONTINUE_STATUS
@ ContinueProcessorReselected
Definition: ketypes.h:451
#define ANSI_NULL
DBGKD_COMMAND_STRING CommandString
Definition: windbgkd.h:510
union _DBGKD_ANY_WAIT_STATE_CHANGE::@3561 u
_In_ ULONG TotalLength
Definition: usbdlib.h:158
struct _DBGKD_ANY_WAIT_STATE_CHANGE DBGKD_ANY_WAIT_STATE_CHANGE
#define DbgKdCommandStringStateChange
Definition: windbgkd.h:61
#define PACKET_TYPE_KD_STATE_CHANGE64
Definition: windbgkd.h:48

Referenced by KdpCommandString().

◆ KdpReportExceptionStateChange()

BOOLEAN NTAPI KdpReportExceptionStateChange ( IN PEXCEPTION_RECORD  ExceptionRecord,
IN OUT PCONTEXT  Context,
IN BOOLEAN  SecondChanceException 
)

Definition at line 1751 of file kdapi.c.

1754{
1756 DBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange;
1758
1759 /* Start report loop */
1760 do
1761 {
1762 /* Build the architecture common parts of the message */
1764
1765#if !defined(_WIN64)
1766
1767 /* Convert it and copy it over */
1769 &WaitStateChange.u.Exception.ExceptionRecord);
1770
1771#else
1772
1773 /* Just copy it directly, no need to convert */
1774 KdpMoveMemory(&WaitStateChange.u.Exception.ExceptionRecord,
1775 ExceptionRecord,
1776 sizeof(EXCEPTION_RECORD));
1777
1778#endif
1779
1780 /* Set the First Chance flag */
1781 WaitStateChange.u.Exception.FirstChance = !SecondChanceException;
1782
1783 /* Now finish creating the structure */
1784 KdpSetContextState(&WaitStateChange, Context);
1785
1786 /* Setup the actual header to send to KD */
1787 Header.Length = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
1788 Header.Buffer = (PCHAR)&WaitStateChange;
1789
1790 /* Setup the trace data */
1792
1793 /* Send State Change packet and wait for a reply */
1795 &Header,
1796 &Data,
1797 Context);
1799
1800 /* Return */
1801 return Status;
1802}
VOID NTAPI DumpTraceData(IN PSTRING TraceData)
Definition: kdapi.c:371
DBGKM_EXCEPTION64 Exception
Definition: windbgkd.h:508
EXCEPTION_RECORD64 ExceptionRecord
Definition: windbgkd.h:312
#define DbgKdExceptionStateChange
Definition: windbgkd.h:59
static __inline VOID NTAPI ExceptionRecord32To64(IN PEXCEPTION_RECORD32 Ex32, OUT PEXCEPTION_RECORD64 Ex64)
Definition: windbgkd.h:917

Referenced by KdpReport(), and KdReportProcessorChange().

◆ KdpReportLoadSymbolsStateChange()

VOID NTAPI KdpReportLoadSymbolsStateChange ( IN PSTRING  PathName,
IN PKD_SYMBOLS_INFO  SymbolInfo,
IN BOOLEAN  Unload,
IN OUT PCONTEXT  Context 
)

Definition at line 1602 of file kdapi.c.

1606{
1607 PSTRING ExtraData;
1609 DBGKD_ANY_WAIT_STATE_CHANGE WaitStateChange;
1610 ULONG PathNameLength;
1612
1613 /* Start wait loop */
1614 do
1615 {
1616 /* Build the architecture common parts of the message */
1618 Context,
1619 &WaitStateChange);
1620
1621 /* Now finish creating the structure */
1622 KdpSetContextState(&WaitStateChange, Context);
1623
1624 /* Fill out load data */
1625 WaitStateChange.u.LoadSymbols.UnloadSymbols = Unload;
1626 WaitStateChange.u.LoadSymbols.BaseOfDll = (ULONG64)(LONG_PTR)SymbolInfo->BaseOfDll;
1627 WaitStateChange.u.LoadSymbols.ProcessId = SymbolInfo->ProcessId;
1628 WaitStateChange.u.LoadSymbols.CheckSum = SymbolInfo->CheckSum;
1629 WaitStateChange.u.LoadSymbols.SizeOfImage = SymbolInfo->SizeOfImage;
1630
1631 /* Check if we have a path name */
1632 if (PathName)
1633 {
1634 /* Copy it to the path buffer */
1635 KdpCopyMemoryChunks((ULONG_PTR)PathName->Buffer,
1637 PathName->Length,
1638 0,
1640 &PathNameLength);
1641
1642 /* Null terminate */
1643 KdpPathBuffer[PathNameLength++] = ANSI_NULL;
1644
1645 /* Set the path length */
1646 WaitStateChange.u.LoadSymbols.PathNameLength = PathNameLength;
1647
1648 /* Set up the data */
1649 Data.Buffer = KdpPathBuffer;
1650 Data.Length = (USHORT)PathNameLength;
1651 ExtraData = &Data;
1652 }
1653 else
1654 {
1655 /* No name */
1656 WaitStateChange.u.LoadSymbols.PathNameLength = 0;
1657 ExtraData = NULL;
1658 }
1659
1660 /* Setup the header */
1661 Header.Length = sizeof(DBGKD_ANY_WAIT_STATE_CHANGE);
1662 Header.Buffer = (PCHAR)&WaitStateChange;
1663
1664 /* Send the packet */
1666 &Header,
1667 ExtraData,
1668 Context);
1670}
static VOID NTAPI Unload(PDRIVER_OBJECT DriverObject)
Definition: floppy.c:377
CHAR KdpPathBuffer[KDP_MSG_BUFFER_SIZE]
Definition: kddata.c:127
unsigned __int64 ULONG64
Definition: imports.h:198
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
DBGKD_LOAD_SYMBOLS64 LoadSymbols
Definition: windbgkd.h:509
#define DbgKdLoadSymbolsStateChange
Definition: windbgkd.h:60

Referenced by KdpSymbol().

◆ KdpRestoreBreakpoint()

VOID NTAPI KdpRestoreBreakpoint ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 271 of file kdapi.c.

274{
275 PDBGKD_RESTORE_BREAKPOINT RestoreBp = &State->u.RestoreBreakPoint;
277
278 /* Fill out the header */
279 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
280 Header.Buffer = (PCHAR)State;
281 ASSERT(Data->Length == 0);
282
283 /* Get the version block */
285 {
286 /* We're all good */
287 State->ReturnStatus = STATUS_SUCCESS;
288 }
289 else
290 {
291 /* We failed */
292 State->ReturnStatus = STATUS_UNSUCCESSFUL;
293 }
294
295 /* Send the packet */
297 &Header,
298 NULL,
299 &KdpContext);
300}
BOOLEAN NTAPI KdpDeleteBreakpoint(IN ULONG BpEntry)
Definition: kdbreak.c:311

Referenced by KdpSendWaitContinue().

◆ KdpRestoreBreakPointEx()

VOID NTAPI KdpRestoreBreakPointEx ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 327 of file kdapi.c.

330{
331 //PDBGKD_BREAKPOINTEX = &State->u.BreakPointEx;
333
334 /* TODO */
335 KdpDprintf("Extended Breakpoint Restore support is unimplemented!\n");
336
337 /* Send a failure packet */
338 State->ReturnStatus = STATUS_UNSUCCESSFUL;
339 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
340 Header.Buffer = (PCHAR)State;
342 &Header,
343 Data,
344 &KdpContext);
345}

Referenced by KdpSendWaitContinue().

◆ KdpSearchMemory()

VOID NTAPI KdpSearchMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 192 of file kdapi.c.

195{
196 //PDBGKD_SEARCH_MEMORY SearchMemory = &State->u.SearchMemory;
198
199 /* TODO */
200 KdpDprintf("Memory Search support is unimplemented!\n");
201
202 /* Send a failure packet */
203 State->ReturnStatus = STATUS_UNSUCCESSFUL;
204 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
205 Header.Buffer = (PCHAR)State;
207 &Header,
208 NULL,
209 &KdpContext);
210}

Referenced by KdpSendWaitContinue().

◆ KdpSendWaitContinue()

KCONTINUE_STATUS NTAPI KdpSendWaitContinue ( IN ULONG  PacketType,
IN PSTRING  SendHeader,
IN PSTRING SendData  OPTIONAL,
IN OUT PCONTEXT  Context 
)

Definition at line 1282 of file kdapi.c.

1286{
1288 DBGKD_MANIPULATE_STATE64 ManipulateState;
1289 ULONG Length;
1290 KDSTATUS RecvCode;
1291
1292 /* Setup the Manipulate State structure */
1293 Header.MaximumLength = sizeof(DBGKD_MANIPULATE_STATE64);
1294 Header.Buffer = (PCHAR)&ManipulateState;
1295 Data.MaximumLength = sizeof(KdpMessageBuffer);
1296 Data.Buffer = KdpMessageBuffer;
1297
1298 /*
1299 * Reset the context state to ensure the debugger has received
1300 * the current context before it sets it.
1301 */
1303
1305 /* Send the Packet */
1306 KdSendPacket(PacketType, SendHeader, SendData, &KdpContext);
1307
1308 /* If the debugger isn't present anymore, just return success */
1310
1311 /* Main processing Loop */
1312 for (;;)
1313 {
1314 /* Receive Loop */
1315 do
1316 {
1317 /* Wait to get a reply to our packet */
1319 &Header,
1320 &Data,
1321 &Length,
1322 &KdpContext);
1323
1324 /* If we got a resend request, do it */
1325 if (RecvCode == KdPacketNeedsResend) goto SendPacket;
1326 } while (RecvCode == KdPacketTimedOut);
1327
1328 /* Now check what API we got */
1329 switch (ManipulateState.ApiNumber)
1330 {
1332
1333 /* Read virtual memory */
1334 KdpReadVirtualMemory(&ManipulateState, &Data, Context);
1335 break;
1336
1338
1339 /* Write virtual memory */
1340 KdpWriteVirtualMemory(&ManipulateState, &Data, Context);
1341 break;
1342
1343 case DbgKdGetContextApi:
1344
1345 /* Get the current context */
1346 KdpGetContext(&ManipulateState, &Data, Context);
1347 break;
1348
1349 case DbgKdSetContextApi:
1350
1351 /* Set a new context */
1352 KdpSetContext(&ManipulateState, &Data, Context);
1353 break;
1354
1356
1357 /* Write the breakpoint */
1358 KdpWriteBreakpoint(&ManipulateState, &Data, Context);
1359 break;
1360
1362
1363 /* Restore the breakpoint */
1364 KdpRestoreBreakpoint(&ManipulateState, &Data, Context);
1365 break;
1366
1367 case DbgKdContinueApi:
1368
1369 /* Simply continue */
1370 return NT_SUCCESS(ManipulateState.u.Continue.ContinueStatus);
1371
1373
1374 /* Read control space */
1375 KdpReadControlSpace(&ManipulateState, &Data, Context);
1376 break;
1377
1379
1380 /* Write control space */
1381 KdpWriteControlSpace(&ManipulateState, &Data, Context);
1382 break;
1383
1385
1386 /* Read I/O Space */
1387 KdpReadIoSpace(&ManipulateState, &Data, Context);
1388 break;
1389
1391
1392 /* Write I/O Space */
1393 KdpWriteIoSpace(&ManipulateState, &Data, Context);
1394 break;
1395
1396 case DbgKdRebootApi:
1397
1398 /* Reboot the system */
1400 break;
1401
1402 case DbgKdContinueApi2:
1403
1404 /* Check if caller reports success */
1405 if (NT_SUCCESS(ManipulateState.u.Continue2.ContinueStatus))
1406 {
1407 /* Update the state */
1408 KdpGetStateChange(&ManipulateState, Context);
1409 return ContinueSuccess;
1410 }
1411 else
1412 {
1413 /* Return an error */
1414 return ContinueError;
1415 }
1416
1418
1419 /* Read physical memory */
1420 KdpReadPhysicalMemory(&ManipulateState, &Data, Context);
1421 break;
1422
1424
1425 /* Write physical memory */
1426 KdpWritePhysicalMemory(&ManipulateState, &Data, Context);
1427 break;
1428
1432
1433 /* TODO */
1434 KdpDprintf("Special Call support is unimplemented!\n");
1435 KdpNotSupported(&ManipulateState);
1436 break;
1437
1440
1441 /* TODO */
1442 KdpDprintf("Internal Breakpoint support is unimplemented!\n");
1443 KdpNotSupported(&ManipulateState);
1444 break;
1445
1447
1448 /* Read I/O Space */
1449 KdpReadIoSpaceExtended(&ManipulateState, &Data, Context);
1450 break;
1451
1453
1454 /* Write I/O Space */
1455 KdpWriteIoSpaceExtended(&ManipulateState, &Data, Context);
1456 break;
1457
1458 case DbgKdGetVersionApi:
1459
1460 /* Get version data */
1461 KdpGetVersion(&ManipulateState);
1462 break;
1463
1465
1466 /* Write the breakpoint and check if it failed */
1467 if (!NT_SUCCESS(KdpWriteBreakPointEx(&ManipulateState,
1468 &Data,
1469 Context)))
1470 {
1471 /* Return an error */
1472 return ContinueError;
1473 }
1474 break;
1475
1477
1478 /* Restore the breakpoint */
1479 KdpRestoreBreakPointEx(&ManipulateState, &Data, Context);
1480 break;
1481
1483
1484 /* Crash the system */
1485 KdpCauseBugCheck(&ManipulateState);
1486 break;
1487
1489
1490 /* Switch the processor and return */
1491 return KdpSwitchProcessor(ManipulateState.Processor);
1492
1493 case DbgKdPageInApi:
1494
1495 /* This API, introduced in NT4, has been obsoleted in NT5. It is
1496 * replaced by ExpDebuggerPageIn support in ExpDebuggerWorker(). */
1497 KdpDprintf("DbgKdPageInApi is obsolete!\n");
1498 KdpNotSupported(&ManipulateState);
1499 break;
1500
1502
1503 /* Read from the specified MSR */
1504 KdpReadMachineSpecificRegister(&ManipulateState, &Data, Context);
1505 break;
1506
1508
1509 /* Write to the specified MSR */
1510 KdpWriteMachineSpecificRegister(&ManipulateState, &Data, Context);
1511 break;
1512
1514
1515 /* Search memory */
1516 KdpSearchMemory(&ManipulateState, &Data, Context);
1517 break;
1518
1519 case DbgKdGetBusDataApi:
1520
1521 /* Read from the bus */
1522 KdpGetBusData(&ManipulateState, &Data, Context);
1523 break;
1524
1525 case DbgKdSetBusDataApi:
1526
1527 /* Write to the bus */
1528 KdpSetBusData(&ManipulateState, &Data, Context);
1529 break;
1530
1532
1533 /* Check for memory corruption in the lower 4 GB */
1534 KdpCheckLowMemory(&ManipulateState);
1535 break;
1536
1538
1539 /* Just clear the counter */
1541 break;
1542
1543 case DbgKdFillMemoryApi:
1544
1545 /* Fill memory */
1546 KdpFillMemory(&ManipulateState, &Data, Context);
1547 break;
1548
1550
1551 /* Query memory */
1552 KdpQueryMemory(&ManipulateState, Context);
1553 break;
1554
1556
1557 /* TODO */
1558 KdpDprintf("Partition Switch support is unimplemented!\n");
1559 KdpNotSupported(&ManipulateState);
1560 break;
1561
1563
1564 /* Write the customized breakpoint */
1565 KdpWriteCustomBreakpoint(&ManipulateState, &Data, Context);
1566 break;
1567
1569
1570 /* Extended Context Get */
1571 KdpGetContextEx(&ManipulateState, &Data, Context);
1572 break;
1573
1575
1576 /* Extended Context Set */
1577 KdpSetContextEx(&ManipulateState, &Data, Context);
1578 break;
1579
1580 /* Unsupported Messages */
1581 default:
1582
1583 /* Send warning */
1584 KdpDprintf("Received Unrecognized API 0x%lx\n", ManipulateState.ApiNumber);
1585
1586 /* Setup an empty message, with failure */
1587 Data.Length = 0;
1588 ManipulateState.ReturnStatus = STATUS_UNSUCCESSFUL;
1589
1590 /* Send it */
1592 &Header,
1593 &Data,
1594 &KdpContext);
1595 break;
1596 }
1597 }
1598}
VOID NTAPI HalReturnToFirmware(_In_ FIRMWARE_REENTRY Action)
Definition: reboot.c:21
VOID SendPacket(PVOID Context, PNDIS_PACKET NdisPacket, UINT Offset, PVOID LinkAddress, USHORT Type)
Definition: iptest.cpp:247
VOID NTAPI KdpGetStateChange(IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context)
Definition: kdx64.c:22
ULONG KdpNumInternalBreakpoints
Definition: kddata.c:99
static KCONTINUE_STATUS KdpSwitchProcessor(_In_ USHORT ProcessorIndex)
Definition: kdapi.c:1260
VOID NTAPI KdpRestoreBreakPointEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:327
VOID NTAPI KdpFillMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:214
VOID NTAPI KdpWriteMachineSpecificRegister(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:987
VOID NTAPI KdpRestoreBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:271
VOID NTAPI KdpGetVersion(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:444
VOID NTAPI KdpGetContext(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:719
VOID NTAPI KdpNotSupported(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:1240
VOID NTAPI KdpReadVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:468
VOID NTAPI KdpGetContextEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:826
VOID NTAPI KdpQueryMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PCONTEXT Context)
Definition: kdapi.c:133
VOID NTAPI KdpSearchMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:192
VOID NTAPI KdpReadPhysicalMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:538
VOID NTAPI KdpReadControlSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:651
VOID NTAPI KdpWriteBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:236
VOID NTAPI KdpCauseBugCheck(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:950
VOID NTAPI KdpWriteVirtualMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:509
VOID NTAPI KdpReadIoSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1086
NTSTATUS NTAPI KdpWriteBreakPointEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:304
VOID NTAPI KdpWriteIoSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1122
VOID NTAPI KdpSetContext(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:774
VOID NTAPI KdpWritePhysicalMemory(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:601
VOID NTAPI KdpSetContextEx(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:889
VOID NTAPI KdpSetBusData(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1057
VOID NTAPI KdpReadIoSpaceExtended(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1152
VOID NTAPI KdpReadMachineSpecificRegister(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:958
VOID NTAPI KdpCheckLowMemory(IN PDBGKD_MANIPULATE_STATE64 State)
Definition: kdapi.c:1220
VOID NTAPI KdpWriteIoSpaceExtended(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1189
VOID NTAPI KdpWriteCustomBreakpoint(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:349
VOID NTAPI KdpGetBusData(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:1014
VOID NTAPI KdpWriteControlSpace(IN PDBGKD_MANIPULATE_STATE64 State, IN PSTRING Data, IN PCONTEXT Context)
Definition: kdapi.c:692
BOOLEAN KdDebuggerNotPresent
Definition: kddata.c:81
KDP_STATUS NTAPI KdReceivePacket(IN ULONG PacketType, OUT PSTRING MessageHeader, OUT PSTRING MessageData, OUT PULONG DataLength, IN OUT PKD_CONTEXT KdContext)
Definition: kddll.c:80
@ HalRebootRoutine
Definition: haltypes.h:37
@ ContinueError
Definition: ketypes.h:449
@ ContinueSuccess
Definition: ketypes.h:450
static BOOL SendData(PINFO pInfo)
Definition: ntpclient.c:76
#define KdPacketNeedsResend
Definition: kddll.h:7
ULONG KDSTATUS
Definition: kddll.h:4
#define KdPacketTimedOut
Definition: kddll.h:6
NTSTATUS ContinueStatus
Definition: windbgkd.h:585
NTSTATUS ContinueStatus
Definition: windbgkd.h:579
union _DBGKD_MANIPULATE_STATE64::@3569 u
DBGKD_CONTINUE2 Continue2
Definition: windbgkd.h:800
DBGKD_CONTINUE Continue
Definition: windbgkd.h:799
#define DbgKdClearAllInternalBreakpointsApi
Definition: windbgkd.h:110
#define DbgKdCheckLowMemoryApi
Definition: windbgkd.h:109
#define DbgKdWriteControlSpaceApi
Definition: windbgkd.h:82
#define DbgKdReadControlSpaceApi
Definition: windbgkd.h:81
#define DbgKdGetContextApi
Definition: windbgkd.h:76
#define DbgKdPageInApi
Definition: windbgkd.h:101
#define DbgKdSetContextExApi
Definition: windbgkd.h:116
#define DbgKdWriteVirtualMemoryApi
Definition: windbgkd.h:75
#define DbgKdGetContextExApi
Definition: windbgkd.h:115
#define DbgKdWriteCustomBreakpointApi
Definition: windbgkd.h:114
#define DbgKdSwitchPartition
Definition: windbgkd.h:113
#define DbgKdSetContextApi
Definition: windbgkd.h:77
#define DbgKdReadIoSpaceApi
Definition: windbgkd.h:83
#define DbgKdWriteBreakPointExApi
Definition: windbgkd.h:97
#define DbgKdSearchMemoryApi
Definition: windbgkd.h:106
#define DbgKdGetInternalBreakPointApi
Definition: windbgkd.h:93
#define DbgKdQuerySpecialCallsApi
Definition: windbgkd.h:89
#define DbgKdReadVirtualMemoryApi
Definition: windbgkd.h:74
#define DbgKdFillMemoryApi
Definition: windbgkd.h:111
#define DbgKdWriteMachineSpecificRegister
Definition: windbgkd.h:103
#define DbgKdCauseBugCheckApi
Definition: windbgkd.h:99
#define DbgKdContinueApi2
Definition: windbgkd.h:86
#define DbgKdWriteBreakPointApi
Definition: windbgkd.h:78
#define DbgKdWriteIoSpaceApi
Definition: windbgkd.h:84
#define DbgKdContinueApi
Definition: windbgkd.h:80
#define DbgKdSetInternalBreakPointApi
Definition: windbgkd.h:92
#define DbgKdGetBusDataApi
Definition: windbgkd.h:107
#define DbgKdClearSpecialCallsApi
Definition: windbgkd.h:91
#define DbgKdWriteIoSpaceExtendedApi
Definition: windbgkd.h:95
#define DbgKdSetBusDataApi
Definition: windbgkd.h:108
#define DbgKdSetSpecialCallApi
Definition: windbgkd.h:90
#define DbgKdWritePhysicalMemoryApi
Definition: windbgkd.h:88
#define DbgKdRestoreBreakPointExApi
Definition: windbgkd.h:98
#define DbgKdQueryMemoryApi
Definition: windbgkd.h:112
#define DbgKdRebootApi
Definition: windbgkd.h:85
#define DbgKdReadMachineSpecificRegister
Definition: windbgkd.h:102
#define DbgKdReadIoSpaceExtendedApi
Definition: windbgkd.h:94
#define DbgKdSwitchProcessor
Definition: windbgkd.h:100
#define DbgKdRestoreBreakPointApi
Definition: windbgkd.h:79
#define DbgKdReadPhysicalMemoryApi
Definition: windbgkd.h:87

Referenced by KdpReportCommandStringStateChange(), KdpReportExceptionStateChange(), and KdpReportLoadSymbolsStateChange().

◆ KdpSetBusData()

VOID NTAPI KdpSetBusData ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 1057 of file kdapi.c.

1060{
1061 STRING Header;
1062 PDBGKD_GET_SET_BUS_DATA SetBusData = &State->u.GetSetBusData;
1063
1064 /* Setup the header */
1065 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1066 Header.Buffer = (PCHAR)State;
1067
1068 /* Call the internal routine */
1069 State->ReturnStatus = KdpSysWriteBusData(SetBusData->BusDataType,
1070 SetBusData->BusNumber,
1071 SetBusData->SlotNumber,
1072 SetBusData->Offset,
1073 Data->Buffer,
1074 SetBusData->Length,
1075 &SetBusData->Length);
1076
1077 /* Send the reply */
1079 &Header,
1080 NULL,
1081 &KdpContext);
1082}
NTSTATUS NTAPI KdpSysWriteBusData(_In_ BUS_DATA_TYPE BusDataType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _In_ ULONG Offset, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:151

Referenced by KdpSendWaitContinue().

◆ KdpSetCommonState()

VOID NTAPI KdpSetCommonState ( IN ULONG  NewState,
IN PCONTEXT  Context,
IN PDBGKD_ANY_WAIT_STATE_CHANGE  WaitStateChange 
)

Definition at line 386 of file kdapi.c.

389{
390 ULONG InstructionCount;
391 BOOLEAN HadBreakpoints;
392
393 /* Setup common stuff available for all CPU architectures */
394 WaitStateChange->NewState = NewState;
395 WaitStateChange->ProcessorLevel = KeProcessorLevel;
396 WaitStateChange->Processor = (USHORT)KeGetCurrentPrcb()->Number;
397 WaitStateChange->NumberProcessors = (ULONG)KeNumberProcessors;
398 WaitStateChange->Thread = (ULONG64)(LONG_PTR)KeGetCurrentThread();
399 WaitStateChange->ProgramCounter = (ULONG64)(LONG_PTR)KeGetContextPc(Context);
400
401 /* Zero out the entire Control Report */
402 KdpZeroMemory(&WaitStateChange->AnyControlReport,
404
405 /* Now copy the instruction stream and set the count */
406 KdpCopyMemoryChunks((ULONG_PTR)WaitStateChange->ProgramCounter,
407 &WaitStateChange->ControlReport.InstructionStream[0],
409 0,
411 &InstructionCount);
412 WaitStateChange->ControlReport.InstructionCount = (USHORT)InstructionCount;
413
414 /* Clear all the breakpoints in this region */
415 HadBreakpoints =
416 KdpDeleteBreakpointRange((PVOID)(ULONG_PTR)WaitStateChange->ProgramCounter,
417 (PVOID)((ULONG_PTR)WaitStateChange->ProgramCounter +
418 WaitStateChange->ControlReport.InstructionCount - 1));
419 if (HadBreakpoints)
420 {
421 /* Copy the instruction stream again, this time without breakpoints */
422 KdpCopyMemoryChunks((ULONG_PTR)WaitStateChange->ProgramCounter,
423 &WaitStateChange->ControlReport.InstructionStream[0],
424 InstructionCount,
425 0,
427 NULL);
428 }
429}
#define KeGetCurrentThread
Definition: hal.h:55
BOOLEAN NTAPI KdpDeleteBreakpointRange(IN PVOID Base, IN PVOID Limit)
Definition: kdbreak.c:340
#define KeGetContextPc(Context)
Definition: ke.h:31
USHORT KeProcessorLevel
Definition: krnlinit.c:20
#define DBGKD_MAXSTREAM
Definition: windbgkd.h:19

Referenced by KdpReportCommandStringStateChange(), KdpReportExceptionStateChange(), and KdpReportLoadSymbolsStateChange().

◆ KdpSetContext()

VOID NTAPI KdpSetContext ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 774 of file kdapi.c.

777{
780
781 /* Setup the header */
782 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
783 Header.Buffer = (PCHAR)State;
784 ASSERT(Data->Length == sizeof(CONTEXT));
785
786 /* Make sure that this is a valid request */
787 if ((State->Processor < KeNumberProcessors) &&
789 {
790 /* Check if the request is for this CPU */
791 if (State->Processor == KeGetCurrentPrcb()->Number)
792 {
793 /* We're just copying our own context */
795 }
796 else
797 {
798 /* Get the context from the PRCB array */
799 TargetContext = &KiProcessorBlock[State->Processor]->
800 ProcessorState.ContextFrame;
801 }
802
803 /* Copy the new context to it */
805 Data->Buffer,
806 sizeof(CONTEXT));
807
808 /* Finish up */
809 State->ReturnStatus = STATUS_SUCCESS;
810 }
811 else
812 {
813 /* Invalid request */
814 State->ReturnStatus = STATUS_UNSUCCESSFUL;
815 }
816
817 /* Send the reply */
819 &Header,
820 NULL,
821 &KdpContext);
822}

Referenced by KdpSendWaitContinue().

◆ KdpSetContextEx()

VOID NTAPI KdpSetContextEx ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 889 of file kdapi.c.

892{
894 PDBGKD_CONTEXT_EX ContextEx;
896
897 /* Get our struct */
898 ContextEx = &State->u.ContextEx;
899 ASSERT(Data->Length == ContextEx->ByteCount);
900
901 /* Set up the header */
902 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
903 Header.Buffer = (PCHAR)State;
904
905 /* Make sure that this is a valid request */
906 if ((State->Processor < KeNumberProcessors) &&
907 ((ContextEx->Offset + ContextEx->ByteCount) <= sizeof(CONTEXT)) &&
909 {
910 /* Check if the request is for this CPU */
911 if (State->Processor == KeGetCurrentPrcb()->Number)
912 {
913 /* We're just copying our own context */
915 }
916 else
917 {
918 /* Get the context from the PRCB array */
919 TargetContext = &KiProcessorBlock[State->Processor]->
920 ProcessorState.ContextFrame;
921 }
922
923 /* Copy what is requested */
925 Data->Buffer,
926 ContextEx->ByteCount);
927
928 /* KD copies all */
929 ContextEx->BytesCopied = ContextEx->ByteCount;
930
931 /* Finish up */
932 State->ReturnStatus = STATUS_SUCCESS;
933 }
934 else
935 {
936 /* Invalid request */
937 ContextEx->BytesCopied = 0;
938 State->ReturnStatus = STATUS_UNSUCCESSFUL;
939 }
940
941 /* Send the reply */
943 &Header,
944 NULL,
945 &KdpContext);
946}

Referenced by KdpSendWaitContinue().

◆ KdpSwitchProcessor()

static KCONTINUE_STATUS KdpSwitchProcessor ( _In_ USHORT  ProcessorIndex)
static

Definition at line 1260 of file kdapi.c.

1262{
1263 /* Make sure that the processor index is valid */
1264 if (ProcessorIndex >= KeNumberProcessors)
1265 {
1266 KdpDprintf("%u is not a valid processor number\n", ProcessorIndex);
1268 }
1269
1270 /* If the new processor is the current one, there is nothing to do */
1271 if (ProcessorIndex == KeGetCurrentProcessorNumber())
1272 {
1274 }
1275
1276 /* Call the architecture specific Ke routine */
1277 return KxSwitchKdProcessor(ProcessorIndex);
1278}
KCONTINUE_STATUS NTAPI KxSwitchKdProcessor(_In_ ULONG ProcessorIndex)
Definition: freeze.c:207
FORCEINLINE ULONG KeGetCurrentProcessorNumber(VOID)
Definition: ke.h:341

Referenced by KdpSendWaitContinue().

◆ KdpSysGetVersion()

VOID NTAPI KdpSysGetVersion ( _Out_ PDBGKD_GET_VERSION64  Version)

Definition at line 433 of file kdapi.c.

435{
436 /* Copy the version block */
439 sizeof(DBGKD_GET_VERSION64));
440}
DBGKD_GET_VERSION64 KdVersionBlock
Definition: kddata.c:495
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469

Referenced by KdpGetVersion(), and KdSystemDebugControl().

◆ KdpTimeSlipDpcRoutine()

VOID NTAPI KdpTimeSlipDpcRoutine ( IN PKDPC  Dpc,
IN PVOID  DeferredContext,
IN PVOID  SystemArgument1,
IN PVOID  SystemArgument2 
)

Definition at line 1833 of file kdapi.c.

1837{
1838 LONG OldSlip, NewSlip, PendingSlip;
1839
1840 /* Get the current pending slip */
1841 PendingSlip = KdpTimeSlipPending;
1842 do
1843 {
1844 /* Save the old value and either disable or enable it now. */
1845 OldSlip = PendingSlip;
1846 NewSlip = OldSlip > 1 ? 1 : 0;
1847
1848 /* Try to change the value */
1850 NewSlip,
1851 OldSlip) != OldSlip);
1852
1853 /* If the New Slip value is 1, then do the Time Slipping */
1855}
#define InterlockedCompareExchange
Definition: interlocked.h:104
WORK_QUEUE_ITEM KdpTimeSlipWorkItem
Definition: kddata.c:117
long LONG
Definition: pedump.c:60
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
Definition: work.c:723
@ DelayedWorkQueue
Definition: extypes.h:190

Referenced by KdInitSystem().

◆ KdpTimeSlipWork()

VOID NTAPI KdpTimeSlipWork ( IN PVOID  Context)

Definition at line 1859 of file kdapi.c.

1860{
1861 KIRQL OldIrql;
1863
1864 /* Update the System time from the CMOS */
1868
1869 /* Check if we have a registered Time Slip Event and signal it */
1873
1874 /* Delay the DPC until it runs next time */
1875 DueTime.QuadPart = -1800000000;
1877}
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
PKEVENT KdpTimeSlipEvent
Definition: kddata.c:119
KSPIN_LOCK KdpTimeSlipEventLock
Definition: kddata.c:120
KTIMER KdpTimeSlipTimer
Definition: kddata.c:116
VOID NTAPI ExUpdateSystemTimeFromCmos(IN BOOLEAN UpdateInterruptTime, IN ULONG MaxSepInSeconds)
Definition: time.c:311
VOID NTAPI ExReleaseTimeRefreshLock(VOID)
Definition: time.c:177
BOOLEAN NTAPI ExAcquireTimeRefreshLock(IN BOOLEAN Wait)
Definition: time.c:145
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
_In_ WDFTIMER _In_ LONGLONG DueTime
Definition: wdftimer.h:190

Referenced by KdInitSystem().

◆ KdpWriteBreakpoint()

VOID NTAPI KdpWriteBreakpoint ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 236 of file kdapi.c.

239{
240 PDBGKD_WRITE_BREAKPOINT64 Breakpoint = &State->u.WriteBreakPoint;
242
243 /* Build header */
244 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
245 Header.Buffer = (PCHAR)State;
246 ASSERT(Data->Length == 0);
247
248 /* Create the breakpoint */
249 Breakpoint->BreakPointHandle =
251 if (!Breakpoint->BreakPointHandle)
252 {
253 /* We failed */
254 State->ReturnStatus = STATUS_UNSUCCESSFUL;
255 }
256 else
257 {
258 /* Success! */
259 State->ReturnStatus = STATUS_SUCCESS;
260 }
261
262 /* Send the packet */
264 &Header,
265 NULL,
266 &KdpContext);
267}
ULONG NTAPI KdpAddBreakpoint(IN PVOID Address)
Definition: kdbreak.c:20

Referenced by KdpSendWaitContinue().

◆ KdpWriteBreakPointEx()

NTSTATUS NTAPI KdpWriteBreakPointEx ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 304 of file kdapi.c.

307{
308 //PDBGKD_BREAKPOINTEX = &State->u.BreakPointEx;
310
311 /* TODO */
312 KdpDprintf("Extended Breakpoint Write support is unimplemented!\n");
313
314 /* Send a failure packet */
315 State->ReturnStatus = STATUS_UNSUCCESSFUL;
316 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
317 Header.Buffer = (PCHAR)State;
319 &Header,
320 Data,
321 &KdpContext);
322 return STATUS_UNSUCCESSFUL;
323}

Referenced by KdpSendWaitContinue().

◆ KdpWriteControlSpace()

VOID NTAPI KdpWriteControlSpace ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 692 of file kdapi.c.

695{
696 PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;
698
699 /* Setup the header */
700 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
701 Header.Buffer = (PCHAR)State;
702
703 /* Call the internal routine */
704 State->ReturnStatus = KdpSysWriteControlSpace(State->Processor,
705 WriteMemory->TargetBaseAddress,
706 Data->Buffer,
707 Data->Length,
708 &WriteMemory->ActualBytesWritten);
709
710 /* Send the reply */
712 &Header,
713 Data,
714 &KdpContext);
715}
NTSTATUS NTAPI KdpSysWriteControlSpace(_In_ ULONG Processor, _In_ ULONG64 BaseAddress, _In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _Out_ PULONG ActualLength)
Definition: kdx64.c:218
_Must_inspect_result_ _In_ WDFUSBPIPE _In_ WDFREQUEST _In_opt_ WDFMEMORY WriteMemory
Definition: wdfusb.h:1918

Referenced by KdpSendWaitContinue().

◆ KdpWriteCustomBreakpoint()

VOID NTAPI KdpWriteCustomBreakpoint ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 349 of file kdapi.c.

352{
353 //PDBGKD_WRITE_CUSTOM_BREAKPOINT = &State->u.WriteCustomBreakpoint;
355
356 /* Not supported */
357 KdpDprintf("Custom Breakpoint Write is unimplemented\n");
358
359 /* Send a failure packet */
360 State->ReturnStatus = STATUS_UNSUCCESSFUL;
361 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
362 Header.Buffer = (PCHAR)State;
364 &Header,
365 NULL,
366 &KdpContext);
367}

Referenced by KdpSendWaitContinue().

◆ KdpWriteIoSpace()

VOID NTAPI KdpWriteIoSpace ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 1122 of file kdapi.c.

1125{
1126 STRING Header;
1127 PDBGKD_READ_WRITE_IO64 WriteIo = &State->u.ReadWriteIo;
1128
1129 /* Setup the header */
1130 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1131 Header.Buffer = (PCHAR)State;
1132 ASSERT(Data->Length == 0);
1133
1134 /* Call the internal routine */
1135 State->ReturnStatus = KdpSysWriteIoSpace(Isa,
1136 0,
1137 1,
1138 WriteIo->IoAddress,
1139 &WriteIo->DataValue,
1140 WriteIo->DataSize,
1141 &WriteIo->DataSize);
1142
1143 /* Send the reply */
1145 &Header,
1146 NULL,
1147 &KdpContext);
1148}
NTSTATUS NTAPI KdpSysWriteIoSpace(_In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber, _In_ ULONG AddressSpace, _In_ ULONG64 IoAddress, _In_reads_bytes_(DataSize) PVOID DataValue, _In_ ULONG DataSize, _Out_ PULONG ActualDataSize)
Definition: kdx64.c:307

Referenced by KdpSendWaitContinue().

◆ KdpWriteIoSpaceExtended()

VOID NTAPI KdpWriteIoSpaceExtended ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 1189 of file kdapi.c.

1192{
1193 STRING Header;
1194 PDBGKD_READ_WRITE_IO_EXTENDED64 WriteIoExtended = &State->u.
1195 ReadWriteIoExtended;
1196
1197 /* Setup the header */
1198 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
1199 Header.Buffer = (PCHAR)State;
1200 ASSERT(Data->Length == 0);
1201
1202 /* Call the internal routine */
1203 State->ReturnStatus = KdpSysWriteIoSpace(WriteIoExtended->InterfaceType,
1204 WriteIoExtended->BusNumber,
1205 WriteIoExtended->AddressSpace,
1206 WriteIoExtended->IoAddress,
1207 &WriteIoExtended->DataValue,
1208 WriteIoExtended->DataSize,
1209 &WriteIoExtended->DataSize);
1210
1211 /* Send the reply */
1213 &Header,
1214 NULL,
1215 &KdpContext);
1216}

Referenced by KdpSendWaitContinue().

◆ KdpWriteMachineSpecificRegister()

VOID NTAPI KdpWriteMachineSpecificRegister ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 987 of file kdapi.c.

990{
992 PDBGKD_READ_WRITE_MSR WriteMsr = &State->u.ReadWriteMsr;
993 ULARGE_INTEGER MsrValue;
994
995 /* Setup the header */
996 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
997 Header.Buffer = (PCHAR)State;
998 ASSERT(Data->Length == 0);
999
1000 /* Call the internal routine */
1001 MsrValue.LowPart = WriteMsr->DataValueLow;
1002 MsrValue.HighPart = WriteMsr->DataValueHigh;
1003 State->ReturnStatus = KdpSysWriteMsr(WriteMsr->Msr, &MsrValue.QuadPart);
1004
1005 /* Send the reply */
1007 &Header,
1008 NULL,
1009 &KdpContext);
1010}
NTSTATUS NTAPI KdpSysWriteMsr(_In_ ULONG Msr, _In_ PULONGLONG MsrValue)
Definition: kdx64.c:116

Referenced by KdpSendWaitContinue().

◆ KdpWritePhysicalMemory()

VOID NTAPI KdpWritePhysicalMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 601 of file kdapi.c.

604{
605 PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;
607 ULONG Flags, CacheFlags;
608
609 /* Setup the header */
610 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
611 Header.Buffer = (PCHAR)State;
612
613 /* Start with the default flags */
615
616 /* Get the caching flags and check if a type is specified */
617 CacheFlags = WriteMemory->ActualBytesWritten;
618 if (CacheFlags == DBGKD_CACHING_CACHED)
619 {
620 /* Cached */
622 }
623 else if (CacheFlags == DBGKD_CACHING_UNCACHED)
624 {
625 /* Uncached */
627 }
628 else if (CacheFlags == DBGKD_CACHING_WRITE_COMBINED)
629 {
630 /* Write Combined */
632 }
633
634 /* Do the write */
635 State->ReturnStatus = KdpCopyMemoryChunks(WriteMemory->TargetBaseAddress,
636 Data->Buffer,
637 Data->Length,
638 0,
639 Flags,
640 &WriteMemory->ActualBytesWritten);
641
642 /* Send the packet */
644 &Header,
645 NULL,
646 &KdpContext);
647}
#define MMDBG_COPY_WRITE
Definition: mm.h:75

Referenced by KdpSendWaitContinue().

◆ KdpWriteVirtualMemory()

VOID NTAPI KdpWriteVirtualMemory ( IN PDBGKD_MANIPULATE_STATE64  State,
IN PSTRING  Data,
IN PCONTEXT  Context 
)

Definition at line 509 of file kdapi.c.

512{
513 PDBGKD_WRITE_MEMORY64 WriteMemory = &State->u.WriteMemory;
515
516 /* Setup the header */
517 Header.Length = sizeof(DBGKD_MANIPULATE_STATE64);
518 Header.Buffer = (PCHAR)State;
519
520 /* Do the write */
521 State->ReturnStatus = KdpCopyMemoryChunks(WriteMemory->TargetBaseAddress,
522 Data->Buffer,
523 Data->Length,
524 0,
527 &WriteMemory->ActualBytesWritten);
528
529 /* Send the packet */
531 &Header,
532 NULL,
533 &KdpContext);
534}

Referenced by KdpSendWaitContinue().

◆ KdpZeroMemory()

VOID NTAPI KdpZeroMemory ( _In_ PVOID  Destination,
_In_ SIZE_T  Length 
)

Definition at line 42 of file kdapi.c.

45{
46 PCHAR DestinationBytes;
47
48 /* Zero the buffer 1 byte at a time */
49 DestinationBytes = Destination;
50 while (Length--) *DestinationBytes++ = 0;
51}

Referenced by KdpReportCommandStringStateChange(), and KdpSetCommonState().

◆ KdRefreshDebuggerNotPresent()

BOOLEAN NTAPI KdRefreshDebuggerNotPresent ( VOID  )

Definition at line 2679 of file kdapi.c.

2680{
2681 BOOLEAN Enable, DebuggerNotPresent;
2682
2683 /* Check if the debugger is completely disabled */
2684 if (KdPitchDebugger)
2685 {
2686 /* Don't try to refresh then, fail early */
2687 return TRUE;
2688 }
2689
2690 /* Enter the debugger */
2692
2693 /*
2694 * Attempt to send a string to the debugger
2695 * to refresh the connection state.
2696 */
2697 KdpDprintf("KDTARGET: Refreshing KD connection\n");
2698
2699 /* Save the state while we are holding the lock */
2700 DebuggerNotPresent = KdDebuggerNotPresent;
2701
2702 /* Exit the debugger and return the state */
2704 return DebuggerNotPresent;
2705}
BOOLEAN NTAPI KdEnterDebugger(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
Definition: kdapi.c:1898
VOID NTAPI KdExitDebugger(IN BOOLEAN Enable)
Definition: kdapi.c:1951

Referenced by _FX_DRIVER_GLOBALS::IsDebuggerAttached().

◆ KdReportProcessorChange()

KCONTINUE_STATUS NTAPI KdReportProcessorChange ( VOID  )

Definition at line 1806 of file kdapi.c.

1808{
1809 PKPRCB CurrentPrcb = KeGetCurrentPrcb();
1811 EXCEPTION_RECORD ExceptionRecord = {0};
1813
1814 /* Save the port data */
1815 KdSave(FALSE);
1816
1819
1820 /* Report the new state */
1821 Status = KdpReportExceptionStateChange(&ExceptionRecord,
1823 FALSE);
1824
1825 /* Restore the port data */
1827
1828 return Status;
1829}
BOOLEAN NTAPI KdpReportExceptionStateChange(IN PEXCEPTION_RECORD ExceptionRecord, IN OUT PCONTEXT Context, IN BOOLEAN SecondChanceException)
Definition: kdapi.c:1751
_IRQL_requires_same_ _In_ PVOID _Inout_ struct _CONTEXT * ContextRecord
Definition: ntbasedef.h:662
#define STATUS_WAKE_SYSTEM_DEBUGGER
Definition: ntstatus.h:188
DWORD ExceptionCode
Definition: compat.h:208
PVOID ExceptionAddress
Definition: compat.h:211
KPROCESSOR_STATE ProcessorState
Definition: ketypes.h:672
CONTEXT ContextFrame
Definition: ketypes.h:625

Referenced by KiProcessorFreezeHandler().

◆ KdSystemDebugControl()

NTSTATUS NTAPI KdSystemDebugControl ( _In_ SYSDBG_COMMAND  Command,
_In_reads_bytes_(InputBufferLength) PVOID  InputBuffer,
_In_ ULONG  InputBufferLength,
_Out_writes_bytes_(OutputBufferLength) PVOID  OutputBuffer,
_In_ ULONG  OutputBufferLength,
_Out_opt_ PULONG  ReturnLength,
_In_ KPROCESSOR_MODE  PreviousMode 
)

Perform various queries to the kernel debugger.

Parameters
[in]CommandA SYSDBG_COMMAND value describing the kernel debugger command to perform.
[in]InputBufferPointer to a user-provided input command-specific buffer, whose length is given by InputBufferLength.
[in]InputBufferLengthThe size (in bytes) of the buffer pointed by InputBuffer.
[out]OutputBufferPointer to a user-provided command-specific output buffer, whose length is given by OutputBufferLength.
[in]OutputBufferLengthThe size (in bytes) of the buffer pointed by OutputBuffer.
[out]ReturnLengthOptional pointer to a ULONG variable that receives the actual length of data written written in the output buffer. It is always zero, except for the live dump commands where an actual non-zero length is returned.
[in]PreviousModeThe processor mode (KernelMode or UserMode) in which the command is being executed.
Returns
STATUS_SUCCESS in case of success, or a proper error code otherwise.
Remarks
  • This is a kernel-mode function, accessible only by kernel-mode drivers.
Note
See: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2004-2339
See also
NtSystemDebugControl()

Definition at line 2217 of file kdapi.c.

2225{
2227 ULONG Length = 0;
2228
2229 /* Handle some internal commands */
2230 switch ((ULONG)Command)
2231 {
2232#if DBG
2233 case ' soR': /* ROS-INTERNAL */
2234 {
2235 switch ((ULONG_PTR)InputBuffer)
2236 {
2237 case 0x21: // DumpAllThreads:
2239 break;
2240
2241 case 0x22: // DumpUserThreads:
2243 break;
2244
2245 case 0x24: // KdSpare3:
2247 break;
2248
2249 default:
2250 break;
2251 }
2252 return STATUS_SUCCESS;
2253 }
2254
2255#if defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c
2256 /* Register a debug callback */
2257 case 'CsoR':
2258 {
2259 switch (InputBufferLength)
2260 {
2261 case ID_Win32PreServiceHook:
2262 KeWin32PreServiceHook = InputBuffer;
2263 break;
2264
2265 case ID_Win32PostServiceHook:
2266 KeWin32PostServiceHook = InputBuffer;
2267 break;
2268
2269 }
2270 break;
2271 }
2272#endif
2273
2274 /* Special case for stack frame dumps */
2275 case 'DsoR':
2276 {
2278 break;
2279 }
2280#ifdef KDBG
2281 /* Register KDBG CLI callback */
2282 case 'RbdK':
2283 {
2285 }
2286#endif // KDBG
2287#endif
2288 default:
2289 break;
2290 }
2291
2292 switch (Command)
2293 {
2294 case SysDbgQueryVersion:
2296 {
2298 }
2299 else
2300 {
2303 }
2304 break;
2305
2306 case SysDbgReadVirtual:
2307 case SysDbgWriteVirtual:
2308 if (InputBufferLength != sizeof(SYSDBG_VIRTUAL))
2309 {
2311 }
2312 else
2313 {
2315 PVOID LockedBuffer;
2316 PMDL LockVariable;
2317
2319 Request.Request,
2322 &LockedBuffer,
2323 &LockVariable);
2324 if (NT_SUCCESS(Status))
2325 {
2327 Request.Buffer,
2328 Request.Request,
2329 0,
2331 &Length);
2332 ExUnlockUserBuffer(LockVariable);
2333 }
2334 }
2335 break;
2336
2337 case SysDbgReadPhysical:
2339 if (InputBufferLength != sizeof(SYSDBG_PHYSICAL))
2340 {
2342 }
2343 else
2344 {
2346 PVOID LockedBuffer;
2347 PMDL LockVariable;
2348
2350 Request.Request,
2353 &LockedBuffer,
2354 &LockVariable);
2355 if (NT_SUCCESS(Status))
2356 {
2357 Status = KdpCopyMemoryChunks(Request.Address.QuadPart,
2358 Request.Buffer,
2359 Request.Request,
2360 0,
2362 &Length);
2363 ExUnlockUserBuffer(LockVariable);
2364 }
2365 }
2366 break;
2367
2370 {
2372 }
2373 else
2374 {
2376 PVOID LockedBuffer;
2377 PMDL LockVariable;
2378
2380 Request.Request,
2383 &LockedBuffer,
2384 &LockVariable);
2385 if (NT_SUCCESS(Status))
2386 {
2388 Request.Address,
2389 LockedBuffer,
2390 Request.Request,
2391 &Length);
2392 ExUnlockUserBuffer(LockVariable);
2393 }
2394 }
2395 break;
2396
2399 {
2401 }
2402 else
2403 {
2405 PVOID LockedBuffer;
2406 PMDL LockVariable;
2407
2409 Request.Request,
2412 &LockedBuffer,
2413 &LockVariable);
2414 if (NT_SUCCESS(Status))
2415 {
2417 Request.Address,
2418 LockedBuffer,
2419 Request.Request,
2420 &Length);
2421 ExUnlockUserBuffer(LockVariable);
2422 }
2423 }
2424 break;
2425
2426 case SysDbgReadIoSpace:
2427 if (InputBufferLength != sizeof(SYSDBG_IO_SPACE))
2428 {
2430 }
2431 else
2432 {
2434 PVOID LockedBuffer;
2435 PMDL LockVariable;
2436
2438 Request.Request,
2441 &LockedBuffer,
2442 &LockVariable);
2443 if (NT_SUCCESS(Status))
2444 {
2445 Status = KdpSysReadIoSpace(Request.InterfaceType,
2446 Request.BusNumber,
2447 Request.AddressSpace,
2448 Request.Address,
2449 LockedBuffer,
2450 Request.Request,
2451 &Length);
2452 ExUnlockUserBuffer(LockVariable);
2453 }
2454 }
2455 break;
2456
2457 case SysDbgWriteIoSpace:
2458 if (InputBufferLength != sizeof(SYSDBG_IO_SPACE))
2459 {
2461 }
2462 else
2463 {
2465 PVOID LockedBuffer;
2466 PMDL LockVariable;
2467
2469 Request.Request,
2472 &LockedBuffer,
2473 &LockVariable);
2474 if (NT_SUCCESS(Status))
2475 {
2476 Status = KdpSysWriteIoSpace(Request.InterfaceType,
2477 Request.BusNumber,
2478 Request.AddressSpace,
2479 Request.Address,
2480 LockedBuffer,
2481 Request.Request,
2482 &Length);
2483 ExUnlockUserBuffer(LockVariable);
2484 }
2485 }
2486 break;
2487
2488 case SysDbgReadMsr:
2489 if (InputBufferLength != sizeof(SYSDBG_MSR))
2490 {
2492 }
2493 else
2494 {
2496 Status = KdpSysReadMsr(Request->Address, &Request->Data);
2497 }
2498 break;
2499
2500 case SysDbgWriteMsr:
2501 if (InputBufferLength != sizeof(SYSDBG_MSR))
2502 {
2504 }
2505 else
2506 {
2508 Status = KdpSysWriteMsr(Request->Address, &Request->Data);
2509 }
2510 break;
2511
2512 case SysDbgReadBusData:
2513 if (InputBufferLength != sizeof(SYSDBG_BUS_DATA))
2514 {
2516 }
2517 else
2518 {
2520 PVOID LockedBuffer;
2521 PMDL LockVariable;
2522
2524 Request.Request,
2527 &LockedBuffer,
2528 &LockVariable);
2529 if (NT_SUCCESS(Status))
2530 {
2531 Status = KdpSysReadBusData(Request.BusDataType,
2532 Request.BusNumber,
2533 Request.SlotNumber,
2534 Request.Address,
2535 LockedBuffer,
2536 Request.Request,
2537 &Length);
2538 ExUnlockUserBuffer(LockVariable);
2539 }
2540 }
2541 break;
2542
2543 case SysDbgWriteBusData:
2544 if (InputBufferLength != sizeof(SYSDBG_BUS_DATA))
2545 {
2547 }
2548 else
2549 {
2551 PVOID LockedBuffer;
2552 PMDL LockVariable;
2553
2555 Request.Request,
2558 &LockedBuffer,
2559 &LockVariable);
2560 if (NT_SUCCESS(Status))
2561 {
2562 Status = KdpSysWriteBusData(Request.BusDataType,
2563 Request.BusNumber,
2564 Request.SlotNumber,
2565 Request.Address,
2566 LockedBuffer,
2567 Request.Request,
2568 &Length);
2569 ExUnlockUserBuffer(LockVariable);
2570 }
2571 }
2572 break;
2573
2576 break;
2577
2578 default:
2580 break;
2581 }
2582
2583 if (ReturnLength)
2585
2586 return Status;
2587}
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG _In_ KPROCESSOR_MODE PreviousMode
#define KeRosDumpStackFrames(Frames, Count)
Definition: gdidebug.h:11
VOID NTAPI PspDumpThreads(BOOLEAN SystemThreads)
BOOLEAN NTAPI KdbRegisterCliCallback(PVOID Callback, BOOLEAN Deregister)
Definition: kdb_cli.c:3203
struct _SYSDBG_MSR * PSYSDBG_MSR
struct _SYSDBG_CONTROL_SPACE * PSYSDBG_CONTROL_SPACE
struct _SYSDBG_BUS_DATA * PSYSDBG_BUS_DATA
struct _SYSDBG_PHYSICAL * PSYSDBG_PHYSICAL
@ SysDbgCheckLowMemory
Definition: kdtypes.h:82
@ SysDbgReadPhysical
Definition: kdtypes.h:72
@ SysDbgReadMsr
Definition: kdtypes.h:78
@ SysDbgWriteControlSpace
Definition: kdtypes.h:75
@ SysDbgWriteBusData
Definition: kdtypes.h:81
@ SysDbgWriteVirtual
Definition: kdtypes.h:71
@ SysDbgWritePhysical
Definition: kdtypes.h:73
@ SysDbgQueryVersion
Definition: kdtypes.h:69
@ SysDbgReadControlSpace
Definition: kdtypes.h:74
@ SysDbgReadBusData
Definition: kdtypes.h:80
@ SysDbgReadIoSpace
Definition: kdtypes.h:76
@ SysDbgWriteMsr
Definition: kdtypes.h:79
@ SysDbgReadVirtual
Definition: kdtypes.h:70
@ SysDbgWriteIoSpace
Definition: kdtypes.h:77
struct _SYSDBG_IO_SPACE * PSYSDBG_IO_SPACE
struct _SYSDBG_VIRTUAL * PSYSDBG_VIRTUAL
VOID NTAPI ExUnlockUserBuffer(PMDL Mdl)
Definition: sysinfo.c:194
NTSTATUS NTAPI ExLockUserBuffer(PVOID BaseAddress, ULONG Length, KPROCESSOR_MODE AccessMode, LOCK_OPERATION Operation, PVOID *MappedSystemVa, PMDL *OutMdl)
Definition: sysinfo.c:202
VOID NTAPI MmDumpArmPfnDatabase(IN BOOLEAN StatusOnly)
Definition: mminit.c:1465
Definition: shell.h:41
uint32_t * PULONG_PTR
Definition: typedefs.h:65
#define STATUS_INFO_LENGTH_MISMATCH
Definition: udferr_usr.h:133
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:320
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
Definition: wdfio.h:322
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
@ IoReadAccess
Definition: ketypes.h:863
@ IoWriteAccess
Definition: ketypes.h:864

Referenced by DriverEntry(), i8042KbdInterruptService(), KdbpCmdRegs(), KdRosDumpStackFrames(), KdRosSetDebugCallback(), and NtSystemDebugControl().

◆ NtQueryDebugFilterState()

NTSTATUS NTAPI NtQueryDebugFilterState ( _In_ ULONG  ComponentId,
_In_ ULONG  Level 
)

Definition at line 2712 of file kdapi.c.

2715{
2716 PULONG Mask;
2717
2718 /* Check if the ID fits in the component table */
2720 {
2721 /* It does, so get the mask from there */
2723 }
2724 else if (ComponentId == MAXULONG)
2725 {
2726 /*
2727 * This is the internal ID used for DbgPrint messages without ID
2728 * and Level. Use the system-wide mask for those.
2729 */
2731 }
2732 else
2733 {
2734#if (NTDDI_VERSION >= NTDDI_VISTA)
2735 /* Use the default component ID */
2737 // Level = DPFLTR_INFO_LEVEL; // Override the Level.
2738#else
2739 /* Invalid ID, fail */
2741#endif
2742 }
2743
2744 /* Convert Level to bit field if required */
2745 if (Level < 32) Level = 1 << Level;
2746 Level &= ~DPFLTR_MASK;
2747
2748 /* Determine if this Level is filtered out */
2749 if ((Kd_WIN2000_Mask & Level) || (*Mask & Level))
2750 {
2751 /* This mask will get through to the debugger */
2752 return (NTSTATUS)TRUE;
2753 }
2754 else
2755 {
2756 /* This mask is filtered out */
2757 return (NTSTATUS)FALSE;
2758 }
2759}
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char const char UINT32 ComponentId
Definition: acpixf.h:1281
unsigned int Mask
Definition: fpcontrol.c:82
ULONG Kd_WIN2000_Mask
Definition: kddata.c:143
ULONG KdComponentTableSize
Definition: kddata.c:484
ULONG Kd_DEFAULT_Mask
Definition: kddata.c:245
PULONG KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES]
Definition: kddata.c:314
#define MAXULONG
Definition: typedefs.h:251
uint32_t * PULONG
Definition: typedefs.h:59
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56

Referenced by DbgQueryDebugFilterState(), KdpPrint(), and vDbgPrintExWithPrefixInternal().

◆ NtSetDebugFilterState()

NTSTATUS NTAPI NtSetDebugFilterState ( _In_ ULONG  ComponentId,
_In_ ULONG  Level,
_In_ BOOLEAN  State 
)

Definition at line 2766 of file kdapi.c.

2770{
2771 PULONG Mask;
2772
2773 /* Modifying debug filters requires the debug privilege */
2775 {
2776 /* Fail */
2777 return STATUS_ACCESS_DENIED;
2778 }
2779
2780 /* Check if the ID fits in the component table */
2782 {
2783 /* It does, so get the mask from there */
2785 }
2786 else if (ComponentId == MAXULONG)
2787 {
2788 /*
2789 * This is the internal ID used for DbgPrint messages without ID
2790 * and Level. Use the system-wide mask for those.
2791 */
2793 }
2794 else
2795 {
2796#if (NTDDI_VERSION >= NTDDI_VISTA)
2797 /* Use the default component ID */
2799#else
2800 /* Invalid ID, fail */
2802#endif
2803 }
2804
2805 /* Convert Level to bit field if required */
2806 if (Level < 32) Level = 1 << Level;
2807 Level &= ~DPFLTR_MASK;
2808
2809 /* Set or remove the Level */
2810 if (State)
2811 *Mask |= Level;
2812 else
2813 *Mask &= ~Level;
2814
2815 return STATUS_SUCCESS;
2816}
#define ExGetPreviousMode
Definition: ex.h:143
const LUID SeDebugPrivilege
Definition: priv.c:39
BOOLEAN NTAPI SeSinglePrivilegeCheck(_In_ LUID PrivilegeValue, _In_ KPROCESSOR_MODE PreviousMode)
Checks if a single privilege is present in the context of the calling thread.
Definition: priv.c:744

Referenced by DbgSetDebugFilterState(), and KdbpCmdFilter().

◆ PspDumpThreads()

VOID NTAPI PspDumpThreads ( BOOLEAN  SystemThreads)

Referenced by KdSystemDebugControl().