252 lines
5.9 KiB
NASM
252 lines
5.9 KiB
NASM
title "Debug Support Functions"
|
|
;++
|
|
;
|
|
; Copyright (c) 2000 Microsoft Corporation
|
|
;
|
|
; Module Name:
|
|
;
|
|
; debugstb.asm
|
|
;
|
|
; Abstract:
|
|
;
|
|
; This module implements functions to support debugging NT.
|
|
;
|
|
; Author:
|
|
;
|
|
; David N. Cutler (davec) 26-Jun-2000
|
|
;
|
|
; Environment:
|
|
;
|
|
; Any mode.
|
|
;
|
|
;--
|
|
|
|
include ksamd64.inc
|
|
|
|
subttl "Break Point"
|
|
;++
|
|
;
|
|
; VOID
|
|
; DbgBreakPoint (
|
|
; VOID
|
|
; )
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function executes a breakpoint instruction. Useful for entering
|
|
; the debugger under program control. This breakpoint will always go to
|
|
; the kernel debugger if one is installed, otherwise it will go to the
|
|
; debug subsystem.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY DbgBreakPoint, _TEXT$00
|
|
|
|
int 3 ; break into debugger
|
|
ret ; return
|
|
|
|
LEAF_END DbgBreakPoint, _TEXT$00
|
|
|
|
subttl "User Break Point"
|
|
;++
|
|
;
|
|
; VOID
|
|
; DbgUserBreakPoint()
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function executes a breakpoint instruction. Useful for entering
|
|
; the debug subsystem under program control. The kernel debugger will
|
|
; ignore this breakpoint since it will not find the instruction address
|
|
; its breakpoint table.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; None.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY DbgUserBreakPoint, _TEXT$00
|
|
|
|
int 3 ; break into debugger
|
|
ret ; return
|
|
|
|
LEAF_END DbgUserBreakPoint, _TEXT$00
|
|
|
|
subttl "Break Point With Status"
|
|
;++
|
|
;
|
|
; VOID
|
|
; DbgBreakPointWithStatus(
|
|
; IN ULONG Status
|
|
; )
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function executes a breakpoint instruction. Useful for entering
|
|
; the debugger under program control. This breakpoint will always go to
|
|
; the kernel debugger if one is installed, otherwise it will go to the
|
|
; debug subsystem. This function is identical to DbgBreakPoint, except
|
|
; that it takes an argument which the debugger can see.
|
|
;
|
|
; Note: The debugger checks the address of the breakpoint instruction
|
|
; against the address RtlpBreakWithStatusInstruction. If it matches,
|
|
; we have a breakpoint with status. A breakpoint is normally issued
|
|
; with the break_debug_stop macro which generates two instructions.
|
|
; We can't use the macro here because of the "label on the breakpoint"
|
|
; requirement.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; Status (ecx) - Supplies the break point status code.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
altentry RtlpBreakWithStatusInstruction
|
|
|
|
LEAF_ENTRY DbgBreakPointWithStatus, _TEXT$00
|
|
|
|
ALTERNATE_ENTRY RtlpBreakWithStatusInstruction
|
|
|
|
int 3 ; break into debugger
|
|
ret ; return
|
|
|
|
LEAF_END DbgBreakPointWithStatus, _TEXT$00
|
|
|
|
subttl "Debug Print"
|
|
;++
|
|
;
|
|
; NTSTATUS
|
|
; DebugPrint(
|
|
; IN PSTRING Output,
|
|
; IN ULONG ComponentId,
|
|
; IN ULONG Level
|
|
; )
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function executes a debug print breakpoint.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; Output (rcx) - Supplies a pointer to the output string descriptor.
|
|
;
|
|
; ComponentId (edx) - Supplies the Id of the calling component.
|
|
;
|
|
; Level (r8d) - Supplies the output importance level.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; STATUS_SUCCESS is returned if the debug print was completed successfully.
|
|
;
|
|
; STATUS_BREAKPOINT is returned if user typed a Control-C during print.
|
|
;
|
|
; STATUS_DEVICE_NOT_CONNECTED is returned if kernel debugger not present.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY DebugPrint, _TEXT$00
|
|
|
|
mov r9d, r8d ; set importance level
|
|
mov r8d, edx ; set component id
|
|
mov dx, StrLength[rcx] ; set length of output string
|
|
mov rcx, StrBuffer[rcx] ; set address of output string
|
|
mov eax, BREAKPOINT_PRINT ; set debug service type
|
|
int 2dh ; call debug service
|
|
int 3 ; required - do not remove
|
|
ret ; return
|
|
|
|
LEAF_END DebugPrint, _TEXT$00
|
|
|
|
subttl "Debug Prompt"
|
|
;++
|
|
;
|
|
; ULONG
|
|
; DebugPrompt(
|
|
; IN PSTRING Output,
|
|
; IN PSTRING Input
|
|
; )
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function executes a debug prompt breakpoint.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; Output (rcx) - Supplies a pointer to the output string descriptor.
|
|
;
|
|
; Input (rdx) - Supplies a pointer to the input string descriptor.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; The length of the input string is returned as the function value.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY DebugPrompt, _TEXT$00
|
|
|
|
mov r9w, StrMaximumLength[rdx] ; set maximum length of input string
|
|
mov r8, StrBuffer[rdx] ; set address of input string
|
|
mov dx, StrLength[rcx] ; set length of output string
|
|
mov rcx, StrBuffer[rcx] ; set address of output string
|
|
mov eax, BREAKPOINT_PROMPT ; set debug service type
|
|
int 2dh ; call debug service
|
|
int 3 ; required - do not remove
|
|
ret ; return
|
|
|
|
LEAF_END DebugPrompt, _TEXT$00
|
|
|
|
;++
|
|
;
|
|
; VOID
|
|
; DebugService2(
|
|
; IN PVOID Param1,
|
|
; IN PVOID Param2,
|
|
; IN ULONG Service
|
|
; )
|
|
;
|
|
; Routine Description:
|
|
;
|
|
; This function calls the kernel debugger to execute a command string.
|
|
;
|
|
; Arguments:
|
|
;
|
|
; Param1 (rcx) - Supplies the first parameter to the KD fault handler
|
|
;
|
|
; Param2 (rdx) - Supplies the second parameter to the KD fault handler
|
|
;
|
|
; Service (r8d) - Supplies a pointer to the command string.
|
|
;
|
|
; Return Value:
|
|
;
|
|
; None.
|
|
;
|
|
;--
|
|
|
|
LEAF_ENTRY DebugService2, _TEXT$00
|
|
|
|
mov eax, r8d ; set debug service type
|
|
int 2dh ; call debug service
|
|
int 3 ; required - do not remove
|
|
ret ; return
|
|
|
|
LEAF_END DebugService2, _TEXT$00
|
|
|
|
end
|