--- /dev/null
+/*\r
+ * PROJECT: ReactOS Kernel\r
+ * LICENSE: GPL - See COPYING in the top level directory\r
+ * FILE: ntoskrnl/kd64/kdprint.c\r
+ * PURPOSE: KD64 Trap Handler Routines\r
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)\r
+ */\r
+\r
+/* INCLUDES ******************************************************************/\r
+\r
+#include <ntoskrnl.h>\r
+#define NDEBUG\r
+#include <debug.h>\r
+\r
+CHAR KdpMessageBuffer[4096];\r
+\r
+/* FUNCTIONS *****************************************************************/\r
+\r
+BOOLEAN\r
+NTAPI\r
+KdpPrintString(IN PSTRING Output)\r
+{\r
+ STRING Data, Header;\r
+ DBGKD_DEBUG_IO DebugIo;\r
+ ULONG Length = Output->Length;\r
+\r
+ /* Copy the string */\r
+ RtlMoveMemory(KdpMessageBuffer, Output->Buffer, Length);\r
+\r
+ /* Make sure we don't exceed the KD Packet size */\r
+ if ((sizeof(DBGKD_DEBUG_IO) + Length) > PACKET_MAX_SIZE)\r
+ {\r
+ /* Normalize length */\r
+ Length = PACKET_MAX_SIZE - sizeof(DBGKD_DEBUG_IO);\r
+ }\r
+\r
+ /* Build the packet header */\r
+ DebugIo.ApiNumber = DbgKdPrintStringApi;\r
+ DebugIo.ProcessorLevel = KeProcessorLevel;\r
+ DebugIo.Processor = KeGetCurrentPrcb()->Number;\r
+ DebugIo.u.PrintString.LengthOfString = Length;\r
+ Header.Length = sizeof(DBGKD_DEBUG_IO);\r
+ Header.Buffer = (PCHAR)&DebugIo;\r
+\r
+ /* Build the data */\r
+ Data.Length = Length;\r
+ Data.Buffer = KdpMessageBuffer;\r
+\r
+ /* Send the packet */\r
+ KdSendPacket(PACKET_TYPE_KD_DEBUG_IO, &Header, &Data, &KdpContext);\r
+\r
+ /* Check if the user pressed CTRL+C */\r
+ return KdpPollBreakInWithPortLock();\r
+}\r
+\r
+ULONG\r
+NTAPI\r
+KdpCommandString(IN ULONG Length,\r
+ IN LPSTR String,\r
+ IN KPROCESSOR_MODE PreviousMode,\r
+ IN PCONTEXT ContextRecord,\r
+ IN PKTRAP_FRAME TrapFrame,\r
+ IN PKEXCEPTION_FRAME ExceptionFrame)\r
+{\r
+ /* FIXME */\r
+ return FALSE;\r
+}\r
+\r
+ULONG\r
+NTAPI\r
+KdpSymbol(IN LPSTR DllPath,\r
+ IN ULONG DllBase,\r
+ IN BOOLEAN Unload,\r
+ IN KPROCESSOR_MODE PreviousMode,\r
+ IN PCONTEXT ContextRecord,\r
+ IN PKTRAP_FRAME TrapFrame,\r
+ IN PKEXCEPTION_FRAME ExceptionFrame)\r
+{\r
+ BOOLEAN Entered;\r
+ PKPRCB Prcb = KeGetCurrentPrcb();\r
+ ULONG Status;\r
+\r
+ /* Check if we need to do anything */\r
+ if ((PreviousMode != KernelMode) || (KdDebuggerNotPresent)) return 0;\r
+\r
+ /* Enter the debugger */\r
+ Entered = KdEnterDebugger(TrapFrame, ExceptionFrame);\r
+\r
+ /* Save the CPU Control State and save the context */\r
+ KiSaveProcessorControlState(&Prcb->ProcessorState);\r
+ RtlCopyMemory(&Prcb->ProcessorState.ContextFrame,\r
+ ContextRecord,\r
+ sizeof(CONTEXT));\r
+\r
+ /* Report the new state */\r
+#if 0\r
+ Status = KdpReportLoadSymbolsStateChange(DllPath,\r
+ DllBase,\r
+ Unload,\r
+ &Prcb->\r
+ ProcessorState.ContextFrame);\r
+#else\r
+ Status = FALSE;\r
+#endif\r
+\r
+ /* Now restore the processor state, manually again. */\r
+ RtlCopyMemory(ContextRecord,\r
+ &Prcb->ProcessorState.ContextFrame,\r
+ sizeof(CONTEXT));\r
+ KiRestoreProcessorControlState(&Prcb->ProcessorState);\r
+\r
+ /* Exit the debugger and clear the CTRL-C state */\r
+ KdExitDebugger(Entered);\r
+ return 0;\r
+}\r
+\r
+ULONG\r
+NTAPI\r
+KdpPrompt(IN LPSTR InString,\r
+ IN ULONG InStringLength,\r
+ OUT LPSTR OutString,\r
+ IN ULONG OutStringLength,\r
+ IN KPROCESSOR_MODE PreviousMode,\r
+ IN PKTRAP_FRAME TrapFrame,\r
+ IN PKEXCEPTION_FRAME ExceptionFrame)\r
+{\r
+ /* FIXME */\r
+ return FALSE;\r
+}\r
+\r
+ULONG\r
+NTAPI\r
+KdpPrint(IN ULONG ComponentId,\r
+ IN ULONG ComponentMask,\r
+ IN LPSTR String,\r
+ IN ULONG Length,\r
+ IN KPROCESSOR_MODE PreviousMode,\r
+ IN PKTRAP_FRAME TrapFrame,\r
+ IN PKEXCEPTION_FRAME ExceptionFrame,\r
+ OUT PBOOLEAN Status)\r
+{\r
+ NTSTATUS ReturnValue;\r
+ BOOLEAN Entered;\r
+ ANSI_STRING AnsiString;\r
+\r
+ /* Assume failure */\r
+ *Status = FALSE;\r
+\r
+ /* Validate the mask */\r
+ if (ComponentMask <= 0x1F) ComponentMask = 1 << ComponentMask;\r
+ if (!(Kd_WIN2000_Mask & ComponentMask) ||\r
+ ((ComponentId < KdComponentTableSize) &&\r
+ !(*KdComponentTable[ComponentId] & ComponentMask)))\r
+ {\r
+ /* Mask validation failed */\r
+ *Status = TRUE;\r
+ return FALSE;\r
+ }\r
+\r
+ /* Normalize the length */\r
+ Length = min(Length, 512);\r
+\r
+ /* Check if we need to verify the buffer */\r
+ if (PreviousMode != KernelMode)\r
+ {\r
+ /* FIXME: Support user-mode */\r
+ }\r
+\r
+ /* Setup the ANSI string */\r
+ AnsiString.Buffer = String;\r
+ AnsiString.Length = (USHORT)Length;\r
+\r
+ /* Log the print */\r
+ //KdLogDbgPrint(&AnsiString);\r
+\r
+ /* Check for a debugger */\r
+ if (KdDebuggerNotPresent)\r
+ {\r
+ /* Fail */\r
+ *Status = TRUE;\r
+ return (ULONG)STATUS_DEVICE_NOT_CONNECTED;\r
+ }\r
+\r
+ /* Enter the debugger */\r
+ Entered = KdEnterDebugger(TrapFrame, ExceptionFrame);\r
+\r
+ /* Print the string */\r
+ if (KdpPrintString(&AnsiString))\r
+ {\r
+ /* User pressed CTRL-C, breakpoint on return */\r
+ ReturnValue = STATUS_BREAKPOINT;\r
+ }\r
+ else\r
+ {\r
+ /* String was printed */\r
+ ReturnValue = STATUS_SUCCESS;\r
+ }\r
+\r
+ /* Exit the debugger and return */\r
+ KdExitDebugger(Entered);\r
+ *Status = TRUE;\r
+ return ReturnValue;\r
+}\r
+\r