mirror of
https://github.com/reactos/reactos.git
synced 2024-07-01 02:10:07 +00:00
[NTOS:KD] Merge some more functions with kd64
Functions are KdIsThisAKdTrap, KdUpdateDataBlock, KdEnterDebugger, KdExitDebugger, KdRefreshDebuggerNotPresent, KdDisableDebugger, KdEnableDebuggerWithLock, KdEnableDebugger, KdSystemDebugControl
This commit is contained in:
parent
d0e2fada23
commit
660948ce6f
|
@ -45,117 +45,13 @@
|
|||
|
||||
/* VARIABLES ***************************************************************/
|
||||
|
||||
BOOLEAN KdDebuggerEnabled = FALSE;
|
||||
BOOLEAN KdEnteredDebugger = FALSE;
|
||||
BOOLEAN KdDebuggerNotPresent = TRUE;
|
||||
BOOLEAN KdBreakAfterSymbolLoad = FALSE;
|
||||
BOOLEAN KdPitchDebugger = TRUE;
|
||||
BOOLEAN KdIgnoreUmExceptions = FALSE;
|
||||
|
||||
VOID NTAPI PspDumpThreads(BOOLEAN SystemThreads);
|
||||
|
||||
#if 0
|
||||
ULONG Kd_DEFAULT_MASK = 1 << DPFLTR_ERROR_LEVEL;
|
||||
#endif
|
||||
|
||||
extern CPPORT PortInfo;
|
||||
extern ANSI_STRING KdpLogFileName;
|
||||
|
||||
/* PRIVATE FUNCTIONS *********************************************************/
|
||||
|
||||
ULONG
|
||||
NTAPI
|
||||
KdpServiceDispatcher(ULONG Service,
|
||||
PVOID Buffer1,
|
||||
ULONG Buffer1Length,
|
||||
KPROCESSOR_MODE PreviousMode)
|
||||
{
|
||||
ULONG Result = 0;
|
||||
|
||||
switch (Service)
|
||||
{
|
||||
case BREAKPOINT_PRINT: /* DbgPrint */
|
||||
{
|
||||
/* Call KDBG */
|
||||
BOOLEAN Handled;
|
||||
Result = KdpPrint(MAXULONG,
|
||||
DPFLTR_INFO_LEVEL,
|
||||
(PCHAR)Buffer1,
|
||||
(USHORT)Buffer1Length,
|
||||
PreviousMode,
|
||||
NULL, // TrapFrame,
|
||||
NULL, // ExceptionFrame,
|
||||
&Handled);
|
||||
break;
|
||||
}
|
||||
|
||||
#if DBG
|
||||
case ' soR': /* ROS-INTERNAL */
|
||||
{
|
||||
switch ((ULONG_PTR)Buffer1)
|
||||
{
|
||||
case DumpAllThreads:
|
||||
PspDumpThreads(TRUE);
|
||||
break;
|
||||
|
||||
case DumpUserThreads:
|
||||
PspDumpThreads(FALSE);
|
||||
break;
|
||||
|
||||
case KdSpare3:
|
||||
MmDumpArmPfnDatabase(FALSE);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#if defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c
|
||||
/* Register a debug callback */
|
||||
case 'CsoR':
|
||||
{
|
||||
switch (Buffer1Length)
|
||||
{
|
||||
case ID_Win32PreServiceHook:
|
||||
KeWin32PreServiceHook = Buffer1;
|
||||
break;
|
||||
|
||||
case ID_Win32PostServiceHook:
|
||||
KeWin32PostServiceHook = Buffer1;
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Special case for stack frame dumps */
|
||||
case 'DsoR':
|
||||
{
|
||||
KeRosDumpStackFrames((PULONG_PTR)Buffer1, Buffer1Length);
|
||||
break;
|
||||
}
|
||||
|
||||
#if defined(KDBG)
|
||||
/* Register KDBG CLI callback */
|
||||
case 'RbdK':
|
||||
{
|
||||
Result = KdbRegisterCliCallback(Buffer1, Buffer1Length);
|
||||
break;
|
||||
}
|
||||
#endif /* KDBG */
|
||||
#endif /* DBG */
|
||||
default:
|
||||
DPRINT1("Invalid debug service call!\n");
|
||||
HalDisplayString("Invalid debug service call!\r\n");
|
||||
break;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
KdpTrap(IN PKTRAP_FRAME TrapFrame,
|
||||
|
@ -309,129 +205,9 @@ KdpStub(IN PKTRAP_FRAME TrapFrame,
|
|||
SecondChanceException);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
KdIsThisAKdTrap(IN PEXCEPTION_RECORD ExceptionRecord,
|
||||
IN PCONTEXT Context,
|
||||
IN KPROCESSOR_MODE PreviousMode)
|
||||
{
|
||||
/* KDBG has its own mechanism for ignoring user mode exceptions */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS *********************************************************/
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
KdUpdateDataBlock(VOID)
|
||||
{
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
KdEnterDebugger(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
KdExitDebugger(IN BOOLEAN Enable)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
KdRefreshDebuggerNotPresent(VOID)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
|
||||
/* Just return whatever was set previously -- FIXME! */
|
||||
return KdDebuggerNotPresent;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KdDisableDebugger(VOID)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
|
||||
/* Raise IRQL */
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
|
||||
/* TODO: Disable any breakpoints */
|
||||
|
||||
/* Disable the Debugger */
|
||||
KdDebuggerEnabled = FALSE;
|
||||
SharedUserData->KdDebuggerEnabled = FALSE;
|
||||
|
||||
/* Lower the IRQL */
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KdEnableDebuggerWithLock(IN BOOLEAN NeedLock)
|
||||
{
|
||||
return STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KdEnableDebugger(VOID)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
|
||||
/* Raise IRQL */
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
|
||||
/* TODO: Re-enable any breakpoints */
|
||||
|
||||
/* Enable the Debugger */
|
||||
KdDebuggerEnabled = TRUE;
|
||||
SharedUserData->KdDebuggerEnabled = TRUE;
|
||||
|
||||
/* Lower the IRQL */
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KdSystemDebugControl(IN SYSDBG_COMMAND Command,
|
||||
IN PVOID InputBuffer,
|
||||
IN ULONG InputBufferLength,
|
||||
OUT PVOID OutputBuffer,
|
||||
IN ULONG OutputBufferLength,
|
||||
IN OUT PULONG ReturnLength,
|
||||
IN KPROCESSOR_MODE PreviousMode)
|
||||
{
|
||||
/* HACK */
|
||||
return KdpServiceDispatcher(Command,
|
||||
InputBuffer,
|
||||
InputBufferLength,
|
||||
PreviousMode);
|
||||
}
|
||||
|
||||
PCHAR
|
||||
static PCHAR
|
||||
NTAPI
|
||||
KdpGetDebugMode(PCHAR Currentp2)
|
||||
{
|
||||
|
|
|
@ -1874,12 +1874,14 @@ KdpQueryPerformanceCounter(IN PKTRAP_FRAME TrapFrame)
|
|||
/* Otherwise, do the call */
|
||||
return KeQueryPerformanceCounter(NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
KdEnterDebugger(IN PKTRAP_FRAME TrapFrame,
|
||||
IN PKEXCEPTION_FRAME ExceptionFrame)
|
||||
{
|
||||
#ifdef _WINKD_
|
||||
BOOLEAN Enable;
|
||||
|
||||
/* Check if we have a trap frame */
|
||||
|
@ -1926,12 +1928,16 @@ KdEnterDebugger(IN PKTRAP_FRAME TrapFrame,
|
|||
|
||||
/* Return if interrupts needs to be re-enabled */
|
||||
return Enable;
|
||||
#else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
KdExitDebugger(IN BOOLEAN Enable)
|
||||
{
|
||||
#ifdef _WINKD_
|
||||
ULONG TimeSlip;
|
||||
|
||||
/* Restore the state and unlock the port */
|
||||
|
@ -1961,12 +1967,14 @@ KdExitDebugger(IN BOOLEAN Enable)
|
|||
InterlockedIncrement(&KdpTimeSlipPending);
|
||||
KeInsertQueueDpc(&KdpTimeSlipDpc, NULL, NULL); // FIXME: this can trigger context switches!
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KdEnableDebuggerWithLock(IN BOOLEAN NeedLock)
|
||||
{
|
||||
#ifdef _WINKD_
|
||||
KIRQL OldIrql;
|
||||
|
||||
#if defined(__GNUC__)
|
||||
|
@ -2037,12 +2045,31 @@ KdEnableDebuggerWithLock(IN BOOLEAN NeedLock)
|
|||
|
||||
/* We're done */
|
||||
return STATUS_SUCCESS;
|
||||
#else
|
||||
KIRQL OldIrql;
|
||||
|
||||
/* Raise IRQL */
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
|
||||
/* TODO: Re-enable any breakpoints */
|
||||
|
||||
/* Enable the Debugger */
|
||||
KdDebuggerEnabled = TRUE;
|
||||
SharedUserData->KdDebuggerEnabled = TRUE;
|
||||
|
||||
/* Lower the IRQL */
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
#endif
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KdDisableDebuggerWithLock(IN BOOLEAN NeedLock)
|
||||
{
|
||||
#ifdef _WINKD_
|
||||
KIRQL OldIrql;
|
||||
NTSTATUS Status;
|
||||
|
||||
|
@ -2127,14 +2154,33 @@ KdDisableDebuggerWithLock(IN BOOLEAN NeedLock)
|
|||
|
||||
/* We're done */
|
||||
return STATUS_SUCCESS;
|
||||
#else
|
||||
KIRQL OldIrql;
|
||||
|
||||
if (!NeedLock)
|
||||
{
|
||||
return STATUS_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
#endif // _WINKD_
|
||||
/* Raise IRQL */
|
||||
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||
|
||||
/* TODO: Disable any breakpoints */
|
||||
|
||||
/* Disable the Debugger */
|
||||
KdDebuggerEnabled = FALSE;
|
||||
SharedUserData->KdDebuggerEnabled = FALSE;
|
||||
|
||||
/* Lower the IRQL */
|
||||
KeLowerIrql(OldIrql);
|
||||
|
||||
/* Return success */
|
||||
return STATUS_SUCCESS;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS **********************************************************/
|
||||
|
||||
#ifdef _WINKD_
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
@ -2174,6 +2220,21 @@ KdSystemDebugControl(
|
|||
/* Handle some internal commands */
|
||||
switch ((ULONG)Command)
|
||||
{
|
||||
#ifndef _WINKD_
|
||||
case BREAKPOINT_PRINT: /* DbgPrint */
|
||||
{
|
||||
/* Call KDBG */
|
||||
BOOLEAN Handled;
|
||||
return KdpPrint(MAXULONG,
|
||||
DPFLTR_INFO_LEVEL,
|
||||
(PCHAR)InputBuffer,
|
||||
(USHORT)InputBufferLength,
|
||||
PreviousMode,
|
||||
NULL, // TrapFrame,
|
||||
NULL, // ExceptionFrame,
|
||||
&Handled);
|
||||
}
|
||||
#endif
|
||||
#if DBG
|
||||
case ' soR': /* ROS-INTERNAL */
|
||||
{
|
||||
|
@ -2197,12 +2258,38 @@ KdSystemDebugControl(
|
|||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
#if defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c
|
||||
/* Register a debug callback */
|
||||
case 'CsoR':
|
||||
{
|
||||
switch (InputBufferLength)
|
||||
{
|
||||
case ID_Win32PreServiceHook:
|
||||
KeWin32PreServiceHook = InputBuffer;
|
||||
break;
|
||||
|
||||
case ID_Win32PostServiceHook:
|
||||
KeWin32PostServiceHook = InputBuffer;
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Special case for stack frame dumps */
|
||||
case 'DsoR':
|
||||
{
|
||||
KeRosDumpStackFrames((PULONG_PTR)InputBuffer, InputBufferLength);
|
||||
break;
|
||||
}
|
||||
#if defined(KDBG)
|
||||
/* Register KDBG CLI callback */
|
||||
case 'RbdK':
|
||||
{
|
||||
return KdbRegisterCliCallback(InputBuffer, InputBufferLength);
|
||||
}
|
||||
#endif /* KDBG */
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
|
@ -2212,7 +2299,6 @@ KdSystemDebugControl(
|
|||
DbgPrint("KdSystemDebugControl is unimplemented!\n");
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
@ -2299,7 +2385,6 @@ KdPowerTransition(IN DEVICE_POWER_STATE NewState)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef _WINKD_
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
@ -2333,8 +2418,6 @@ KdRefreshDebuggerNotPresent(VOID)
|
|||
return DebuggerNotPresent;
|
||||
}
|
||||
|
||||
#endif // _WINKD_
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
|
|
@ -84,16 +84,16 @@ KdpPrintBanner(IN SIZE_T MemSizeMBs)
|
|||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
#ifdef _WINKD_
|
||||
VOID
|
||||
NTAPI
|
||||
KdUpdateDataBlock(VOID)
|
||||
{
|
||||
#ifdef _WINKD_
|
||||
/* Update the KeUserCallbackDispatcher pointer */
|
||||
KdDebuggerDataBlock.KeUserCallbackDispatcher =
|
||||
(ULONG_PTR)KeUserCallbackDispatcher;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
|
|
|
@ -312,6 +312,7 @@ KdpStub(IN PKTRAP_FRAME TrapFrame,
|
|||
return FALSE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
|
@ -319,6 +320,7 @@ KdIsThisAKdTrap(IN PEXCEPTION_RECORD ExceptionRecord,
|
|||
IN PCONTEXT Context,
|
||||
IN KPROCESSOR_MODE PreviousMode)
|
||||
{
|
||||
#ifdef _WINKD_
|
||||
/*
|
||||
* Determine if this is a valid debug service call and make sure that
|
||||
* it isn't a software breakpoint
|
||||
|
@ -335,6 +337,8 @@ KdIsThisAKdTrap(IN PEXCEPTION_RECORD ExceptionRecord,
|
|||
/* We don't have to handle it */
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
/* KDBG has its own mechanism for ignoring user mode exceptions */
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue