mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 01:24:38 +00:00
Forgot to svn add these two files.
svn path=/trunk/; revision=18079
This commit is contained in:
parent
c15e04cf7a
commit
a62966103d
2 changed files with 466 additions and 0 deletions
138
reactos/lib/ntdll/dbg/dbgui.c
Normal file
138
reactos/lib/ntdll/dbg/dbgui.c
Normal file
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
* FILE: lib/ntdll/dbg/dbgui.c
|
||||
* PURPOSE: User-Mode DbgUI Support
|
||||
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
|
||||
*/
|
||||
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <ntdll.h>
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DebugService(IN ULONG Service,
|
||||
IN PVOID Buffer,
|
||||
IN ULONG Length,
|
||||
IN PVOID Argument1,
|
||||
IN PVOID Argument2);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DebugPrint(IN PANSI_STRING DebugString,
|
||||
IN ULONG ComponentId,
|
||||
IN ULONG Level)
|
||||
{
|
||||
/* Call the INT2D Service */
|
||||
return DebugService(BREAKPOINT_PRINT,
|
||||
DebugString->Buffer,
|
||||
DebugString->Length,
|
||||
UlongToPtr(ComponentId),
|
||||
UlongToPtr(Level));
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
DbgUiConnectToDbg(VOID)
|
||||
{
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
|
||||
/* Don't connect twice */
|
||||
if (NtCurrentTeb()->DbgSsReserved[0]) return STATUS_SUCCESS;
|
||||
|
||||
/* Setup the Attributes */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
|
||||
/* Create the object */
|
||||
return ZwCreateDebugObject(&NtCurrentTeb()->DbgSsReserved[0],
|
||||
DEBUG_OBJECT_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
DbgUiContinue(PCLIENT_ID ClientId,
|
||||
ULONG ContinueStatus)
|
||||
{
|
||||
/* Tell the kernel object to continue */
|
||||
return ZwDebugContinue(NtCurrentTeb()->DbgSsReserved[0],
|
||||
ClientId,
|
||||
ContinueStatus);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DbgUiWaitStateChange(PDBGUI_WAIT_STATE_CHANGE DbgUiWaitStateCange,
|
||||
PLARGE_INTEGER TimeOut)
|
||||
{
|
||||
/* Tell the kernel to wait */
|
||||
return NtWaitForDebugEvent(NtCurrentTeb()->DbgSsReserved[0],
|
||||
TRUE,
|
||||
TimeOut,
|
||||
DbgUiWaitStateCange);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
VOID
|
||||
STDCALL
|
||||
DbgUiRemoteBreakin(VOID)
|
||||
{
|
||||
/* Make sure a debugger is enabled; if so, breakpoint */
|
||||
if (NtCurrentPeb()->BeingDebugged) DbgBreakPoint();
|
||||
|
||||
/* Exit the thread */
|
||||
RtlExitUserThread(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
DbgUiIssueRemoteBreakin(HANDLE Process)
|
||||
{
|
||||
HANDLE hThread;
|
||||
CLIENT_ID ClientId;
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Create the thread that will do the breakin */
|
||||
Status = RtlCreateUserThread(Process,
|
||||
NULL,
|
||||
FALSE,
|
||||
0,
|
||||
0,
|
||||
PAGE_SIZE,
|
||||
(PVOID)DbgUiRemoteBreakin,
|
||||
NULL,
|
||||
&hThread,
|
||||
&ClientId);
|
||||
|
||||
/* Close the handle on success */
|
||||
if(NT_SUCCESS(Status)) NtClose(hThread);
|
||||
|
||||
/* Return status */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
328
reactos/lib/rtl/debug.c
Normal file
328
reactos/lib/rtl/debug.c
Normal file
|
@ -0,0 +1,328 @@
|
|||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS Run-Time Library
|
||||
* FILE: ntoskrnl/rtl/dbgprint.c
|
||||
* PURPOSE: Debug Print and Prompt routines
|
||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
||||
* Royce Mitchel III
|
||||
*/
|
||||
|
||||
/* INCLUDES *****************************************************************/
|
||||
|
||||
#include <rtl.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/* PRIVATE FUNCTIONS ********************************************************/
|
||||
|
||||
#if 0
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DebugPrint(IN PANSI_STRING DebugString,
|
||||
IN ULONG ComponentId,
|
||||
IN ULONG Level)
|
||||
{
|
||||
/* Call the INT2D Service */
|
||||
return DebugService(BREAKPOINT_PRINT,
|
||||
DebugString->Buffer,
|
||||
DebugString->Length,
|
||||
UlongToPtr(ComponentId),
|
||||
UlongToPtr(Level));
|
||||
}
|
||||
#else
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DebugPrint(IN PANSI_STRING DebugString,
|
||||
IN ULONG ComponentId,
|
||||
IN ULONG Level);
|
||||
#endif
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
DebugPrompt(IN PANSI_STRING Output,
|
||||
IN PANSI_STRING Input)
|
||||
{
|
||||
/* Call the INT2D Service */
|
||||
return DebugService(BREAKPOINT_PROMPT,
|
||||
Output->Buffer,
|
||||
Output->Length,
|
||||
Input->Buffer,
|
||||
UlongToPtr(Input->MaximumLength));
|
||||
}
|
||||
|
||||
/* FUNCTIONS ****************************************************************/
|
||||
|
||||
ULONG
|
||||
NTAPI
|
||||
vDbgPrintExWithPrefixInternal(IN LPCSTR Prefix,
|
||||
IN ULONG ComponentId,
|
||||
IN ULONG Level,
|
||||
IN LPCSTR Format,
|
||||
IN va_list ap,
|
||||
IN BOOLEAN HandleBreakpoint)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
ANSI_STRING DebugString;
|
||||
CHAR Buffer[512];
|
||||
PCHAR pBuffer = Buffer;
|
||||
ULONG pBufferSize = sizeof(Buffer);
|
||||
ULONG Length;
|
||||
EXCEPTION_RECORD ExceptionRecord;
|
||||
|
||||
/* Check if we should print it or not */
|
||||
if (ComponentId != -1 && !NtQueryDebugFilterState(ComponentId, Level))
|
||||
{
|
||||
/* This message is masked */
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* For user mode, don't recursively DbgPrint */
|
||||
if (RtlpSetInDbgPrint(TRUE)) return STATUS_SUCCESS;
|
||||
|
||||
/* Initialize the length to 8 */
|
||||
DebugString.Length = 0;
|
||||
|
||||
/* Handle the prefix */
|
||||
if (Prefix && *Prefix)
|
||||
{
|
||||
/* Get the length */
|
||||
DebugString.Length = strlen(Prefix);
|
||||
|
||||
/* Normalize it */
|
||||
if(DebugString.Length > sizeof(Buffer))
|
||||
{
|
||||
DebugString.Length = sizeof(Buffer);
|
||||
}
|
||||
|
||||
/* Copy it */
|
||||
strncpy(Buffer, Prefix, DebugString.Length);
|
||||
|
||||
/* Set the pointer and update the size */
|
||||
pBuffer = &Buffer[DebugString.Length];
|
||||
pBufferSize -= DebugString.Length;
|
||||
}
|
||||
|
||||
/* Setup the ANSI String */
|
||||
DebugString.Buffer = Buffer;
|
||||
DebugString.MaximumLength = sizeof(Buffer);
|
||||
Length = _vsnprintf(pBuffer, pBufferSize, Format, ap);
|
||||
|
||||
/* Check if we went past the buffer */
|
||||
if (Length == -1)
|
||||
{
|
||||
/* Terminate it if we went over-board */
|
||||
Buffer[sizeof(Buffer) - 1] = '\n';
|
||||
|
||||
/* Put maximum */
|
||||
Length = sizeof(Buffer);
|
||||
}
|
||||
|
||||
/* Update length */
|
||||
DebugString.Length += Length;
|
||||
|
||||
/* First, let the debugger know as well */
|
||||
if (RtlpCheckForActiveDebugger(FALSE))
|
||||
{
|
||||
/* Fill out an exception record */
|
||||
ExceptionRecord.ExceptionCode = DBG_PRINTEXCEPTION_C;
|
||||
ExceptionRecord.ExceptionRecord = NULL;
|
||||
ExceptionRecord.NumberParameters = 2;
|
||||
ExceptionRecord.ExceptionFlags = 0;
|
||||
ExceptionRecord.ExceptionInformation[0] = DebugString.Length + 1;
|
||||
ExceptionRecord.ExceptionInformation[1] = (ULONG_PTR)DebugString.Buffer;
|
||||
|
||||
/* Raise the exception */
|
||||
RtlRaiseException(&ExceptionRecord);
|
||||
|
||||
/* This code only runs in user-mode, so setting the flag is safe */
|
||||
NtCurrentTeb()->InDbgPrint = FALSE;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* Call the Debug Print routine */
|
||||
Status = DebugPrint(&DebugString, ComponentId, Level);
|
||||
|
||||
/* Check if this was with Control-C */
|
||||
if (HandleBreakpoint)
|
||||
{
|
||||
/* Check if we got a breakpoint */
|
||||
if (Status == STATUS_BREAKPOINT)
|
||||
{
|
||||
/* Breakpoint */
|
||||
DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/* In user-mode, remove the InDbgPrint Flag */
|
||||
RtlpSetInDbgPrint(FALSE);
|
||||
|
||||
/* Return */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
NTAPI
|
||||
vDbgPrintExWithPrefix(IN LPCSTR Prefix,
|
||||
IN ULONG ComponentId,
|
||||
IN ULONG Level,
|
||||
IN LPCSTR Format,
|
||||
IN va_list ap)
|
||||
{
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
return vDbgPrintExWithPrefixInternal(Prefix,
|
||||
ComponentId,
|
||||
Level,
|
||||
Format,
|
||||
ap,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
NTAPI
|
||||
vDbgPrintEx(IN ULONG ComponentId,
|
||||
IN ULONG Level,
|
||||
IN LPCSTR Format,
|
||||
IN va_list ap)
|
||||
{
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
return vDbgPrintExWithPrefixInternal(NULL,
|
||||
ComponentId,
|
||||
Level,
|
||||
Format,
|
||||
ap,
|
||||
TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
__cdecl
|
||||
DbgPrint(PCH Format,
|
||||
...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
va_start(ap, Format);
|
||||
return vDbgPrintExWithPrefixInternal(NULL,
|
||||
-1,
|
||||
DPFLTR_ERROR_LEVEL,
|
||||
Format,
|
||||
ap,
|
||||
TRUE);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
__cdecl
|
||||
DbgPrintEx(IN ULONG ComponentId,
|
||||
IN ULONG Level,
|
||||
IN PCH Format,
|
||||
...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
va_start(ap, Format);
|
||||
return vDbgPrintExWithPrefixInternal(NULL,
|
||||
ComponentId,
|
||||
Level,
|
||||
Format,
|
||||
ap,
|
||||
TRUE);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
__cdecl
|
||||
DbgPrintReturnControlC(PCH Format,
|
||||
...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
/* Call the internal routine that also handles ControlC */
|
||||
return vDbgPrintExWithPrefixInternal(NULL,
|
||||
-1,
|
||||
DPFLTR_ERROR_LEVEL,
|
||||
Format,
|
||||
ap,
|
||||
FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
ULONG
|
||||
STDCALL
|
||||
DbgPrompt(PCH OutputString,
|
||||
PCH InputString,
|
||||
USHORT InputSize)
|
||||
{
|
||||
ANSI_STRING Output;
|
||||
ANSI_STRING Input;
|
||||
|
||||
/* Setup the input string */
|
||||
Input.MaximumLength = InputSize;
|
||||
Input.Buffer = InputString;
|
||||
|
||||
/* Setup the output string */
|
||||
Output.Length = strlen (OutputString);
|
||||
Output.Buffer = OutputString;
|
||||
|
||||
/* Call the system service */
|
||||
return DebugPrompt(&Output, &Input);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN
|
||||
STDCALL
|
||||
DbgQueryDebugFilterState(IN ULONG ComponentId,
|
||||
IN ULONG Level)
|
||||
{
|
||||
/* Call the Nt routine */
|
||||
return NtQueryDebugFilterState(ComponentId, Level);
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
DbgSetDebugFilterState(IN ULONG ComponentId,
|
||||
IN ULONG Level,
|
||||
IN BOOLEAN State)
|
||||
{
|
||||
/* Call the Nt routine */
|
||||
return NtSetDebugFilterState(ComponentId, Level, State);
|
||||
}
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS
|
||||
STDCALL
|
||||
DbgLoadImageSymbols(IN PUNICODE_STRING Name,
|
||||
IN ULONG Base,
|
||||
IN ULONG Unknown3)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
/* EOF */
|
Loading…
Reference in a new issue