Added: trunk/reactos/ntoskrnl/dbgk/
Added: trunk/reactos/ntoskrnl/dbgk/dbgkutil.c
Added: trunk/reactos/ntoskrnl/dbgk/debug.c
Added: trunk/reactos/ntoskrnl/ex/dbgctrl.c
Added: trunk/reactos/ntoskrnl/include/internal/dbgk.h
Added: trunk/reactos/ntoskrnl/include/internal/kdb.h
Added: trunk/reactos/ntoskrnl/rtl/debug.c
--- trunk/reactos/ntoskrnl/dbgk/dbgkutil.c 2005-04-23 06:43:39 UTC (rev 14761)
+++ trunk/reactos/ntoskrnl/dbgk/dbgkutil.c 2005-04-23 06:45:56 UTC (rev 14762)
@@ -0,0 +1,57 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel
+ * FILE: ntoskrnl/dbgk/dbgkutil.c
+ * PURPOSE: User-Mode Debugging Support, Internal Debug Functions.
+ *
+ * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+STDCALL
+DbgkCreateThread(PVOID StartAddress)
+{
+#if 0
+ LPC_DBG_MESSAGE Message;
+ LPC_DBG_MESSAGE Reply;
+ NTSTATUS Status;
+
+ if (PsGetCurrentThread()->ThreadsProcess->DebugPort == NULL)
+ {
+ return;
+ }
+
+ Message.Header.MessageSize = sizeof(LPC_DBG_MESSAGE);
+ Message.Header.DataSize = sizeof(LPC_DBG_MESSAGE) -
+ sizeof(LPC_MESSAGE);
+ Message.Type = DBG_EVENT_CREATE_THREAD;
+ Message.Status = STATUS_SUCCESS;
+ Message.Data.CreateThread.Reserved = 0;
+ Message.Data.CreateThread.StartAddress = StartAddress;
+
+ /* FIXME: Freeze all threads in process */
+
+ /* Send the message to the process's debug port and wait for a reply */
+ Status =
+ LpcSendDebugMessagePort(PsGetCurrentThread()->ThreadsProcess->DebugPort,
+ &Message,
+ &Reply);
+ if (!NT_SUCCESS(Status))
+ {
+ return;
+ }
+
+ /* FIXME: Examine reply */
+ return;
+#endif
+}
+
+/* EOF */
--- trunk/reactos/ntoskrnl/dbgk/debug.c 2005-04-23 06:43:39 UTC (rev 14761)
+++ trunk/reactos/ntoskrnl/dbgk/debug.c 2005-04-23 06:45:56 UTC (rev 14762)
@@ -0,0 +1,164 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel
+ * FILE: ntoskrnl/dbgk/debug.c
+ * PURPOSE: User-Mode Debugging Support, Debug Object Management.
+ *
+ * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+POBJECT_TYPE DbgkDebugObjectType;
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+STDCALL
+NtCreateDebugObject(OUT PHANDLE DebugHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN KillProcessOnExit)
+{
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ PDBGK_DEBUG_OBJECT DebugObject;
+ HANDLE hDebug;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ PAGED_CODE();
+ DPRINT("NtCreateDebugObject(0x%x, 0x%x, 0x%x)\n", DebugHandle, DesiredAccess, ObjectAttributes);
+
+ /* Check Output Safety */
+ if(PreviousMode != KernelMode) {
+
+ _SEH_TRY {
+
+ ProbeForWrite(DebugHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+
+ if(!NT_SUCCESS(Status)) return Status;
+ }
+
+ /* Create the Object */
+ Status = ObCreateObject(PreviousMode,
+ DbgkDebugObjectType,
+ ObjectAttributes,
+ PreviousMode,
+ NULL,
+ sizeof(PDBGK_DEBUG_OBJECT),
+ 0,
+ 0,
+ (PVOID*)&DebugObject);
+
+ /* Check for Success */
+ if(NT_SUCCESS(Status)) {
+
+ /* Initialize the Debug Object's Fast Mutex */
+ ExInitializeFastMutex(&DebugObject->Mutex);
+
+ /* Initialize the State Event List */
+ InitializeListHead(&DebugObject->StateEventListEntry);
+
+ /* Initialize the Debug Object's Wait Event */
+ KeInitializeEvent(&DebugObject->Event, NotificationEvent, 0);
+
+ /* Set the Flags */
+ DebugObject->KillProcessOnExit = KillProcessOnExit;
+
+ /* Insert it */
+ Status = ObInsertObject((PVOID)DebugObject,
+ NULL,
+ DesiredAccess,
+ 0,
+ NULL,
+ &hDebug);
+ ObDereferenceObject(DebugObject);
+
+ /* Check for success and return handle */
+ if(NT_SUCCESS(Status)) {
+
+ _SEH_TRY {
+
+ *DebugHandle = hDebug;
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+ }
+ }
+
+ /* Return Status */
+ return Status;
+}
+
+NTSTATUS
+STDCALL
+NtWaitForDebugEvent(IN HANDLE DebugObject, // Debug object handle must grant DEBUG_OBJECT_WAIT_STATE_CHANGE access.
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Timeout OPTIONAL,
+ OUT PDBGUI_WAIT_STATE_CHANGE StateChange)
+{
+
+ UNIMPLEMENTED;
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+STDCALL
+NtDebugContinue(IN HANDLE DebugObject, // Debug object handle must grant DEBUG_OBJECT_WAIT_STATE_CHANGE access.
+ IN PCLIENT_ID AppClientId,
+ IN NTSTATUS ContinueStatus)
+{
+
+ UNIMPLEMENTED;
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+STDCALL
+NtDebugActiveProcess(IN HANDLE Process, // Process handle must grant PROCESS_SUSPEND_RESUME access.
+ IN HANDLE DebugObject) // Debug object handle must grant DEBUG_OBJECT_ADD_REMOVE_PROCESS access.
+{
+
+ UNIMPLEMENTED;
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+STDCALL
+NtRemoveProcessDebug(IN HANDLE Process, // Process handle must grant PROCESS_SUSPEND_RESUME access.
+ IN HANDLE DebugObject) // Debug object handle must grant DEBUG_OBJECT_ADD_REMOVE_PROCESS access.
+{
+
+ UNIMPLEMENTED;
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS
+STDCALL
+NtSetInformationDebugObject(IN HANDLE DebugObject, // Debug object handle need not grant any particular access right.
+ IN DEBUGOBJECTINFOCLASS DebugObjectInformationClass,
+ IN PVOID DebugInformation,
+ IN ULONG DebugInformationLength,
+ OUT PULONG ReturnLength OPTIONAL)
+{
+ UNIMPLEMENTED;
+
+ return STATUS_NOT_IMPLEMENTED;
+}
+/* EOF */
--- trunk/reactos/ntoskrnl/ex/dbgctrl.c 2005-04-23 06:43:39 UTC (rev 14761)
+++ trunk/reactos/ntoskrnl/ex/dbgctrl.c 2005-04-23 06:45:56 UTC (rev 14762)
@@ -0,0 +1,46 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/ex/dbgctrl.c
+ * PURPOSE: System debug control
+ *
+ * PROGRAMMERS: No programmer listed.
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+STDCALL
+NtSystemDebugControl(DEBUG_CONTROL_CODE ControlCode,
+ PVOID InputBuffer,
+ ULONG InputBufferLength,
+ PVOID OutputBuffer,
+ ULONG OutputBufferLength,
+ PULONG ReturnLength)
+{
+ switch (ControlCode)
+ {
+ case DebugGetTraceInformation:
+ case DebugSetInternalBreakpoint:
+ case DebugSetSpecialCall:
+ case DebugClearSpecialCalls:
+ case DebugQuerySpecialCalls:
+ case DebugDbgBreakPoint:
+ break;
+
+ case DebugDbgLoadSymbols:
+ KDB_LOADUSERMODULE_HOOK((PLDR_MODULE) InputBuffer);
+ break;
+
+ default:
+ break;
+ }
+
+ return STATUS_SUCCESS;
+}
--- trunk/reactos/ntoskrnl/include/internal/dbgk.h 2005-04-23 06:43:39 UTC (rev 14761)
+++ trunk/reactos/ntoskrnl/include/internal/dbgk.h 2005-04-23 06:45:56 UTC (rev 14762)
@@ -0,0 +1,143 @@
+/*
+ * ReactOS kernel
+ * Copyright (C) 2000 David Welch <welch@cwcom.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __NTOSKRNL_INCLUDE_INTERNAL_DBGK_H
+#define __NTOSKRNL_INCLUDE_INTERNAL_DBGK_H
+
+//
+// DebugObject access rights.
+// Note that DEBUG_OBJECT_ALL_ACCESS includes the specific rights 0x0F, but there are only two
+// debug object specific access rights that are ever checked by the kernel. This appears to be a bug.
+//
+#define DEBUG_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x0F)
+#define DEBUG_OBJECT_WAIT_STATE_CHANGE 0x0001 /* Required to call NtWaitForDebugEvent & NtContinueDebugEvent */
+#define DEBUG_OBJECT_ADD_REMOVE_PROCESS 0x0002 /* Required to call NtDebugActiveProcess & NtRemoveProcessDebug */
+
+typedef enum _DEBUGOBJECTINFOCLASS {
+ DebugObjectUnusedInformation,
+ DebugObjectKillProcessOnExitInformation
+} DEBUGOBJECTINFOCLASS, * PDEBUGOBJECTINFOCLASS;
+
+typedef struct _DEBUG_OBJECT_KILL_PROCESS_ON_EXIT_INFORMATION {
+ ULONG KillProcessOnExit; // Interpreted as a BOOLEAN, TRUE -> process is terminated on NtRemoveProcessDebug.
+} DEBUG_OBJECT_KILL_PROCESS_ON_EXIT_INFORMATION, *
+PDEBUG_OBJECT_KILL_PROCESS_ON_EXIT_INFORMATION;
+
+//
+// Debug Object
+//
+typedef struct _DBGK_DEBUG_OBJECT {
+ KEVENT Event;
+ FAST_MUTEX Mutex;
+ LIST_ENTRY StateEventListEntry;
+ union {
+ ULONG Flags;
+ struct {
+ UCHAR DebuggerInactive :1;
+ UCHAR KillProcessOnExit :1;
+ };
+ };
+} DBGK_DEBUG_OBJECT, *PDBGK_DEBUG_OBJECT;
+
+//
+// DbgUi types for LPC debug port messages (KM -> UM).
+//
+// These also apply to Nt*Debug APIs with NT 5.01, 5.02, and later.
+//
+typedef enum _DBG_STATE {
+ DbgIdle,
+ DbgReplyPending,
+ DbgCreateThreadStateChange,
+ DbgCreateProcessStateChange,
+ DbgExitThreadStateChange,
+ DbgExitProcessStateChange,
+ DbgExceptionStateChange,
+ DbgBreakpointStateChange,
+ DbgSingleStepStateChange,
+ DbgLoadDllStateChange,
+ DbgUnloadDllStateChange
+} DBG_STATE, *PDBG_STATE;
+
+typedef struct _DBGKM_EXCEPTION {
+ EXCEPTION_RECORD ExceptionRecord;
+ ULONG FirstChance;
+} DBGKM_EXCEPTION, *PDBGKM_EXCEPTION;
+
+typedef struct _DBGKM_CREATE_THREAD {
+ ULONG SubSystemKey;
+ PVOID StartAddress;
+} DBGKM_CREATE_THREAD, *PDBGKM_CREATE_THREAD;
+
+typedef struct _DBGKM_CREATE_PROCESS {
+ ULONG SubSystemKey;
+ HANDLE FileHandle;
+ PVOID BaseOfImage;
+ ULONG DebugInfoFileOffset;
+ ULONG DebugInfoSize;
+ DBGKM_CREATE_THREAD InitialThread;
+} DBGKM_CREATE_PROCESS, *PDBGKM_CREATE_PROCESS;
+
+typedef struct _DBGKM_EXIT_THREAD {
+ NTSTATUS ExitStatus;
+} DBGKM_EXIT_THREAD, *PDBGKM_EXIT_THREAD;
+
+typedef struct _DBGKM_EXIT_PROCESS {
+ NTSTATUS ExitStatus;
+} DBGKM_EXIT_PROCESS, *PDBGKM_EXIT_PROCESS;
+
+typedef struct _DBGKM_LOAD_DLL {
+ HANDLE FileHandle;
+ PVOID BaseOfDll;
+ ULONG DebugInfoFileOffset;
+ ULONG DebugInfoSize;
+} DBGKM_LOAD_DLL, *PDBGKM_LOAD_DLL;
+
+typedef struct _DBGKM_UNLOAD_DLL {
+ PVOID BaseAddress;
+} DBGKM_UNLOAD_DLL, *PDBGKM_UNLOAD_DLL;
+
+typedef struct _DBGUI_WAIT_STATE_CHANGE {
+ DBG_STATE NewState;
+ CLIENT_ID AppClientId;
+ union {
+ struct {
+ HANDLE HandleToThread;
+ DBGKM_CREATE_THREAD NewThread;
+ } CreateThread;
+ struct {
+ HANDLE HandleToProcess;
+ HANDLE HandleToThread;
+ DBGKM_CREATE_PROCESS NewProcess;
+ } CreateProcessInfo;
+ DBGKM_EXIT_THREAD ExitThread;
+ DBGKM_EXIT_PROCESS ExitProcess;
+ DBGKM_EXCEPTION Exception;
+ DBGKM_LOAD_DLL LoadDll;
+ DBGKM_UNLOAD_DLL UnloadDll;
+ } StateInfo;
+} DBGUI_WAIT_STATE_CHANGE, * PDBGUI_WAIT_STATE_CHANGE;
+
+
+VOID
+STDCALL
+DbgkCreateThread(PVOID StartAddress);
+
+#endif
+
+/* EOF */
--- trunk/reactos/ntoskrnl/include/internal/kdb.h 2005-04-23 06:43:39 UTC (rev 14761)
+++ trunk/reactos/ntoskrnl/include/internal/kdb.h 2005-04-23 06:45:56 UTC (rev 14762)
@@ -0,0 +1,284 @@
+#ifndef NTOSKRNL_KDB_H
+#define NTOSKRNL_KDB_H
+
+/* INCLUDES ******************************************************************/
+
+#define NTOS_MODE_KERNEL
+#include <ntos.h>
+
+#include <internal/ke.h>
+
+/* DEFINES *******************************************************************/
+
+#define TAG_KDBG (('K' << 24) | ('D' << 16) | ('B' << 8) | 'G')
+
+#ifndef RTL_NUMBER_OF
+# define RTL_NUMBER_OF(x) (sizeof(x) / sizeof((x)[0]))
+#endif
+
+
+/* TYPES *********************************************************************/
+
+/* from kdb.c */
+typedef struct _KDB_KTRAP_FRAME
+{
+ KTRAP_FRAME Tf;
+ ULONG Cr0;
+ ULONG Cr1; /* reserved/unused */
+ ULONG Cr2;
+ ULONG Cr3;
+ ULONG Cr4;
+} KDB_KTRAP_FRAME, *PKDB_KTRAP_FRAME;
+
+typedef enum _KDB_BREAKPOINT_TYPE
+{
+ KdbBreakPointNone = 0,
+ KdbBreakPointSoftware,
+ KdbBreakPointHardware,
+ KdbBreakPointTemporary
+} KDB_BREAKPOINT_TYPE;
+
+typedef enum _KDB_ACCESS_TYPE
+{
+ KdbAccessRead,
+ KdbAccessWrite,
+ KdbAccessReadWrite,
+ KdbAccessExec
+} KDB_ACCESS_TYPE;
+
+typedef struct _KDB_BREAKPOINT
+{
+ KDB_BREAKPOINT_TYPE Type; /* Type of breakpoint */
+ BOOLEAN Enabled; /* Whether the bp is enabled */
+ ULONG_PTR Address; /* Address of the breakpoint */
+ BOOLEAN Global; /* Whether the breakpoint is global or local to a process */
+ PEPROCESS Process; /* Owning process */
+ PCHAR ConditionExpression;
+ PVOID Condition;
+ union {
+ /* KdbBreakPointSoftware */
+ UCHAR SavedInstruction;
+ /* KdbBreakPointHardware */
+ struct {
+ UCHAR DebugReg : 2;
+ UCHAR Size : 3;
+ KDB_ACCESS_TYPE AccessType;
+ } Hw;
+ } Data;
+} KDB_BREAKPOINT, *PKDB_BREAKPOINT;
+
+typedef enum _KDB_ENTER_CONDITION
+{
+ KdbDoNotEnter,
+ KdbEnterAlways,
+ KdbEnterFromKmode,
+ KdbEnterFromUmode
+} KDB_ENTER_CONDITION;
+
+
+/* from kdb_symbols.c */
+typedef struct _KDB_MODULE_INFO
+{
+ WCHAR Name[256];
+ ULONG_PTR Base;
+ ULONG Size;
+ PROSSYM_INFO RosSymInfo;
+} KDB_MODULE_INFO, *PKDB_MODULE_INFO;
+
+
+/* FUNCTIONS *****************************************************************/
+
+/* from i386/i386-dis.c */
+
+LONG
+KdbpDisassemble(
+ IN ULONG Address,
+ IN ULONG IntelSyntax);
+
+LONG
+KdbpGetInstLength(
+ IN ULONG Address);
+
+/* from i386/kdb_help.S */
+
+STDCALL VOID
+KdbpStackSwitchAndCall(
+ IN PVOID NewStack,
+ IN VOID (*Function)(VOID));
+
+/* from kdb_cli.c */
+
+extern PCHAR KdbInitFileBuffer;
+
+VOID
+KdbpCliInit();
+
+VOID
+KdbpCliMainLoop(
+ IN BOOLEAN EnteredOnSingleStep);
+
+VOID
+KdbpCliModuleLoaded(
+ IN PUNICODE_STRING Name);
+
+VOID
+KdbpCliInterpretInitFile();
+
+VOID
+KdbpPrint(
+ IN PCHAR Format,
+ IN ... OPTIONAL);
+
+/* from kdb_expr.c */
+
+BOOLEAN
+KdbpRpnEvaluateExpression(
+ IN PCHAR Expression,
+ IN PKDB_KTRAP_FRAME TrapFrame,
+ OUT PULONGLONG Result,
+ OUT PLONG ErrOffset OPTIONAL,
+ OUT PCHAR ErrMsg OPTIONAL);
+
+PVOID
+KdbpRpnParseExpression(
+ IN PCHAR Expression,
+ OUT PLONG ErrOffset OPTIONAL,
+ OUT PCHAR ErrMsg OPTIONAL);
+
+BOOLEAN
+KdbpRpnEvaluateParsedExpression(
+ IN PVOID Expression,
+ IN PKDB_KTRAP_FRAME TrapFrame,
+ OUT PULONGLONG Result,
+ OUT PLONG ErrOffset OPTIONAL,
+ OUT PCHAR ErrMsg OPTIONAL);
+
+/* from kdb_symbols.c */
+
+BOOLEAN
+KdbpSymFindModuleByAddress(IN PVOID Address,
+ OUT PKDB_MODULE_INFO pInfo);
+
+BOOLEAN
+KdbpSymFindModuleByName(IN LPCWSTR Name,
+ OUT PKDB_MODULE_INFO pInfo);
+
+BOOLEAN
+KdbpSymFindModuleByIndex(IN INT Index,
+ OUT PKDB_MODULE_INFO pInfo);
+
+BOOLEAN
+KdbSymPrintAddress(IN PVOID Address);
+
+NTSTATUS
+KdbSymGetAddressInformation(IN PROSSYM_INFO RosSymInfo,
+ IN ULONG_PTR RelativeAddress,
+ OUT PULONG LineNumber OPTIONAL,
+ OUT PCH FileName OPTIONAL,
+ OUT PCH FunctionName OPTIONAL);
+
+/* from kdb.c */
+
+extern PEPROCESS KdbCurrentProcess;
+extern PETHREAD KdbCurrentThread;
+extern LONG KdbLastBreakPointNr;
+extern ULONG KdbNumSingleSteps;
+extern BOOLEAN KdbSingleStepOver;
+extern PKDB_KTRAP_FRAME KdbCurrentTrapFrame;
+
+VOID
+KdbInit();
+
+VOID
+KdbModuleLoaded(
+ IN PUNICODE_STRING Name);
+
+LONG
+KdbpGetNextBreakPointNr(
+ IN ULONG Start OPTIONAL);
+
+BOOLEAN
+KdbpGetBreakPointInfo(
+ IN ULONG BreakPointNr,
+ OUT ULONG_PTR *Address OPTIONAL,
+ OUT KDB_BREAKPOINT_TYPE *Type OPTIONAL,
+ OUT UCHAR *Size OPTIONAL,
+ OUT KDB_ACCESS_TYPE *AccessType OPTIONAL,
+ OUT UCHAR *DebugReg OPTIONAL,
+ OUT BOOLEAN *Enabled OPTIONAL,
+ OUT BOOLEAN *Global OPTIONAL,
+ OUT PEPROCESS *Process OPTIONAL,
+ OUT PCHAR *ConditionExpression OPTIONAL);
+
+NTSTATUS
+KdbpInsertBreakPoint(
+ IN ULONG_PTR Address,
+ IN KDB_BREAKPOINT_TYPE Type,
+ IN UCHAR Size OPTIONAL,
+ IN KDB_ACCESS_TYPE AccessType OPTIONAL,
+ IN PCHAR ConditionExpression OPTIONAL,
+ IN BOOLEAN Global,
+ OUT PULONG BreakPointNumber OPTIONAL);
+
+BOOLEAN
+KdbpDeleteBreakPoint(
+ IN LONG BreakPointNr OPTIONAL,
+ IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL);
+
+BOOLEAN
+KdbpEnableBreakPoint(
+ IN LONG BreakPointNr OPTIONAL,
+ IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL);
+
+BOOLEAN
+KdbpDisableBreakPoint(
+ IN LONG BreakPointNr OPTIONAL,
+ IN OUT PKDB_BREAKPOINT BreakPoint OPTIONAL);
+
+BOOLEAN
+KdbpGetEnterCondition(
+ IN LONG ExceptionNr,
+ IN BOOLEAN FirstChance,
+ OUT KDB_ENTER_CONDITION *Condition);
+
+BOOLEAN
+KdbpSetEnterCondition(
+ IN LONG ExceptionNr,
+ IN BOOLEAN FirstChance,
+ IN KDB_ENTER_CONDITION Condition);
+
+BOOLEAN
+KdbpAttachToThread(
+ PVOID ThreadId);
+
+BOOLEAN
+KdbpAttachToProcess(
+ PVOID ProcessId);
+
+/* other functions */
+
+#define KdbpSafeReadMemory(dst, src, size) MmSafeCopyFromUser(dst, src, size)
+#define KdbpSafeWriteMemory(dst, src, size) MmSafeCopyToUser(dst, src, size)
+
+#define KdbpGetCharKeyboard(ScanCode) KdbpTryGetCharKeyboard(ScanCode, 0)
+CHAR
+KdbpTryGetCharKeyboard(PULONG ScanCode, UINT Retry);
+
+#define KdbpGetCharSerial() KdbpTryGetCharSerial(0)
+CHAR
+KdbpTryGetCharSerial(UINT Retry);
+
+VOID
+KdbEnter(VOID);
+VOID
+DbgRDebugInit(VOID);
+VOID
+DbgShowFiles(VOID);
+VOID
+DbgEnableFile(PCH Filename);
+VOID
+DbgDisableFile(PCH Filename);
+
+
+#endif /* NTOSKRNL_KDB_H */
+
--- trunk/reactos/ntoskrnl/rtl/debug.c 2005-04-23 06:43:39 UTC (rev 14761)
+++ trunk/reactos/ntoskrnl/rtl/debug.c 2005-04-23 06:45:56 UTC (rev 14762)
@@ -0,0 +1,190 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/rtl/dbgprint.c
+ * PURPOSE: Debug output
+ *
+ * PROGRAMMERS: Eric Kohl (ekohl@abo.rhein-zeitung.de)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#include <internal/debug.h>
+
+/* FUNCTIONS ****************************************************************/
+
+/*
+ * Note: DON'T CHANGE THIS FUNCTION!!!
+ * DON'T CALL HalDisplayString OR SOMETING ELSE!!!
+ * You'll only break the serial/bochs debugging feature!!!
+ */
+
+/*
+ * @implemented
+ */
+ULONG
+DbgPrint(PCH Format, ...)
+{
+ ANSI_STRING DebugString;
+ CHAR Buffer[1024];
+ va_list ap;
+#ifdef SERIALIZE_DBGPRINT
+# define MESSAGETABLE_SIZE 16
+ LONG MyTableIndex;
+ static LONG Lock = 0;
+ static LONG TableWriteIndex = 0, TableReadIndex = 0;
+ static CHAR MessageTable[MESSAGETABLE_SIZE][sizeof(Buffer)] = { { '\0' } };
+#endif /* SERIALIZE_DBGPRINT */
+
+ /* init ansi string */
+ DebugString.Buffer = Buffer;
+ DebugString.MaximumLength = sizeof(Buffer);
+
+ va_start (ap, Format);
+ DebugString.Length = _vsnprintf (Buffer, sizeof( Buffer ), Format, ap);
+ va_end (ap);
+
+#ifdef SERIALIZE_DBGPRINT
+ /* check if we are already running */
+ if (InterlockedCompareExchange(&Lock, 1, 0) == 1)
+ {
+ MyTableIndex = InterlockedIncrement(&TableWriteIndex) - 1;
+ InterlockedCompareExchange(&TableWriteIndex, 0, MESSAGETABLE_SIZE);
+ MyTableIndex %= MESSAGETABLE_SIZE;
+
+ if (MessageTable[MyTableIndex][0] != '\0') /* table is full */
+ {
+ DebugString.Buffer = "CRITICAL ERROR: DbgPrint Table is FULL!";
+ DebugString.Length = 39;
+ KdpPrintString(&DebugString);
+ for (;;);
+ }
+ else
+ {
+ /*DebugString.Buffer = "ÁÁÁ";
+ DebugString.Length = 3;
+ KdpPrintString(&DebugString);*/
+ memcpy(MessageTable[MyTableIndex], DebugString.Buffer, DebugString.Length);
+ MessageTable[MyTableIndex][DebugString.Length] = '\0';
+ }
+ }
+ else
+ {
+#endif /* SERIALIZE_DBGPRINT */
+ KdpPrintString (&DebugString);
+#ifdef SERIALIZE_DBGPRINT
+ MyTableIndex = TableReadIndex;
+ while (MessageTable[MyTableIndex][0] != '\0')
+ {
+ /*DebugString.Buffer = "$$$";
+ DebugString.Length = 3;
+ KdpPrintString(&DebugString);*/
+
+ DebugString.Buffer = MessageTable[MyTableIndex];
+ DebugString.Length = strlen(DebugString.Buffer);
+ DebugString.MaximumLength = DebugString.Length + 1;
+
+ KdpPrintString(&DebugString);
+ MessageTable[MyTableIndex][0] = '\0';
+
+ MyTableIndex = InterlockedIncrement(&TableReadIndex);
+ InterlockedCompareExchange(&TableReadIndex, 0, MESSAGETABLE_SIZE);
+ MyTableIndex %= MESSAGETABLE_SIZE;
+ }
+ InterlockedDecrement(&Lock);
+ }
+# undef MESSAGETABLE_SIZE
+#endif /* SERIALIZE_DBGPRINT */
+
+ return (ULONG)DebugString.Length;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+__cdecl
+DbgPrintEx(IN ULONG ComponentId,
+ IN ULONG Level,
+ IN PCH Format,
+ ...)
+{
+ UNIMPLEMENTED;
+ return 0;
+}
+
+/*
+ * @unimplemented
+ */
+ULONG
+__cdecl
+DbgPrintReturnControlC(PCH Format,
+ ...)
+{
+ UNIMPLEMENTED;
+ return 0;
+}
+
+/*
+ * @unimplemented
+ */
+VOID
+STDCALL
+DbgPrompt(PCH OutputString,
+ PCH InputString,
+ USHORT InputSize)
+{
+ ANSI_STRING Output;
+ ANSI_STRING Input;
+
+ Input.Length = 0;
+ Input.MaximumLength = InputSize;
+ Input.Buffer = InputString;
+
+ Output.Length = strlen (OutputString);
+ Output.MaximumLength = Output.Length + 1;
+ Output.Buffer = OutputString;
+
+ /* FIXME: Not implemented yet!
+ KdpPromptString (&Output, &Input); */
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+STDCALL
+DbgQueryDebugFilterState(IN ULONG ComponentId,
+ IN ULONG Level)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+STDCALL
+DbgSetDebugFilterState(IN ULONG ComponentId,
+ IN ULONG Level,
+ IN BOOLEAN State)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+/*
+ * @unimplemented
+ */
+NTSTATUS
+STDCALL
+DbgLoadImageSymbols(IN PUNICODE_STRING Name,
+ IN ULONG Base,
+ IN ULONG Unknown3)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+/* EOF */