|
|
//++
//
// Copyright (c) 1990 Microsoft Corporation
//
// Module Name:
//
// debug3.c
//
// Abstract:
//
// This module implements architecture specific functions to support debugging NT.
//
// Author:
//
// Steven R. Wood (stevewo) 3-Aug-1989
//
// Environment:
//
// Any mode.
//
// Revision History:
//
//--
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "ntrtlp.h"
//
// Prototype for local procedure
//
NTSTATUS DebugService( ULONG ServiceClass, PVOID Arg1, PVOID Arg2, PVOID Arg3, PVOID Arg4 );
NTSTATUS DebugService( ULONG ServiceClass, PVOID Arg1, PVOID Arg2, PVOID Arg3, PVOID Arg4 )
//++
//
// Routine Description:
//
// Allocate an ExceptionRecord, fill in data to allow exception
// dispatch code to do the right thing with the service, and
// call RtlRaiseException (NOT ExRaiseException!!!).
//
// Arguments:
// ServiceClass - which call is to be performed
// Arg1 - generic first argument
// Arg2 - generic second argument
// Arg3 - generic third argument
// Arg4 - generic fourth argument
//
// Returns:
// Whatever the exception returns in eax
//
//--
{ NTSTATUS RetValue;
#if defined(BUILD_WOW6432)
extern NTSTATUS NtWow64DebuggerCall(ULONG, PVOID, PVOID, PVOID, PVOID); RetValue = NtWow64DebuggerCall(ServiceClass, Arg1, Arg2, Arg3, Arg4);
#else
_asm { push edi push ebx mov eax, ServiceClass mov ecx, Arg1 mov edx, Arg2 mov ebx, Arg3 mov edi, Arg4
int 2dh ; Raise exception int 3 ; DO NOT REMOVE (See KiDebugService)
pop ebx pop edi mov RetValue, eax
}
#endif
return RetValue; }
VOID DebugService2( PVOID Arg1, PVOID Arg2, ULONG ServiceClass )
//++
//
// Routine Description:
//
// Generic exception dispatcher for the debugger
//
// Arguments:
// Arg1 - generic first argument
// Arg2 - generic second argument
// ServiceClass - which call is to be performed
//
// Returns:
// Whatever the exception returns in eax
//
//--
{ #if defined(BUILD_WOW6432)
extern NTSTATUS NtWow64DebuggerCall(ULONG, PVOID, PVOID, PVOID, PVOID); NtWow64DebuggerCall(ServiceClass, Arg1, Arg2, 0, 0);
#else
_asm { //push edi
//push ebx
mov eax, ServiceClass mov ecx, Arg1 mov edx, Arg2 //mov ebx, Arg3
//mov edi, Arg4
int 2dh ; Raise exception int 3 ; DO NOT REMOVE (See KiDebugService)
//pop ebx
//pop edi
}
#endif
return; }
// DebugPrint must appear after DebugSerive. Moved
// it down below DebugService, so BBT would have a label after DebugService.
// A label after the above _asm is necessary so BBT can treat DebugService
// as "KnownDataRange". Otherwise, the two 'int' instructions could get broken up
// by BBT's optimizer.
//
NTSTATUS DebugPrint( IN PSTRING Output, IN ULONG ComponentId, IN ULONG Level ) { return DebugService(BREAKPOINT_PRINT, Output->Buffer, (PVOID)Output->Length, (PVOID)ComponentId, (PVOID)Level); }
ULONG DebugPrompt( IN PSTRING Output, IN PSTRING Input ) { return DebugService(BREAKPOINT_PROMPT, Output->Buffer, (PVOID)Output->Length, Input->Buffer, (PVOID)Input->MaximumLength); }
|