/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Kernel
- * FILE: ntoskrnl/kd/kdinit.c
+ * FILE: ntoskrnl/kd/kdmain.c
* PURPOSE: Kernel Debugger Initialization
*
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
typedef struct
{
- ULONG ComponentId;
- ULONG Level;
+ ULONG ComponentId;
+ ULONG Level;
} KD_COMPONENT_DATA;
#define MAX_KD_COMPONENT_TABLE_ENTRIES 128
KD_COMPONENT_DATA KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES];
NTAPI
KdpServiceDispatcher(ULONG Service,
PVOID Buffer1,
- ULONG Buffer1Length)
+ ULONG Buffer1Length,
+ KPROCESSOR_MODE PreviousMode)
{
ULONG Result = 0;
switch (Service)
{
case BREAKPOINT_PRINT: /* DbgPrint */
- Result = KdpPrintString(Buffer1, Buffer1Length);
+ Result = KdpPrintString(Buffer1, Buffer1Length, PreviousMode);
break;
#if DBG
break;
}
+#if defined(_M_IX86) && !defined(_WINKD_) // See ke/i386/traphdlr.c
/* Register a debug callback */
case 'CsoR':
{
}
break;
}
+#endif
/* Special case for stack frame dumps */
case 'DsoR':
break;
}
-#if KDBG
+#if defined(KDBG)
/* Register KDBG CLI callback */
case 'RbdK':
{
/* Print the string */
KdpServiceDispatcher(BREAKPOINT_PRINT,
(PVOID)ExceptionRecord->ExceptionInformation[1],
- ExceptionRecord->ExceptionInformation[2]);
+ ExceptionRecord->ExceptionInformation[2],
+ PreviousMode);
/* Return success */
KeSetContextReturnRegister(Context, STATUS_SUCCESS);
#ifdef KDBG
else if (ExceptionCommand == BREAKPOINT_LOAD_SYMBOLS)
{
+ PKD_SYMBOLS_INFO SymbolsInfo;
+ KD_SYMBOLS_INFO CapturedSymbolsInfo;
PLDR_DATA_TABLE_ENTRY LdrEntry;
- /* Load symbols. Currently implemented only for KDBG! */
- if(KdbpSymFindModule(((PKD_SYMBOLS_INFO)ExceptionRecord->ExceptionInformation[2])->BaseOfDll, NULL, -1, &LdrEntry))
- KdbSymProcessSymbols(LdrEntry);
+ SymbolsInfo = (PKD_SYMBOLS_INFO)ExceptionRecord->ExceptionInformation[2];
+ if (PreviousMode != KernelMode)
+ {
+ _SEH2_TRY
+ {
+ ProbeForRead(SymbolsInfo,
+ sizeof(*SymbolsInfo),
+ 1);
+ RtlCopyMemory(&CapturedSymbolsInfo,
+ SymbolsInfo,
+ sizeof(*SymbolsInfo));
+ SymbolsInfo = &CapturedSymbolsInfo;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ SymbolsInfo = NULL;
+ }
+ _SEH2_END;
+ }
+
+ if (SymbolsInfo != NULL)
+ {
+ /* Load symbols. Currently implemented only for KDBG! */
+ if (KdbpSymFindModule(SymbolsInfo->BaseOfDll, NULL, -1, &LdrEntry))
+ {
+ KdbSymProcessSymbols(LdrEntry);
+ }
+ }
}
else if (ExceptionCommand == BREAKPOINT_PROMPT)
{
(USHORT)ExceptionRecord->
ExceptionInformation[2],
OutString,
- OutStringLength);
+ OutStringLength,
+ PreviousMode);
/* Return the number of characters that we received */
Context->Eax = ReturnValue;
/* Disable the Debugger */
KdDebuggerEnabled = FALSE;
+ SharedUserData->KdDebuggerEnabled = FALSE;
/* Lower the IRQL */
KeLowerIrql(OldIrql);
/* Enable the Debugger */
KdDebuggerEnabled = TRUE;
+ SharedUserData->KdDebuggerEnabled = TRUE;
/* Lower the IRQL */
KeLowerIrql(OldIrql);
Level = 1 << Level;
/* Check if it is not the default component */
- if (ComponentId != DPFLTR_DEFAULT_ID)
+ if (ComponentId != MAXULONG)
{
/* No, search for an existing entry in the table */
for (i = 0; i < KdComponentTableEntries; i++)
Level &= ~DPFLTR_MASK;
/* Check if it is the default component */
- if (ComponentId == DPFLTR_DEFAULT_ID)
+ if (ComponentId == MAXULONG)
{
/* Yes, modify the default mask */
if (State)
IN KPROCESSOR_MODE PreviousMode)
{
/* HACK */
- return KdpServiceDispatcher(Command, InputBuffer, InputBufferLength);
+ return KdpServiceDispatcher(Command,
+ InputBuffer,
+ InputBufferLength,
+ PreviousMode);
}
PKDEBUG_ROUTINE KiDebugRoutine = KdpEnterDebuggerException;