6845 lines
214 KiB
C++
6845 lines
214 KiB
C++
//----------------------------------------------------------------------------
|
|
//
|
|
// Debugger engine interfaces.
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef __DBGENG_H__
|
|
#define __DBGENG_H__
|
|
|
|
#include <stdarg.h>
|
|
#include <objbase.h>
|
|
|
|
#ifndef _WDBGEXTS_
|
|
typedef struct _WINDBG_EXTENSION_APIS32* PWINDBG_EXTENSION_APIS32;
|
|
typedef struct _WINDBG_EXTENSION_APIS64* PWINDBG_EXTENSION_APIS64;
|
|
#endif
|
|
|
|
#ifndef _CRASHLIB_
|
|
typedef struct _MEMORY_BASIC_INFORMATION64* PMEMORY_BASIC_INFORMATION64;
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// GUIDs and interface forward declarations.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
/* f2df5f53-071f-47bd-9de6-5734c3fed689 */
|
|
DEFINE_GUID(IID_IDebugAdvanced, 0xf2df5f53, 0x071f, 0x47bd,
|
|
0x9d, 0xe6, 0x57, 0x34, 0xc3, 0xfe, 0xd6, 0x89);
|
|
/* 5bd9d474-5975-423a-b88b-65a8e7110e65 */
|
|
DEFINE_GUID(IID_IDebugBreakpoint, 0x5bd9d474, 0x5975, 0x423a,
|
|
0xb8, 0x8b, 0x65, 0xa8, 0xe7, 0x11, 0x0e, 0x65);
|
|
/* 27fe5639-8407-4f47-8364-ee118fb08ac8 */
|
|
DEFINE_GUID(IID_IDebugClient, 0x27fe5639, 0x8407, 0x4f47,
|
|
0x83, 0x64, 0xee, 0x11, 0x8f, 0xb0, 0x8a, 0xc8);
|
|
/* edbed635-372e-4dab-bbfe-ed0d2f63be81 */
|
|
DEFINE_GUID(IID_IDebugClient2, 0xedbed635, 0x372e, 0x4dab,
|
|
0xbb, 0xfe, 0xed, 0x0d, 0x2f, 0x63, 0xbe, 0x81);
|
|
/* 5182e668-105e-416e-ad92-24ef800424ba */
|
|
DEFINE_GUID(IID_IDebugControl, 0x5182e668, 0x105e, 0x416e,
|
|
0xad, 0x92, 0x24, 0xef, 0x80, 0x04, 0x24, 0xba);
|
|
/* d4366723-44df-4bed-8c7e-4c05424f4588 */
|
|
DEFINE_GUID(IID_IDebugControl2, 0xd4366723, 0x44df, 0x4bed,
|
|
0x8c, 0x7e, 0x4c, 0x05, 0x42, 0x4f, 0x45, 0x88);
|
|
/* 88f7dfab-3ea7-4c3a-aefb-c4e8106173aa */
|
|
DEFINE_GUID(IID_IDebugDataSpaces, 0x88f7dfab, 0x3ea7, 0x4c3a,
|
|
0xae, 0xfb, 0xc4, 0xe8, 0x10, 0x61, 0x73, 0xaa);
|
|
/* 7a5e852f-96e9-468f-ac1b-0b3addc4a049 */
|
|
DEFINE_GUID(IID_IDebugDataSpaces2, 0x7a5e852f, 0x96e9, 0x468f,
|
|
0xac, 0x1b, 0x0b, 0x3a, 0xdd, 0xc4, 0xa0, 0x49);
|
|
/* 337be28b-5036-4d72-b6bf-c45fbb9f2eaa */
|
|
DEFINE_GUID(IID_IDebugEventCallbacks, 0x337be28b, 0x5036, 0x4d72,
|
|
0xb6, 0xbf, 0xc4, 0x5f, 0xbb, 0x9f, 0x2e, 0xaa);
|
|
/* 9f50e42c-f136-499e-9a97-73036c94ed2d */
|
|
DEFINE_GUID(IID_IDebugInputCallbacks, 0x9f50e42c, 0xf136, 0x499e,
|
|
0x9a, 0x97, 0x73, 0x03, 0x6c, 0x94, 0xed, 0x2d);
|
|
/* 4bf58045-d654-4c40-b0af-683090f356dc */
|
|
DEFINE_GUID(IID_IDebugOutputCallbacks, 0x4bf58045, 0xd654, 0x4c40,
|
|
0xb0, 0xaf, 0x68, 0x30, 0x90, 0xf3, 0x56, 0xdc);
|
|
/* ce289126-9e84-45a7-937e-67bb18691493 */
|
|
DEFINE_GUID(IID_IDebugRegisters, 0xce289126, 0x9e84, 0x45a7,
|
|
0x93, 0x7e, 0x67, 0xbb, 0x18, 0x69, 0x14, 0x93);
|
|
/* f2528316-0f1a-4431-aeed-11d096e1e2ab */
|
|
DEFINE_GUID(IID_IDebugSymbolGroup, 0xf2528316, 0x0f1a, 0x4431,
|
|
0xae, 0xed, 0x11, 0xd0, 0x96, 0xe1, 0xe2, 0xab);
|
|
/* 8c31e98c-983a-48a5-9016-6fe5d667a950 */
|
|
DEFINE_GUID(IID_IDebugSymbols, 0x8c31e98c, 0x983a, 0x48a5,
|
|
0x90, 0x16, 0x6f, 0xe5, 0xd6, 0x67, 0xa9, 0x50);
|
|
/* 3a707211-afdd-4495-ad4f-56fecdf8163f */
|
|
DEFINE_GUID(IID_IDebugSymbols2, 0x3a707211, 0xafdd, 0x4495,
|
|
0xad, 0x4f, 0x56, 0xfe, 0xcd, 0xf8, 0x16, 0x3f);
|
|
/* 6b86fe2c-2c4f-4f0c-9da2-174311acc327 */
|
|
DEFINE_GUID(IID_IDebugSystemObjects, 0x6b86fe2c, 0x2c4f, 0x4f0c,
|
|
0x9d, 0xa2, 0x17, 0x43, 0x11, 0xac, 0xc3, 0x27);
|
|
/* 0ae9f5ff-1852-4679-b055-494bee6407ee */
|
|
DEFINE_GUID(IID_IDebugSystemObjects2, 0x0ae9f5ff, 0x1852, 0x4679,
|
|
0xb0, 0x55, 0x49, 0x4b, 0xee, 0x64, 0x07, 0xee);
|
|
|
|
typedef interface DECLSPEC_UUID("f2df5f53-071f-47bd-9de6-5734c3fed689")
|
|
IDebugAdvanced* PDEBUG_ADVANCED;
|
|
typedef interface DECLSPEC_UUID("5bd9d474-5975-423a-b88b-65a8e7110e65")
|
|
IDebugBreakpoint* PDEBUG_BREAKPOINT;
|
|
typedef interface DECLSPEC_UUID("27fe5639-8407-4f47-8364-ee118fb08ac8")
|
|
IDebugClient* PDEBUG_CLIENT;
|
|
typedef interface DECLSPEC_UUID("edbed635-372e-4dab-bbfe-ed0d2f63be81")
|
|
IDebugClient2* PDEBUG_CLIENT2;
|
|
typedef interface DECLSPEC_UUID("5182e668-105e-416e-ad92-24ef800424ba")
|
|
IDebugControl* PDEBUG_CONTROL;
|
|
typedef interface DECLSPEC_UUID("d4366723-44df-4bed-8c7e-4c05424f4588")
|
|
IDebugControl2* PDEBUG_CONTROL2;
|
|
typedef interface DECLSPEC_UUID("88f7dfab-3ea7-4c3a-aefb-c4e8106173aa")
|
|
IDebugDataSpaces* PDEBUG_DATA_SPACES;
|
|
typedef interface DECLSPEC_UUID("7a5e852f-96e9-468f-ac1b-0b3addc4a049")
|
|
IDebugDataSpaces2* PDEBUG_DATA_SPACES2;
|
|
typedef interface DECLSPEC_UUID("337be28b-5036-4d72-b6bf-c45fbb9f2eaa")
|
|
IDebugEventCallbacks* PDEBUG_EVENT_CALLBACKS;
|
|
typedef interface DECLSPEC_UUID("9f50e42c-f136-499e-9a97-73036c94ed2d")
|
|
IDebugInputCallbacks* PDEBUG_INPUT_CALLBACKS;
|
|
typedef interface DECLSPEC_UUID("4bf58045-d654-4c40-b0af-683090f356dc")
|
|
IDebugOutputCallbacks* PDEBUG_OUTPUT_CALLBACKS;
|
|
typedef interface DECLSPEC_UUID("ce289126-9e84-45a7-937e-67bb18691493")
|
|
IDebugRegisters* PDEBUG_REGISTERS;
|
|
typedef interface DECLSPEC_UUID("f2528316-0f1a-4431-aeed-11d096e1e2ab")
|
|
IDebugSymbolGroup* PDEBUG_SYMBOL_GROUP;
|
|
typedef interface DECLSPEC_UUID("8c31e98c-983a-48a5-9016-6fe5d667a950")
|
|
IDebugSymbols* PDEBUG_SYMBOLS;
|
|
typedef interface DECLSPEC_UUID("3a707211-afdd-4495-ad4f-56fecdf8163f")
|
|
IDebugSymbols2* PDEBUG_SYMBOLS2;
|
|
typedef interface DECLSPEC_UUID("6b86fe2c-2c4f-4f0c-9da2-174311acc327")
|
|
IDebugSystemObjects* PDEBUG_SYSTEM_OBJECTS;
|
|
typedef interface DECLSPEC_UUID("0ae9f5ff-1852-4679-b055-494bee6407ee")
|
|
IDebugSystemObjects2* PDEBUG_SYSTEM_OBJECTS2;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Macros.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Extends a 32-bit address into a 64-bit address.
|
|
#define DEBUG_EXTEND64(Addr) ((ULONG64)(LONG64)(LONG)(Addr))
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Client creation functions.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// RemoteOptions specifies connection types and
|
|
// their parameters. Supported strings are:
|
|
// npipe:Server=<Machine>,Pipe=<Pipe name>
|
|
// tcp:Server=<Machine>,Port=<IP port>
|
|
STDAPI
|
|
DebugConnect(
|
|
IN PCSTR RemoteOptions,
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
);
|
|
|
|
STDAPI
|
|
DebugCreate(
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
);
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugAdvanced.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugAdvanced
|
|
DECLARE_INTERFACE_(IDebugAdvanced, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugAdvanced.
|
|
|
|
// Get/SetThreadContext offer control over
|
|
// the full processor context for a thread.
|
|
// Higher-level functions, such as the
|
|
// IDebugRegisters interface, allow similar
|
|
// access in simpler and more generic ways.
|
|
// Get/SetThreadContext are useful when
|
|
// large amounts of thread context must
|
|
// be changed and processor-specific code
|
|
// is not a problem.
|
|
STDMETHOD(GetThreadContext)(
|
|
THIS_
|
|
OUT /* align_is(16) */ PVOID Context,
|
|
IN ULONG ContextSize
|
|
) PURE;
|
|
STDMETHOD(SetThreadContext)(
|
|
THIS_
|
|
IN /* align_is(16) */ PVOID Context,
|
|
IN ULONG ContextSize
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugBreakpoint.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Types of breakpoints.
|
|
#define DEBUG_BREAKPOINT_CODE 0
|
|
#define DEBUG_BREAKPOINT_DATA 1
|
|
|
|
// Breakpoint flags.
|
|
// Go-only breakpoints are only active when
|
|
// the engine is in unrestricted execution
|
|
// mode. They do not fire when the engine
|
|
// is stepping.
|
|
#define DEBUG_BREAKPOINT_GO_ONLY 0x00000001
|
|
// A breakpoint is flagged as deferred as long as
|
|
// its offset expression cannot be evaluated.
|
|
// A deferred breakpoint is not active.
|
|
#define DEBUG_BREAKPOINT_DEFERRED 0x00000002
|
|
#define DEBUG_BREAKPOINT_ENABLED 0x00000004
|
|
// The adder-only flag does not affect breakpoint
|
|
// operation. It is just a marker to restrict
|
|
// output and notifications for the breakpoint to
|
|
// the client that added the breakpoint. Breakpoint
|
|
// callbacks for adder-only breaks will only be delivered
|
|
// to the adding client. The breakpoint can not
|
|
// be enumerated and accessed by other clients.
|
|
#define DEBUG_BREAKPOINT_ADDER_ONLY 0x00000008
|
|
|
|
// Data breakpoint access types.
|
|
// Different architectures support different
|
|
// sets of these bits.
|
|
#define DEBUG_BREAK_READ 0x00000001
|
|
#define DEBUG_BREAK_WRITE 0x00000002
|
|
#define DEBUG_BREAK_EXECUTE 0x00000004
|
|
#define DEBUG_BREAK_IO 0x00000008
|
|
|
|
// Structure for querying breakpoint information
|
|
// all at once.
|
|
typedef struct _DEBUG_BREAKPOINT_PARAMETERS
|
|
{
|
|
ULONG64 Offset;
|
|
ULONG Id;
|
|
ULONG BreakType;
|
|
ULONG ProcType;
|
|
ULONG Flags;
|
|
ULONG DataSize;
|
|
ULONG DataAccessType;
|
|
ULONG PassCount;
|
|
ULONG CurrentPassCount;
|
|
ULONG MatchThread;
|
|
ULONG CommandSize;
|
|
ULONG OffsetExpressionSize;
|
|
} DEBUG_BREAKPOINT_PARAMETERS, *PDEBUG_BREAKPOINT_PARAMETERS;
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugBreakpoint
|
|
DECLARE_INTERFACE_(IDebugBreakpoint, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugBreakpoint.
|
|
|
|
// Retrieves debugger engine unique ID
|
|
// for the breakpoint. This ID is
|
|
// fixed as long as the breakpoint exists
|
|
// but after that may be reused.
|
|
STDMETHOD(GetId)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Retrieves the type of break and
|
|
// processor type for the breakpoint.
|
|
STDMETHOD(GetType)(
|
|
THIS_
|
|
OUT PULONG BreakType,
|
|
OUT PULONG ProcType
|
|
) PURE;
|
|
// Returns the client that called AddBreakpoint.
|
|
STDMETHOD(GetAdder)(
|
|
THIS_
|
|
OUT PDEBUG_CLIENT* Adder
|
|
) PURE;
|
|
|
|
STDMETHOD(GetFlags)(
|
|
THIS_
|
|
OUT PULONG Flags
|
|
) PURE;
|
|
// Only certain flags can be changed. Flags
|
|
// are: GO_ONLY, ENABLE.
|
|
// Sets the given flags.
|
|
STDMETHOD(AddFlags)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// Clears the given flags.
|
|
STDMETHOD(RemoveFlags)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// Sets the flags.
|
|
STDMETHOD(SetFlags)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Controls the offset of the breakpoint. The
|
|
// interpretation of the offset value depends on
|
|
// the type of breakpoint and its settings. It
|
|
// may be a code address, a data address, an
|
|
// I/O port, etc.
|
|
STDMETHOD(GetOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(SetOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset
|
|
) PURE;
|
|
|
|
// Data breakpoint methods will fail is the
|
|
// target platform does not support the
|
|
// parameters used.
|
|
// These methods only function for breakpoints
|
|
// created as data breakpoints.
|
|
STDMETHOD(GetDataParameters)(
|
|
THIS_
|
|
OUT PULONG Size,
|
|
OUT PULONG AccessType
|
|
) PURE;
|
|
STDMETHOD(SetDataParameters)(
|
|
THIS_
|
|
IN ULONG Size,
|
|
IN ULONG AccessType
|
|
) PURE;
|
|
|
|
// Pass count defaults to one.
|
|
STDMETHOD(GetPassCount)(
|
|
THIS_
|
|
OUT PULONG Count
|
|
) PURE;
|
|
STDMETHOD(SetPassCount)(
|
|
THIS_
|
|
IN ULONG Count
|
|
) PURE;
|
|
// Gets the current number of times
|
|
// the breakpoint has been hit since
|
|
// it was last triggered.
|
|
STDMETHOD(GetCurrentPassCount)(
|
|
THIS_
|
|
OUT PULONG Count
|
|
) PURE;
|
|
|
|
// If a match thread is set this breakpoint will
|
|
// only trigger if it occurs on the match thread.
|
|
// Otherwise it triggers for all threads.
|
|
// Thread restrictions are not currently supported
|
|
// in kernel mode.
|
|
STDMETHOD(GetMatchThreadId)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(SetMatchThreadId)(
|
|
THIS_
|
|
IN ULONG Thread
|
|
) PURE;
|
|
|
|
// The command for a breakpoint is automatically
|
|
// executed by the engine before the event
|
|
// is propagated. If the breakpoint continues
|
|
// execution the event will begin with a continue
|
|
// status. If the breakpoint does not continue
|
|
// the event will begin with a break status.
|
|
// This allows breakpoint commands to participate
|
|
// in the normal event status voting.
|
|
// Breakpoint commands are only executed until
|
|
// the first command that alters the execution
|
|
// status, such as g, p and t.
|
|
// Breakpoint commands are removed when the
|
|
// current syntax changes.
|
|
STDMETHOD(GetCommand)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG CommandSize
|
|
) PURE;
|
|
STDMETHOD(SetCommand)(
|
|
THIS_
|
|
IN PCSTR Command
|
|
) PURE;
|
|
|
|
// Offset expressions are evaluated immediately
|
|
// and at module load and unload events. If the
|
|
// evaluation is successful the breakpoints
|
|
// offset is updated and the breakpoint is
|
|
// handled normally. If the expression cannot
|
|
// be evaluated the breakpoint is deferred.
|
|
// Currently the only offset expression
|
|
// supported is a module-relative symbol
|
|
// of the form <Module>!<Symbol>.
|
|
STDMETHOD(GetOffsetExpression)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ExpressionSize
|
|
) PURE;
|
|
STDMETHOD(SetOffsetExpression)(
|
|
THIS_
|
|
IN PCSTR Expression
|
|
) PURE;
|
|
|
|
STDMETHOD(GetParameters)(
|
|
THIS_
|
|
OUT PDEBUG_BREAKPOINT_PARAMETERS Params
|
|
) PURE;
|
|
};
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugClient.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Kernel attach flags.
|
|
#define DEBUG_ATTACH_KERNEL_CONNECTION 0x00000000
|
|
// Attach to the local machine. If this flag is not set
|
|
// a connection is made to a separate target machine using
|
|
// the given connection options.
|
|
#define DEBUG_ATTACH_LOCAL_KERNEL 0x00000001
|
|
// Attach to an eXDI driver.
|
|
#define DEBUG_ATTACH_EXDI_DRIVER 0x00000002
|
|
|
|
// GetRunningProcessSystemIdByExecutableName flags.
|
|
// By default the match allows a tail match on
|
|
// just the filename. The match returns the first hit
|
|
// even if multiple matches exist.
|
|
#define DEBUG_GET_PROC_DEFAULT 0x00000000
|
|
// The name must match fully.
|
|
#define DEBUG_GET_PROC_FULL_MATCH 0x00000001
|
|
// The match must be the only match.
|
|
#define DEBUG_GET_PROC_ONLY_MATCH 0x00000002
|
|
|
|
// GetRunningProcessDescription flags.
|
|
#define DEBUG_PROC_DESC_DEFAULT 0x00000000
|
|
// Return only filenames, not full paths.
|
|
#define DEBUG_PROC_DESC_NO_PATHS 0x00000001
|
|
|
|
//
|
|
// Attach flags.
|
|
//
|
|
|
|
// Call DebugActiveProcess when attaching.
|
|
#define DEBUG_ATTACH_DEFAULT 0x00000000
|
|
// When attaching to a process just examine
|
|
// the process state and suspend the threads.
|
|
// DebugActiveProcess is not called so the process
|
|
// is not actually being debugged. This is useful
|
|
// for debugging processes holding locks which
|
|
// interfere with the operation of DebugActiveProcess
|
|
// or in situations where it is not desirable to
|
|
// actually set up as a debugger.
|
|
#define DEBUG_ATTACH_NONINVASIVE 0x00000001
|
|
// Attempt to attach to a process that was abandoned
|
|
// when being debugged. This is only supported in
|
|
// some system versions.
|
|
// This flag also allows multiple debuggers to
|
|
// attach to the same process, which can result
|
|
// in numerous problems unless very carefully
|
|
// managed.
|
|
#define DEBUG_ATTACH_EXISTING 0x00000002
|
|
|
|
// Process creation flags.
|
|
// On Windows Whistler this flag prevents the debug
|
|
// heap from being used in the new process.
|
|
#define DEBUG_CREATE_PROCESS_NO_DEBUG_HEAP CREATE_UNICODE_ENVIRONMENT
|
|
|
|
//
|
|
// Process options.
|
|
//
|
|
|
|
// Indicates that the debuggee process should be
|
|
// automatically detached when the debugger exits.
|
|
// A debugger can explicitly detach on exit or this
|
|
// flag can be set so that detach occurs regardless
|
|
// of how the debugger exits.
|
|
// This is only supported on some system versions.
|
|
#define DEBUG_PROCESS_DETACH_ON_EXIT 0x00000001
|
|
// Indicates that processes created by the current
|
|
// process should not be debugged.
|
|
// Modifying this flag is only supported on some
|
|
// system versions.
|
|
#define DEBUG_PROCESS_ONLY_THIS_PROCESS 0x00000002
|
|
|
|
// ConnectSession flags.
|
|
// Default connect.
|
|
#define DEBUG_CONNECT_SESSION_DEFAULT 0x00000000
|
|
// Do not output the debugger version.
|
|
#define DEBUG_CONNECT_SESSION_NO_VERSION 0x00000001
|
|
// Do not announce the connection.
|
|
#define DEBUG_CONNECT_SESSION_NO_ANNOUNCE 0x00000002
|
|
|
|
// OutputServers flags.
|
|
// Debugger servers from StartSever.
|
|
#define DEBUG_SERVERS_DEBUGGER 0x00000001
|
|
// Process servers from StartProcessServer.
|
|
#define DEBUG_SERVERS_PROCESS 0x00000002
|
|
#define DEBUG_SERVERS_ALL 0x00000003
|
|
|
|
// EndSession flags.
|
|
// Perform cleanup for the session.
|
|
#define DEBUG_END_PASSIVE 0x00000000
|
|
// Actively terminate the session and then perform cleanup.
|
|
#define DEBUG_END_ACTIVE_TERMINATE 0x00000001
|
|
// If possible, detach from all processes and then perform cleanup.
|
|
#define DEBUG_END_ACTIVE_DETACH 0x00000002
|
|
// Perform whatever cleanup is possible that doesn't require
|
|
// acquiring any locks. This is useful for situations where
|
|
// a thread is currently using the engine but the application
|
|
// needs to exit and still wants to give the engine
|
|
// the opportunity to clean up as much as possible.
|
|
// This may leave the engine in an indeterminate state so
|
|
// further engine calls should not be made.
|
|
// When making a reentrant EndSession call from a remote
|
|
// client it is the callers responsibility to ensure
|
|
// that the server can process the request. It is best
|
|
// to avoid making such calls.
|
|
#define DEBUG_END_REENTRANT 0x00000003
|
|
|
|
// Output mask bits.
|
|
// Normal output.
|
|
#define DEBUG_OUTPUT_NORMAL 0x00000001
|
|
// Error output.
|
|
#define DEBUG_OUTPUT_ERROR 0x00000002
|
|
// Warnings.
|
|
#define DEBUG_OUTPUT_WARNING 0x00000004
|
|
// Additional output.
|
|
#define DEBUG_OUTPUT_VERBOSE 0x00000008
|
|
// Prompt output.
|
|
#define DEBUG_OUTPUT_PROMPT 0x00000010
|
|
// Register dump before prompt.
|
|
#define DEBUG_OUTPUT_PROMPT_REGISTERS 0x00000020
|
|
// Warnings specific to extension operation.
|
|
#define DEBUG_OUTPUT_EXTENSION_WARNING 0x00000040
|
|
// Debuggee debug output, such as from OutputDebugString.
|
|
#define DEBUG_OUTPUT_DEBUGGEE 0x00000080
|
|
// Debuggee-generated prompt, such as from DbgPrompt.
|
|
#define DEBUG_OUTPUT_DEBUGGEE_PROMPT 0x00000100
|
|
|
|
// Internal debugger output, used mainly
|
|
// for debugging the debugger. Output
|
|
// may only occur in debug builds.
|
|
// KD protocol output.
|
|
#define DEBUG_IOUTPUT_KD_PROTOCOL 0x80000000
|
|
// Remoting output.
|
|
#define DEBUG_IOUTPUT_REMOTING 0x40000000
|
|
// Breakpoint output.
|
|
#define DEBUG_IOUTPUT_BREAKPOINT 0x20000000
|
|
// Event output.
|
|
#define DEBUG_IOUTPUT_EVENT 0x10000000
|
|
|
|
// OutputIdentity flags.
|
|
#define DEBUG_OUTPUT_IDENTITY_DEFAULT 0x00000000
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugClient
|
|
DECLARE_INTERFACE_(IDebugClient, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugClient.
|
|
|
|
// The following set of methods start
|
|
// the different kinds of debuggees.
|
|
|
|
// Begins a debug session using the kernel
|
|
// debugging protocol. This method selects
|
|
// the protocol as the debuggee communication
|
|
// mechanism but does not initiate the communication
|
|
// itself.
|
|
STDMETHOD(AttachKernel)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN OPTIONAL PCSTR ConnectOptions
|
|
) PURE;
|
|
STDMETHOD(GetKernelConnectionOptions)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG OptionsSize
|
|
) PURE;
|
|
// Updates the connection options for a live
|
|
// kernel connection. This can only be used
|
|
// to modify parameters for the connection, not
|
|
// to switch to a completely different kind of
|
|
// connection.
|
|
// This method is reentrant.
|
|
STDMETHOD(SetKernelConnectionOptions)(
|
|
THIS_
|
|
IN PCSTR Options
|
|
) PURE;
|
|
|
|
// Starts a process server for remote
|
|
// user-mode process control.
|
|
// The local process server is server zero.
|
|
STDMETHOD(StartProcessServer)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN PCSTR Options,
|
|
IN PVOID Reserved
|
|
) PURE;
|
|
STDMETHOD(ConnectProcessServer)(
|
|
THIS_
|
|
IN PCSTR RemoteOptions,
|
|
OUT PULONG64 Server
|
|
) PURE;
|
|
STDMETHOD(DisconnectProcessServer)(
|
|
THIS_
|
|
IN ULONG64 Server
|
|
) PURE;
|
|
|
|
// Enumerates and describes processes
|
|
// accessible through the given process server.
|
|
STDMETHOD(GetRunningProcessSystemIds)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
IN ULONG Count,
|
|
OUT OPTIONAL PULONG ActualCount
|
|
) PURE;
|
|
STDMETHOD(GetRunningProcessSystemIdByExecutableName)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN PCSTR ExeName,
|
|
IN ULONG Flags,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(GetRunningProcessDescription)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN ULONG SystemId,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PSTR ExeName,
|
|
IN ULONG ExeNameSize,
|
|
OUT OPTIONAL PULONG ActualExeNameSize,
|
|
OUT OPTIONAL PSTR Description,
|
|
IN ULONG DescriptionSize,
|
|
OUT OPTIONAL PULONG ActualDescriptionSize
|
|
) PURE;
|
|
|
|
// Attaches to a running user-mode process.
|
|
STDMETHOD(AttachProcess)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN ULONG ProcessId,
|
|
IN ULONG AttachFlags
|
|
) PURE;
|
|
// Creates a new user-mode process for debugging.
|
|
// CreateFlags are as given to Win32s CreateProcess.
|
|
// One of DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS
|
|
// must be specified.
|
|
STDMETHOD(CreateProcess)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN PSTR CommandLine,
|
|
IN ULONG CreateFlags
|
|
) PURE;
|
|
// Creates or attaches to a user-mode process, or both.
|
|
// If CommandLine is NULL this method operates as
|
|
// AttachProcess does. If ProcessId is zero it
|
|
// operates as CreateProcess does. If CommandLine is
|
|
// non-NULL and ProcessId is non-zero the method first
|
|
// starts a process with the given information but
|
|
// in a suspended state. The engine then attaches to
|
|
// the indicated process. Once the attach is successful
|
|
// the suspended process is resumed. This provides
|
|
// synchronization between the new process and the
|
|
// attachment.
|
|
STDMETHOD(CreateProcessAndAttach)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN OPTIONAL PSTR CommandLine,
|
|
IN ULONG CreateFlags,
|
|
IN ULONG ProcessId,
|
|
IN ULONG AttachFlags
|
|
) PURE;
|
|
// Gets and sets process control flags.
|
|
STDMETHOD(GetProcessOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddProcessOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveProcessOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetProcessOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
|
|
// Opens any kind of user- or kernel-mode dump file
|
|
// and begins a debug session with the information
|
|
// contained within it.
|
|
STDMETHOD(OpenDumpFile)(
|
|
THIS_
|
|
IN PCSTR DumpFile
|
|
) PURE;
|
|
// Writes a dump file from the current session information.
|
|
// The kind of dump file written is determined by the
|
|
// kind of session and the type qualifier given.
|
|
// For example, if the current session is a kernel
|
|
// debug session (DEBUG_CLASS_KERNEL) and the qualifier
|
|
// is DEBUG_DUMP_SMALL a small kernel dump will be written.
|
|
STDMETHOD(WriteDumpFile)(
|
|
THIS_
|
|
IN PCSTR DumpFile,
|
|
IN ULONG Qualifier
|
|
) PURE;
|
|
|
|
// Indicates that a remote client is ready to
|
|
// begin participating in the current session.
|
|
// HistoryLimit gives a character limit on
|
|
// the amount of output history to be sent.
|
|
STDMETHOD(ConnectSession)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG HistoryLimit
|
|
) PURE;
|
|
// Indicates that the engine should start accepting
|
|
// remote connections. Options specifies connection types
|
|
// and their parameters. Supported strings are:
|
|
// npipe:Pipe=<Pipe name>
|
|
// tcp:Port=<IP port>
|
|
STDMETHOD(StartServer)(
|
|
THIS_
|
|
IN PCSTR Options
|
|
) PURE;
|
|
// List the servers running on the given machine.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputServers)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN PCSTR Machine,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Attempts to terminate all processes in the debuggers list.
|
|
STDMETHOD(TerminateProcesses)(
|
|
THIS
|
|
) PURE;
|
|
// Attempts to detach from all processes in the debuggers list.
|
|
// This requires OS support for debugger detach.
|
|
STDMETHOD(DetachProcesses)(
|
|
THIS
|
|
) PURE;
|
|
// Stops the current debug session. If a process
|
|
// was created or attached an active EndSession can
|
|
// terminate or detach from it.
|
|
// If a kernel connection was opened it will be closed but the
|
|
// target machine is otherwise unaffected.
|
|
STDMETHOD(EndSession)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// If a process was started and ran to completion
|
|
// this method can be used to retrieve its exit code.
|
|
STDMETHOD(GetExitCode)(
|
|
THIS_
|
|
OUT PULONG Code
|
|
) PURE;
|
|
|
|
// Client event callbacks are called on the thread
|
|
// of the client. In order to give thread
|
|
// execution to the engine for callbacks all
|
|
// client threads should call DispatchCallbacks
|
|
// when they are idle. Callbacks are only
|
|
// received when a thread calls DispatchCallbacks
|
|
// or WaitForEvent. WaitForEvent can only be
|
|
// called by the thread that started the debug
|
|
// session so all other client threads should
|
|
// call DispatchCallbacks when possible.
|
|
// DispatchCallbacks returns when ExitDispatch is used
|
|
// to interrupt dispatch or when the timeout expires.
|
|
// DispatchCallbacks dispatches callbacks for all
|
|
// clients associated with the thread calling
|
|
// DispatchCallbacks.
|
|
// DispatchCallbacks returns S_FALSE when the
|
|
// timeout expires.
|
|
STDMETHOD(DispatchCallbacks)(
|
|
THIS_
|
|
IN ULONG Timeout
|
|
) PURE;
|
|
// ExitDispatch can be used to interrupt callback
|
|
// dispatch when a client thread is needed by the
|
|
// client. This method is reentrant and can
|
|
// be called from any thread.
|
|
STDMETHOD(ExitDispatch)(
|
|
THIS_
|
|
IN PDEBUG_CLIENT Client
|
|
) PURE;
|
|
|
|
// Clients are specific to the thread that
|
|
// created them. Calls from other threads
|
|
// fail immediately. The CreateClient method
|
|
// is a notable exception; it allows creation
|
|
// of a new client for a new thread.
|
|
STDMETHOD(CreateClient)(
|
|
THIS_
|
|
OUT PDEBUG_CLIENT* Client
|
|
) PURE;
|
|
|
|
STDMETHOD(GetInputCallbacks)(
|
|
THIS_
|
|
OUT PDEBUG_INPUT_CALLBACKS* Callbacks
|
|
) PURE;
|
|
STDMETHOD(SetInputCallbacks)(
|
|
THIS_
|
|
IN PDEBUG_INPUT_CALLBACKS Callbacks
|
|
) PURE;
|
|
|
|
// Output callback interfaces are described separately.
|
|
STDMETHOD(GetOutputCallbacks)(
|
|
THIS_
|
|
OUT PDEBUG_OUTPUT_CALLBACKS* Callbacks
|
|
) PURE;
|
|
STDMETHOD(SetOutputCallbacks)(
|
|
THIS_
|
|
IN PDEBUG_OUTPUT_CALLBACKS Callbacks
|
|
) PURE;
|
|
// Output flags provide control over
|
|
// the distribution of output among clients.
|
|
// Output masks select which output streams
|
|
// should be sent to the output callbacks.
|
|
// Only Output calls with a mask that
|
|
// contains one of the output mask bits
|
|
// will be sent to the output callbacks.
|
|
// These methods are reentrant.
|
|
// If such access is not synchronized
|
|
// disruptions in output may occur.
|
|
STDMETHOD(GetOutputMask)(
|
|
THIS_
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
STDMETHOD(SetOutputMask)(
|
|
THIS_
|
|
IN ULONG Mask
|
|
) PURE;
|
|
// These methods allow access to another clients
|
|
// output mask. They are necessary for changing
|
|
// a clients output mask when it is
|
|
// waiting for events. These methods are reentrant
|
|
// and can be called from any thread.
|
|
STDMETHOD(GetOtherOutputMask)(
|
|
THIS_
|
|
IN PDEBUG_CLIENT Client,
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
STDMETHOD(SetOtherOutputMask)(
|
|
THIS_
|
|
IN PDEBUG_CLIENT Client,
|
|
IN ULONG Mask
|
|
) PURE;
|
|
// Control the width of an output line for
|
|
// commands which produce formatted output.
|
|
// This setting is just a suggestion.
|
|
STDMETHOD(GetOutputWidth)(
|
|
THIS_
|
|
OUT PULONG Columns
|
|
) PURE;
|
|
STDMETHOD(SetOutputWidth)(
|
|
THIS_
|
|
IN ULONG Columns
|
|
) PURE;
|
|
// Some of the engines output commands produce
|
|
// multiple lines of output. A prefix can be
|
|
// set that the engine will automatically output
|
|
// for each line in that case, allowing a caller
|
|
// to control indentation or identifying marks.
|
|
// This is not a general setting for any output
|
|
// with a newline in it. Methods which use
|
|
// the line prefix are marked in their documentation.
|
|
STDMETHOD(GetOutputLinePrefix)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PrefixSize
|
|
) PURE;
|
|
STDMETHOD(SetOutputLinePrefix)(
|
|
THIS_
|
|
IN OPTIONAL PCSTR Prefix
|
|
) PURE;
|
|
|
|
// Returns a string describing the machine
|
|
// and user this client represents. The
|
|
// specific content of the string varies
|
|
// with operating system. If the client is
|
|
// remotely connected some network information
|
|
// may also be present.
|
|
STDMETHOD(GetIdentity)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG IdentitySize
|
|
) PURE;
|
|
// Format is a printf-like format string
|
|
// with one %s where the identity string should go.
|
|
STDMETHOD(OutputIdentity)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags,
|
|
IN PCSTR Format
|
|
) PURE;
|
|
|
|
// Event callbacks allow a client to
|
|
// receive notification about changes
|
|
// during the debug session.
|
|
STDMETHOD(GetEventCallbacks)(
|
|
THIS_
|
|
OUT PDEBUG_EVENT_CALLBACKS* Callbacks
|
|
) PURE;
|
|
STDMETHOD(SetEventCallbacks)(
|
|
THIS_
|
|
IN PDEBUG_EVENT_CALLBACKS Callbacks
|
|
) PURE;
|
|
|
|
// The engine sometimes merges compatible callback
|
|
// requests to reduce callback overhead. This is
|
|
// most noticeable with output as small pieces of
|
|
// output are collected into larger groups to
|
|
// reduce the overall number of output callback calls.
|
|
// A client can use this method to force all pending
|
|
// callbacks to be delivered. This is rarely necessary.
|
|
STDMETHOD(FlushCallbacks)(
|
|
THIS
|
|
) PURE;
|
|
};
|
|
|
|
// Per-dump-format control flags.
|
|
#define DEBUG_FORMAT_DEFAULT 0x00000000
|
|
|
|
#define DEBUG_FORMAT_USER_SMALL_FULL_MEMORY 0x00000001
|
|
#define DEBUG_FORMAT_USER_SMALL_HANDLE_DATA 0x00000002
|
|
|
|
//
|
|
// Dump information file types.
|
|
//
|
|
|
|
// Single file containing packed page file information.
|
|
#define DEBUG_DUMP_FILE_PAGE_FILE_DUMP 0x00000000
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugClient2
|
|
DECLARE_INTERFACE_(IDebugClient2, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugClient.
|
|
|
|
// The following set of methods start
|
|
// the different kinds of debuggees.
|
|
|
|
// Begins a debug session using the kernel
|
|
// debugging protocol. This method selects
|
|
// the protocol as the debuggee communication
|
|
// mechanism but does not initiate the communication
|
|
// itself.
|
|
STDMETHOD(AttachKernel)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN OPTIONAL PCSTR ConnectOptions
|
|
) PURE;
|
|
STDMETHOD(GetKernelConnectionOptions)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG OptionsSize
|
|
) PURE;
|
|
// Updates the connection options for a live
|
|
// kernel connection. This can only be used
|
|
// to modify parameters for the connection, not
|
|
// to switch to a completely different kind of
|
|
// connection.
|
|
// This method is reentrant.
|
|
STDMETHOD(SetKernelConnectionOptions)(
|
|
THIS_
|
|
IN PCSTR Options
|
|
) PURE;
|
|
|
|
// Starts a process server for remote
|
|
// user-mode process control.
|
|
// The local process server is server zero.
|
|
STDMETHOD(StartProcessServer)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN PCSTR Options,
|
|
IN PVOID Reserved
|
|
) PURE;
|
|
STDMETHOD(ConnectProcessServer)(
|
|
THIS_
|
|
IN PCSTR RemoteOptions,
|
|
OUT PULONG64 Server
|
|
) PURE;
|
|
STDMETHOD(DisconnectProcessServer)(
|
|
THIS_
|
|
IN ULONG64 Server
|
|
) PURE;
|
|
|
|
// Enumerates and describes processes
|
|
// accessible through the given process server.
|
|
STDMETHOD(GetRunningProcessSystemIds)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
IN ULONG Count,
|
|
OUT OPTIONAL PULONG ActualCount
|
|
) PURE;
|
|
STDMETHOD(GetRunningProcessSystemIdByExecutableName)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN PCSTR ExeName,
|
|
IN ULONG Flags,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(GetRunningProcessDescription)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN ULONG SystemId,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PSTR ExeName,
|
|
IN ULONG ExeNameSize,
|
|
OUT OPTIONAL PULONG ActualExeNameSize,
|
|
OUT OPTIONAL PSTR Description,
|
|
IN ULONG DescriptionSize,
|
|
OUT OPTIONAL PULONG ActualDescriptionSize
|
|
) PURE;
|
|
|
|
// Attaches to a running user-mode process.
|
|
STDMETHOD(AttachProcess)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN ULONG ProcessId,
|
|
IN ULONG AttachFlags
|
|
) PURE;
|
|
// Creates a new user-mode process for debugging.
|
|
// CreateFlags are as given to Win32s CreateProcess.
|
|
// One of DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS
|
|
// must be specified.
|
|
STDMETHOD(CreateProcess)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN PSTR CommandLine,
|
|
IN ULONG CreateFlags
|
|
) PURE;
|
|
// Creates or attaches to a user-mode process, or both.
|
|
// If CommandLine is NULL this method operates as
|
|
// AttachProcess does. If ProcessId is zero it
|
|
// operates as CreateProcess does. If CommandLine is
|
|
// non-NULL and ProcessId is non-zero the method first
|
|
// starts a process with the given information but
|
|
// in a suspended state. The engine then attaches to
|
|
// the indicated process. Once the attach is successful
|
|
// the suspended process is resumed. This provides
|
|
// synchronization between the new process and the
|
|
// attachment.
|
|
STDMETHOD(CreateProcessAndAttach)(
|
|
THIS_
|
|
IN ULONG64 Server,
|
|
IN OPTIONAL PSTR CommandLine,
|
|
IN ULONG CreateFlags,
|
|
IN ULONG ProcessId,
|
|
IN ULONG AttachFlags
|
|
) PURE;
|
|
// Gets and sets process control flags.
|
|
STDMETHOD(GetProcessOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddProcessOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveProcessOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetProcessOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
|
|
// Opens any kind of user- or kernel-mode dump file
|
|
// and begins a debug session with the information
|
|
// contained within it.
|
|
STDMETHOD(OpenDumpFile)(
|
|
THIS_
|
|
IN PCSTR DumpFile
|
|
) PURE;
|
|
// Writes a dump file from the current session information.
|
|
// The kind of dump file written is determined by the
|
|
// kind of session and the type qualifier given.
|
|
// For example, if the current session is a kernel
|
|
// debug session (DEBUG_CLASS_KERNEL) and the qualifier
|
|
// is DEBUG_DUMP_SMALL a small kernel dump will be written.
|
|
STDMETHOD(WriteDumpFile)(
|
|
THIS_
|
|
IN PCSTR DumpFile,
|
|
IN ULONG Qualifier
|
|
) PURE;
|
|
|
|
// Indicates that a remote client is ready to
|
|
// begin participating in the current session.
|
|
// HistoryLimit gives a character limit on
|
|
// the amount of output history to be sent.
|
|
STDMETHOD(ConnectSession)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG HistoryLimit
|
|
) PURE;
|
|
// Indicates that the engine should start accepting
|
|
// remote connections. Options specifies connection types
|
|
// and their parameters. Supported strings are:
|
|
// npipe:Pipe=<Pipe name>
|
|
// tcp:Port=<IP port>
|
|
STDMETHOD(StartServer)(
|
|
THIS_
|
|
IN PCSTR Options
|
|
) PURE;
|
|
// List the servers running on the given machine.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputServers)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN PCSTR Machine,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Attempts to terminate all processes in the debuggers list.
|
|
STDMETHOD(TerminateProcesses)(
|
|
THIS
|
|
) PURE;
|
|
// Attempts to detach from all processes in the debuggers list.
|
|
// This requires OS support for debugger detach.
|
|
STDMETHOD(DetachProcesses)(
|
|
THIS
|
|
) PURE;
|
|
// Stops the current debug session. If a process
|
|
// was created or attached an active EndSession can
|
|
// terminate or detach from it.
|
|
// If a kernel connection was opened it will be closed but the
|
|
// target machine is otherwise unaffected.
|
|
STDMETHOD(EndSession)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// If a process was started and ran to completion
|
|
// this method can be used to retrieve its exit code.
|
|
STDMETHOD(GetExitCode)(
|
|
THIS_
|
|
OUT PULONG Code
|
|
) PURE;
|
|
|
|
// Client event callbacks are called on the thread
|
|
// of the client. In order to give thread
|
|
// execution to the engine for callbacks all
|
|
// client threads should call DispatchCallbacks
|
|
// when they are idle. Callbacks are only
|
|
// received when a thread calls DispatchCallbacks
|
|
// or WaitForEvent. WaitForEvent can only be
|
|
// called by the thread that started the debug
|
|
// session so all other client threads should
|
|
// call DispatchCallbacks when possible.
|
|
// DispatchCallbacks returns when ExitDispatch is used
|
|
// to interrupt dispatch or when the timeout expires.
|
|
// DispatchCallbacks dispatches callbacks for all
|
|
// clients associated with the thread calling
|
|
// DispatchCallbacks.
|
|
// DispatchCallbacks returns S_FALSE when the
|
|
// timeout expires.
|
|
STDMETHOD(DispatchCallbacks)(
|
|
THIS_
|
|
IN ULONG Timeout
|
|
) PURE;
|
|
// ExitDispatch can be used to interrupt callback
|
|
// dispatch when a client thread is needed by the
|
|
// client. This method is reentrant and can
|
|
// be called from any thread.
|
|
STDMETHOD(ExitDispatch)(
|
|
THIS_
|
|
IN PDEBUG_CLIENT Client
|
|
) PURE;
|
|
|
|
// Clients are specific to the thread that
|
|
// created them. Calls from other threads
|
|
// fail immediately. The CreateClient method
|
|
// is a notable exception; it allows creation
|
|
// of a new client for a new thread.
|
|
STDMETHOD(CreateClient)(
|
|
THIS_
|
|
OUT PDEBUG_CLIENT* Client
|
|
) PURE;
|
|
|
|
STDMETHOD(GetInputCallbacks)(
|
|
THIS_
|
|
OUT PDEBUG_INPUT_CALLBACKS* Callbacks
|
|
) PURE;
|
|
STDMETHOD(SetInputCallbacks)(
|
|
THIS_
|
|
IN PDEBUG_INPUT_CALLBACKS Callbacks
|
|
) PURE;
|
|
|
|
// Output callback interfaces are described separately.
|
|
STDMETHOD(GetOutputCallbacks)(
|
|
THIS_
|
|
OUT PDEBUG_OUTPUT_CALLBACKS* Callbacks
|
|
) PURE;
|
|
STDMETHOD(SetOutputCallbacks)(
|
|
THIS_
|
|
IN PDEBUG_OUTPUT_CALLBACKS Callbacks
|
|
) PURE;
|
|
// Output flags provide control over
|
|
// the distribution of output among clients.
|
|
// Output masks select which output streams
|
|
// should be sent to the output callbacks.
|
|
// Only Output calls with a mask that
|
|
// contains one of the output mask bits
|
|
// will be sent to the output callbacks.
|
|
// These methods are reentrant.
|
|
// If such access is not synchronized
|
|
// disruptions in output may occur.
|
|
STDMETHOD(GetOutputMask)(
|
|
THIS_
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
STDMETHOD(SetOutputMask)(
|
|
THIS_
|
|
IN ULONG Mask
|
|
) PURE;
|
|
// These methods allow access to another clients
|
|
// output mask. They are necessary for changing
|
|
// a clients output mask when it is
|
|
// waiting for events. These methods are reentrant
|
|
// and can be called from any thread.
|
|
STDMETHOD(GetOtherOutputMask)(
|
|
THIS_
|
|
IN PDEBUG_CLIENT Client,
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
STDMETHOD(SetOtherOutputMask)(
|
|
THIS_
|
|
IN PDEBUG_CLIENT Client,
|
|
IN ULONG Mask
|
|
) PURE;
|
|
// Control the width of an output line for
|
|
// commands which produce formatted output.
|
|
// This setting is just a suggestion.
|
|
STDMETHOD(GetOutputWidth)(
|
|
THIS_
|
|
OUT PULONG Columns
|
|
) PURE;
|
|
STDMETHOD(SetOutputWidth)(
|
|
THIS_
|
|
IN ULONG Columns
|
|
) PURE;
|
|
// Some of the engines output commands produce
|
|
// multiple lines of output. A prefix can be
|
|
// set that the engine will automatically output
|
|
// for each line in that case, allowing a caller
|
|
// to control indentation or identifying marks.
|
|
// This is not a general setting for any output
|
|
// with a newline in it. Methods which use
|
|
// the line prefix are marked in their documentation.
|
|
STDMETHOD(GetOutputLinePrefix)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PrefixSize
|
|
) PURE;
|
|
STDMETHOD(SetOutputLinePrefix)(
|
|
THIS_
|
|
IN OPTIONAL PCSTR Prefix
|
|
) PURE;
|
|
|
|
// Returns a string describing the machine
|
|
// and user this client represents. The
|
|
// specific content of the string varies
|
|
// with operating system. If the client is
|
|
// remotely connected some network information
|
|
// may also be present.
|
|
STDMETHOD(GetIdentity)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG IdentitySize
|
|
) PURE;
|
|
// Format is a printf-like format string
|
|
// with one %s where the identity string should go.
|
|
STDMETHOD(OutputIdentity)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags,
|
|
IN PCSTR Format
|
|
) PURE;
|
|
|
|
// Event callbacks allow a client to
|
|
// receive notification about changes
|
|
// during the debug session.
|
|
STDMETHOD(GetEventCallbacks)(
|
|
THIS_
|
|
OUT PDEBUG_EVENT_CALLBACKS* Callbacks
|
|
) PURE;
|
|
STDMETHOD(SetEventCallbacks)(
|
|
THIS_
|
|
IN PDEBUG_EVENT_CALLBACKS Callbacks
|
|
) PURE;
|
|
|
|
// The engine sometimes merges compatible callback
|
|
// requests to reduce callback overhead. This is
|
|
// most noticeable with output as small pieces of
|
|
// output are collected into larger groups to
|
|
// reduce the overall number of output callback calls.
|
|
// A client can use this method to force all pending
|
|
// callbacks to be delivered. This is rarely necessary.
|
|
STDMETHOD(FlushCallbacks)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugClient2.
|
|
|
|
// Functions similarly to WriteDumpFile with
|
|
// the addition of the ability to specify
|
|
// per-dump-format write control flags.
|
|
// Comment is not supported in all formats.
|
|
STDMETHOD(WriteDumpFile2)(
|
|
THIS_
|
|
IN PCSTR DumpFile,
|
|
IN ULONG Qualifier,
|
|
IN ULONG FormatFlags,
|
|
IN OPTIONAL PCSTR Comment
|
|
) PURE;
|
|
// Registers additional files of supporting information
|
|
// for a dump file open. This method must be called
|
|
// before OpenDumpFile is called.
|
|
// The files registered may be opened at the time
|
|
// this method is called but generally will not
|
|
// be used until OpenDumpFile is called.
|
|
STDMETHOD(AddDumpInformationFile)(
|
|
THIS_
|
|
IN PCSTR InfoFile,
|
|
IN ULONG Type
|
|
) PURE;
|
|
|
|
// Requests that the remote process server shut down.
|
|
STDMETHOD(EndProcessServer)(
|
|
THIS_
|
|
IN ULONG64 Server
|
|
) PURE;
|
|
// Waits for a started process server to
|
|
// exit. Allows an application running a
|
|
// process server to monitor the process
|
|
// server so that it can tell when a remote
|
|
// client has asked for it to exit.
|
|
// Returns S_OK if the process server has
|
|
// shut down and S_FALSE for a timeout.
|
|
STDMETHOD(WaitForProcessServerEnd)(
|
|
THIS_
|
|
IN ULONG Timeout
|
|
) PURE;
|
|
|
|
// Returns S_OK if the system is configured
|
|
// to allow kernel debugging.
|
|
STDMETHOD(IsKernelDebuggerEnabled)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// Attempts to terminate the current process.
|
|
// Exit process events for the process may be generated.
|
|
STDMETHOD(TerminateCurrentProcess)(
|
|
THIS
|
|
) PURE;
|
|
// Attempts to detach from the current process.
|
|
// This requires OS support for debugger detach.
|
|
STDMETHOD(DetachCurrentProcess)(
|
|
THIS
|
|
) PURE;
|
|
// Removes the process from the debuggers process
|
|
// list without making any other changes. The process
|
|
// will still be marked as being debugged and will
|
|
// not run. This allows a debugger to be shut down
|
|
// and a new debugger attached without taking the
|
|
// process out of the debugged state.
|
|
// This is only supported on some system versions.
|
|
STDMETHOD(AbandonCurrentProcess)(
|
|
THIS
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugControl.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Execution status codes used for waiting,
|
|
// for returning current status and for
|
|
// event method return values.
|
|
#define DEBUG_STATUS_NO_CHANGE 0
|
|
#define DEBUG_STATUS_GO 1
|
|
#define DEBUG_STATUS_GO_HANDLED 2
|
|
#define DEBUG_STATUS_GO_NOT_HANDLED 3
|
|
#define DEBUG_STATUS_STEP_OVER 4
|
|
#define DEBUG_STATUS_STEP_INTO 5
|
|
#define DEBUG_STATUS_BREAK 6
|
|
#define DEBUG_STATUS_NO_DEBUGGEE 7
|
|
#define DEBUG_STATUS_STEP_BRANCH 8
|
|
#define DEBUG_STATUS_IGNORE_EVENT 9
|
|
|
|
#define DEBUG_STATUS_MASK 0xf
|
|
|
|
// This bit is added in DEBUG_CES_EXECUTION_STATUS
|
|
// notifications when the engines execution status
|
|
// is changing due to operations performed during
|
|
// a wait, such as making synchronous callbacks. If
|
|
// the bit is not set the execution status is changing
|
|
// due to a wait being satisfied.
|
|
#define DEBUG_STATUS_INSIDE_WAIT 0x100000000
|
|
|
|
// Output control flags.
|
|
// Output generated by methods called by this
|
|
// client will be sent only to this clients
|
|
// output callbacks.
|
|
#define DEBUG_OUTCTL_THIS_CLIENT 0x00000000
|
|
// Output will be sent to all clients.
|
|
#define DEBUG_OUTCTL_ALL_CLIENTS 0x00000001
|
|
// Output will be sent to all clients except
|
|
// the client generating the output.
|
|
#define DEBUG_OUTCTL_ALL_OTHER_CLIENTS 0x00000002
|
|
// Output will be discarded immediately and will not
|
|
// be logged or sent to callbacks.
|
|
#define DEBUG_OUTCTL_IGNORE 0x00000003
|
|
// Output will be logged but not sent to callbacks.
|
|
#define DEBUG_OUTCTL_LOG_ONLY 0x00000004
|
|
// All send control bits.
|
|
#define DEBUG_OUTCTL_SEND_MASK 0x00000007
|
|
// Do not place output from this client in
|
|
// the global log file.
|
|
#define DEBUG_OUTCTL_NOT_LOGGED 0x00000008
|
|
// Send output to clients regardless of whether the
|
|
// mask allows it or not.
|
|
#define DEBUG_OUTCTL_OVERRIDE_MASK 0x00000010
|
|
|
|
// Special value which means leave the output settings
|
|
// unchanged.
|
|
#define DEBUG_OUTCTL_AMBIENT 0xffffffff
|
|
|
|
// Interrupt types.
|
|
// Force a break in if the debuggee is running.
|
|
#define DEBUG_INTERRUPT_ACTIVE 0
|
|
// Notify but do not force a break in.
|
|
#define DEBUG_INTERRUPT_PASSIVE 1
|
|
// Try and get the current engine operation to
|
|
// complete so that the engine will be available
|
|
// again. If no wait is active this is the same
|
|
// as a passive interrupt. If a wait is active
|
|
// this will try to cause the wait to fail without
|
|
// breaking in to the debuggee. There is
|
|
// no guarantee that issuing an exit interrupt
|
|
// will cause the engine to become available
|
|
// as not all operations are arbitrarily
|
|
// interruptible.
|
|
#define DEBUG_INTERRUPT_EXIT 2
|
|
|
|
// OutputCurrentState flags. These flags
|
|
// allow a particular type of information
|
|
// to be displayed but do not guarantee
|
|
// that it will be displayed. Other global
|
|
// settings may override these flags or
|
|
// the particular state may not be available.
|
|
// For example, source line information may
|
|
// not be present so source line information
|
|
// may not be displayed.
|
|
#define DEBUG_CURRENT_DEFAULT 0x0000000f
|
|
#define DEBUG_CURRENT_SYMBOL 0x00000001
|
|
#define DEBUG_CURRENT_DISASM 0x00000002
|
|
#define DEBUG_CURRENT_REGISTERS 0x00000004
|
|
#define DEBUG_CURRENT_SOURCE_LINE 0x00000008
|
|
|
|
// Disassemble flags.
|
|
// Compute the effective address from current register
|
|
// information and display it.
|
|
#define DEBUG_DISASM_EFFECTIVE_ADDRESS 0x00000001
|
|
// If the current disassembly offset has an exact
|
|
// symbol match output the symbol.
|
|
#define DEBUG_DISASM_MATCHING_SYMBOLS 0x00000002
|
|
|
|
// Code interpretation levels for stepping
|
|
// and other operations.
|
|
#define DEBUG_LEVEL_SOURCE 0
|
|
#define DEBUG_LEVEL_ASSEMBLY 1
|
|
|
|
// Engine control flags.
|
|
#define DEBUG_ENGOPT_IGNORE_DBGHELP_VERSION 0x00000001
|
|
#define DEBUG_ENGOPT_IGNORE_EXTENSION_VERSIONS 0x00000002
|
|
// If neither allow nor disallow is specified
|
|
// the engine will pick one based on what kind
|
|
// of debugging is going on.
|
|
#define DEBUG_ENGOPT_ALLOW_NETWORK_PATHS 0x00000004
|
|
#define DEBUG_ENGOPT_DISALLOW_NETWORK_PATHS 0x00000008
|
|
#define DEBUG_ENGOPT_NETWORK_PATHS (0x00000004 | 0x00000008)
|
|
// Ignore loader-generated first-chance exceptions.
|
|
#define DEBUG_ENGOPT_IGNORE_LOADER_EXCEPTIONS 0x00000010
|
|
// Break in on a debuggees initial event. In user-mode
|
|
// this will break at the initial system breakpoint
|
|
// for every created process. In kernel-mode it
|
|
// will attempt break in on the target at the first
|
|
// WaitForEvent.
|
|
#define DEBUG_ENGOPT_INITIAL_BREAK 0x00000020
|
|
// Break in on the first module load for a debuggee.
|
|
#define DEBUG_ENGOPT_INITIAL_MODULE_BREAK 0x00000040
|
|
// Break in on a debuggees final event. In user-mode
|
|
// this will break on process exit for every process.
|
|
// In kernel-mode it currently does nothing.
|
|
#define DEBUG_ENGOPT_FINAL_BREAK 0x00000080
|
|
// By default Execute will repeat the last command
|
|
// if it is given an empty string. The flags to
|
|
// Execute can override this behavior for a single
|
|
// command or this engine option can be used to
|
|
// change the default globally.
|
|
#define DEBUG_ENGOPT_NO_EXECUTE_REPEAT 0x00000100
|
|
// Disable places in the engine that have fallback
|
|
// code when presented with incomplete information.
|
|
// 1. Fails minidump module loads unless matching
|
|
// executables can be mapped.
|
|
#define DEBUG_ENGOPT_FAIL_INCOMPLETE_INFORMATION 0x00000200
|
|
// Allow the debugger to manipulate page protections
|
|
// in order to insert code breakpoints on pages that
|
|
// do not have write access. This option is not on
|
|
// by default as it allows breakpoints to be set
|
|
// in potentially hazardous memory areas.
|
|
#define DEBUG_ENGOPT_ALLOW_READ_ONLY_BREAKPOINTS 0x00000400
|
|
// When using a software (bp/bu) breakpoint in code
|
|
// that will be executed by multiple threads it is
|
|
// possible for breakpoint management to cause the
|
|
// breakpoint to be missed or for spurious single-step
|
|
// exceptions to be generated. This flag suspends
|
|
// all but the active thread when doing breakpoint
|
|
// management and thereby avoids multithreading
|
|
// problems. Care must be taken when using it, though,
|
|
// as the suspension of threads can cause deadlocks
|
|
// if the suspended threads are holding resources that
|
|
// the active thread needs. Additionally, there
|
|
// are still rare situations where problems may
|
|
// occur, but setting this flag corrects nearly
|
|
// all multithreading issues with software breakpoints.
|
|
// Thread-restricted stepping and execution supersedes
|
|
// this flags effect.
|
|
// This flag is ignored in kernel sessions as there
|
|
// is no way to restrict processor execution.
|
|
#define DEBUG_ENGOPT_SYNCHRONIZE_BREAKPOINTS 0x00000800
|
|
// Disallows executing shell commands through the
|
|
// engine with .shell (!!).
|
|
#define DEBUG_ENGOPT_DISALLOW_SHELL_COMMANDS 0x00001000
|
|
#define DEBUG_ENGOPT_ALL 0x00001FFF
|
|
|
|
// General unspecified ID constant.
|
|
#define DEBUG_ANY_ID 0xffffffff
|
|
|
|
typedef struct _DEBUG_STACK_FRAME
|
|
{
|
|
ULONG64 InstructionOffset;
|
|
ULONG64 ReturnOffset;
|
|
ULONG64 FrameOffset;
|
|
ULONG64 StackOffset;
|
|
ULONG64 FuncTableEntry;
|
|
ULONG64 Params[4];
|
|
ULONG64 Reserved[6];
|
|
BOOL Virtual;
|
|
ULONG FrameNumber;
|
|
} DEBUG_STACK_FRAME, *PDEBUG_STACK_FRAME;
|
|
|
|
// OutputStackTrace flags.
|
|
// Display a small number of arguments for each call.
|
|
// These may or may not be the actual arguments depending
|
|
// on the architecture, particular function and
|
|
// point during the execution of the function.
|
|
// If the current code level is assembly arguments
|
|
// are dumped as hex values. If the code level is
|
|
// source the engine attempts to provide symbolic
|
|
// argument information.
|
|
#define DEBUG_STACK_ARGUMENTS 0x00000001
|
|
// Displays information about the functions
|
|
// frame such as __stdcall arguments, FPO
|
|
// information and whatever else is available.
|
|
#define DEBUG_STACK_FUNCTION_INFO 0x00000002
|
|
// Displays source line information for each
|
|
// frame of the stack trace.
|
|
#define DEBUG_STACK_SOURCE_LINE 0x00000004
|
|
// Show return, previous frame and other relevant address
|
|
// values for each frame.
|
|
#define DEBUG_STACK_FRAME_ADDRESSES 0x00000008
|
|
// Show column names.
|
|
#define DEBUG_STACK_COLUMN_NAMES 0x00000010
|
|
// Show non-volatile register context for each
|
|
// frame. This is only meaningful for some platforms.
|
|
#define DEBUG_STACK_NONVOLATILE_REGISTERS 0x00000020
|
|
// Show frame numbers
|
|
#define DEBUG_STACK_FRAME_NUMBERS 0x00000040
|
|
// Show parameters with type name
|
|
#define DEBUG_STACK_PARAMETERS 0x00000080
|
|
// Show just return address in stack frame addresses
|
|
#define DEBUG_STACK_FRAME_ADDRESSES_RA_ONLY 0x00000100
|
|
|
|
// Classes of debuggee. Each class
|
|
// has different qualifiers for specific
|
|
// kinds of debuggees.
|
|
#define DEBUG_CLASS_UNINITIALIZED 0
|
|
#define DEBUG_CLASS_KERNEL 1
|
|
#define DEBUG_CLASS_USER_WINDOWS 2
|
|
|
|
// Generic dump types. These can be used
|
|
// with either user or kernel sessions.
|
|
// Session-type-specific aliases are also
|
|
// provided.
|
|
#define DEBUG_DUMP_SMALL 1024
|
|
#define DEBUG_DUMP_DEFAULT 1025
|
|
#define DEBUG_DUMP_FULL 1026
|
|
|
|
// Specific types of kernel debuggees.
|
|
#define DEBUG_KERNEL_CONNECTION 0
|
|
#define DEBUG_KERNEL_LOCAL 1
|
|
#define DEBUG_KERNEL_EXDI_DRIVER 2
|
|
#define DEBUG_KERNEL_SMALL_DUMP DEBUG_DUMP_SMALL
|
|
#define DEBUG_KERNEL_DUMP DEBUG_DUMP_DEFAULT
|
|
#define DEBUG_KERNEL_FULL_DUMP DEBUG_DUMP_FULL
|
|
|
|
// Specific types of Windows user debuggees.
|
|
#define DEBUG_USER_WINDOWS_PROCESS 0
|
|
#define DEBUG_USER_WINDOWS_PROCESS_SERVER 1
|
|
#define DEBUG_USER_WINDOWS_SMALL_DUMP DEBUG_DUMP_SMALL
|
|
#define DEBUG_USER_WINDOWS_DUMP DEBUG_DUMP_DEFAULT
|
|
|
|
// Extension flags.
|
|
#define DEBUG_EXTENSION_AT_ENGINE 0x00000000
|
|
|
|
// Execute and ExecuteCommandFile flags.
|
|
// These flags only apply to the command
|
|
// text itself; output from the executed
|
|
// command is controlled by the output
|
|
// control parameter.
|
|
// Default execution. Command is logged
|
|
// but not output.
|
|
#define DEBUG_EXECUTE_DEFAULT 0x00000000
|
|
// Echo commands during execution. In
|
|
// ExecuteCommandFile also echoes the prompt
|
|
// for each line of the file.
|
|
#define DEBUG_EXECUTE_ECHO 0x00000001
|
|
// Do not log or output commands during execution.
|
|
// Overridden by DEBUG_EXECUTE_ECHO.
|
|
#define DEBUG_EXECUTE_NOT_LOGGED 0x00000002
|
|
// If this flag is not set an empty string
|
|
// to Execute will repeat the last Execute
|
|
// string.
|
|
#define DEBUG_EXECUTE_NO_REPEAT 0x00000004
|
|
|
|
// Specific event filter types. Some event
|
|
// filters have optional arguments to further
|
|
// qualify their operation.
|
|
#define DEBUG_FILTER_CREATE_THREAD 0x00000000
|
|
#define DEBUG_FILTER_EXIT_THREAD 0x00000001
|
|
#define DEBUG_FILTER_CREATE_PROCESS 0x00000002
|
|
#define DEBUG_FILTER_EXIT_PROCESS 0x00000003
|
|
// Argument is the name of a module to break on.
|
|
#define DEBUG_FILTER_LOAD_MODULE 0x00000004
|
|
// Argument is the base address of a specific module to break on.
|
|
#define DEBUG_FILTER_UNLOAD_MODULE 0x00000005
|
|
#define DEBUG_FILTER_SYSTEM_ERROR 0x00000006
|
|
// Initial breakpoint and initial module load are one-shot
|
|
// events that are triggered at the appropriate points in
|
|
// the beginning of a session. Their commands are executed
|
|
// and then further processing is controlled by the normal
|
|
// exception and load module filters.
|
|
#define DEBUG_FILTER_INITIAL_BREAKPOINT 0x00000007
|
|
#define DEBUG_FILTER_INITIAL_MODULE_LOAD 0x00000008
|
|
// The debug output filter allows the debugger to stop
|
|
// when output is produced so that the code causing
|
|
// output can be tracked down or synchronized with.
|
|
// This filter is not supported for live dual-machine
|
|
// kernel debugging.
|
|
#define DEBUG_FILTER_DEBUGGEE_OUTPUT 0x00000009
|
|
|
|
// Event filter execution options.
|
|
// Break in always.
|
|
#define DEBUG_FILTER_BREAK 0x00000000
|
|
// Break in on second-chance exceptions. For events
|
|
// that are not exceptions this is the same as BREAK.
|
|
#define DEBUG_FILTER_SECOND_CHANCE_BREAK 0x00000001
|
|
// Output a message about the event but continue.
|
|
#define DEBUG_FILTER_OUTPUT 0x00000002
|
|
// Continue the event.
|
|
#define DEBUG_FILTER_IGNORE 0x00000003
|
|
// Used to remove general exception filters.
|
|
#define DEBUG_FILTER_REMOVE 0x00000004
|
|
|
|
// Event filter continuation options. These options are
|
|
// only used when DEBUG_STATUS_GO is used to continue
|
|
// execution. If a specific go status such as
|
|
// DEBUG_STATUS_GO_NOT_HANDLED is used it controls
|
|
// the continuation.
|
|
#define DEBUG_FILTER_GO_HANDLED 0x00000000
|
|
#define DEBUG_FILTER_GO_NOT_HANDLED 0x00000001
|
|
|
|
// Specific event filter settings.
|
|
typedef struct _DEBUG_SPECIFIC_FILTER_PARAMETERS
|
|
{
|
|
ULONG ExecutionOption;
|
|
ULONG ContinueOption;
|
|
ULONG TextSize;
|
|
ULONG CommandSize;
|
|
// If ArgumentSize is zero this filter does
|
|
// not have an argument. An empty argument for
|
|
// a filter which does have an argument will take
|
|
// one byte for the terminator.
|
|
ULONG ArgumentSize;
|
|
} DEBUG_SPECIFIC_FILTER_PARAMETERS, *PDEBUG_SPECIFIC_FILTER_PARAMETERS;
|
|
|
|
// Exception event filter settings.
|
|
typedef struct _DEBUG_EXCEPTION_FILTER_PARAMETERS
|
|
{
|
|
ULONG ExecutionOption;
|
|
ULONG ContinueOption;
|
|
ULONG TextSize;
|
|
ULONG CommandSize;
|
|
ULONG SecondCommandSize;
|
|
ULONG ExceptionCode;
|
|
} DEBUG_EXCEPTION_FILTER_PARAMETERS, *PDEBUG_EXCEPTION_FILTER_PARAMETERS;
|
|
|
|
// Wait flags.
|
|
#define DEBUG_WAIT_DEFAULT 0x00000000
|
|
|
|
// Last event information structures.
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_BREAKPOINT
|
|
{
|
|
ULONG Id;
|
|
} DEBUG_LAST_EVENT_INFO_BREAKPOINT, *PDEBUG_LAST_EVENT_INFO_BREAKPOINT;
|
|
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_EXCEPTION
|
|
{
|
|
EXCEPTION_RECORD64 ExceptionRecord;
|
|
ULONG FirstChance;
|
|
} DEBUG_LAST_EVENT_INFO_EXCEPTION, *PDEBUG_LAST_EVENT_INFO_EXCEPTION;
|
|
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_EXIT_THREAD
|
|
{
|
|
ULONG ExitCode;
|
|
} DEBUG_LAST_EVENT_INFO_EXIT_THREAD, *PDEBUG_LAST_EVENT_INFO_EXIT_THREAD;
|
|
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_EXIT_PROCESS
|
|
{
|
|
ULONG ExitCode;
|
|
} DEBUG_LAST_EVENT_INFO_EXIT_PROCESS, *PDEBUG_LAST_EVENT_INFO_EXIT_PROCESS;
|
|
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_LOAD_MODULE
|
|
{
|
|
ULONG64 Base;
|
|
} DEBUG_LAST_EVENT_INFO_LOAD_MODULE, *PDEBUG_LAST_EVENT_INFO_LOAD_MODULE;
|
|
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_UNLOAD_MODULE
|
|
{
|
|
ULONG64 Base;
|
|
} DEBUG_LAST_EVENT_INFO_UNLOAD_MODULE, *PDEBUG_LAST_EVENT_INFO_UNLOAD_MODULE;
|
|
|
|
typedef struct _DEBUG_LAST_EVENT_INFO_SYSTEM_ERROR
|
|
{
|
|
ULONG Error;
|
|
ULONG Level;
|
|
} DEBUG_LAST_EVENT_INFO_SYSTEM_ERROR, *PDEBUG_LAST_EVENT_INFO_SYSTEM_ERROR;
|
|
|
|
// DEBUG_VALUE types.
|
|
#define DEBUG_VALUE_INVALID 0
|
|
#define DEBUG_VALUE_INT8 1
|
|
#define DEBUG_VALUE_INT16 2
|
|
#define DEBUG_VALUE_INT32 3
|
|
#define DEBUG_VALUE_INT64 4
|
|
#define DEBUG_VALUE_FLOAT32 5
|
|
#define DEBUG_VALUE_FLOAT64 6
|
|
#define DEBUG_VALUE_FLOAT80 7
|
|
#define DEBUG_VALUE_FLOAT82 8
|
|
#define DEBUG_VALUE_FLOAT128 9
|
|
#define DEBUG_VALUE_VECTOR64 10
|
|
#define DEBUG_VALUE_VECTOR128 11
|
|
// Count of type indices.
|
|
#define DEBUG_VALUE_TYPES 12
|
|
|
|
#if defined(_MSC_VER)
|
|
#if _MSC_VER >= 800
|
|
#if _MSC_VER >= 1200
|
|
#pragma warning(push)
|
|
#endif
|
|
#pragma warning(disable:4201) /* Nameless struct/union */
|
|
#endif
|
|
#endif
|
|
|
|
// Force the compiler to align DEBUG_VALUE.Type on a four-byte
|
|
// boundary so that it comes out to 32 bytes total.
|
|
#include <pshpack4.h>
|
|
|
|
typedef struct _DEBUG_VALUE
|
|
{
|
|
union
|
|
{
|
|
UCHAR I8;
|
|
USHORT I16;
|
|
ULONG I32;
|
|
struct
|
|
{
|
|
// Extra NAT indicator for IA64
|
|
// integer registers. NAT will
|
|
// always be false for other CPUs.
|
|
ULONG64 I64;
|
|
BOOL Nat;
|
|
};
|
|
float F32;
|
|
double F64;
|
|
UCHAR F80Bytes[10];
|
|
UCHAR F82Bytes[11];
|
|
UCHAR F128Bytes[16];
|
|
// Vector interpretations. The actual number
|
|
// of valid elements depends on the vector length.
|
|
UCHAR VI8[16];
|
|
USHORT VI16[8];
|
|
ULONG VI32[4];
|
|
ULONG64 VI64[2];
|
|
float VF32[4];
|
|
double VF64[2];
|
|
struct
|
|
{
|
|
ULONG LowPart;
|
|
ULONG HighPart;
|
|
} I64Parts32;
|
|
struct
|
|
{
|
|
ULONG64 LowPart;
|
|
LONG64 HighPart;
|
|
} F128Parts64;
|
|
// Allows raw byte access to content. Array
|
|
// can be indexed for as much data as Type
|
|
// describes. This array also serves to pad
|
|
// the structure out to 32 bytes and reserves
|
|
// space for future members.
|
|
UCHAR RawBytes[28];
|
|
};
|
|
ULONG Type;
|
|
} DEBUG_VALUE, *PDEBUG_VALUE;
|
|
|
|
#include <poppack.h>
|
|
|
|
#if defined(_MSC_VER)
|
|
#if _MSC_VER >= 800
|
|
#if _MSC_VER >= 1200
|
|
#pragma warning(pop)
|
|
#else
|
|
#pragma warning(disable:4201) /* Nameless struct/union */
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugControl
|
|
DECLARE_INTERFACE_(IDebugControl, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugControl.
|
|
|
|
// Checks for a user interrupt, such a Ctrl-C
|
|
// or stop button.
|
|
// This method is reentrant.
|
|
STDMETHOD(GetInterrupt)(
|
|
THIS
|
|
) PURE;
|
|
// Registers a user interrupt.
|
|
// This method is reentrant.
|
|
STDMETHOD(SetInterrupt)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// Interrupting a user-mode process requires
|
|
// access to some system resources that the
|
|
// process may hold itself, preventing the
|
|
// interrupt from occurring. The engine
|
|
// will time-out pending interrupt requests
|
|
// and simulate an interrupt if necessary.
|
|
// These methods control the interrupt timeout.
|
|
STDMETHOD(GetInterruptTimeout)(
|
|
THIS_
|
|
OUT PULONG Seconds
|
|
) PURE;
|
|
STDMETHOD(SetInterruptTimeout)(
|
|
THIS_
|
|
IN ULONG Seconds
|
|
) PURE;
|
|
|
|
STDMETHOD(GetLogFile)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG FileSize,
|
|
OUT PBOOL Append
|
|
) PURE;
|
|
// Opens a log file which collects all
|
|
// output. Output from every client except
|
|
// those that explicitly disable logging
|
|
// goes into the log.
|
|
// Opening a log file closes any log file
|
|
// already open.
|
|
STDMETHOD(OpenLogFile)(
|
|
THIS_
|
|
IN PCSTR File,
|
|
IN BOOL Append
|
|
) PURE;
|
|
STDMETHOD(CloseLogFile)(
|
|
THIS
|
|
) PURE;
|
|
// Controls what output is logged.
|
|
STDMETHOD(GetLogMask)(
|
|
THIS_
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
STDMETHOD(SetLogMask)(
|
|
THIS_
|
|
IN ULONG Mask
|
|
) PURE;
|
|
|
|
// Input requests input from all clients.
|
|
// The first input that is returned is used
|
|
// to satisfy the call. Other returned
|
|
// input is discarded.
|
|
STDMETHOD(Input)(
|
|
THIS_
|
|
OUT PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG InputSize
|
|
) PURE;
|
|
// This method is used by clients to return
|
|
// input when it is available. It will
|
|
// return S_OK if the input is used to
|
|
// satisfy an Input call and S_FALSE if
|
|
// the input is ignored.
|
|
// This method is reentrant.
|
|
STDMETHOD(ReturnInput)(
|
|
THIS_
|
|
IN PCSTR Buffer
|
|
) PURE;
|
|
|
|
// Sends output through clients
|
|
// output callbacks if the mask is allowed
|
|
// by the current output control mask and
|
|
// according to the output distribution
|
|
// settings.
|
|
STDMETHODV(Output)(
|
|
THIS_
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
...
|
|
) PURE;
|
|
STDMETHOD(OutputVaList)(
|
|
THIS_
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
IN va_list Args
|
|
) PURE;
|
|
// The following methods allow direct control
|
|
// over the distribution of the given output
|
|
// for situations where something other than
|
|
// the default is desired. These methods require
|
|
// extra work in the engine so they should
|
|
// only be used when necessary.
|
|
STDMETHODV(ControlledOutput)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
...
|
|
) PURE;
|
|
STDMETHOD(ControlledOutputVaList)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
IN va_list Args
|
|
) PURE;
|
|
|
|
// Displays the standard command-line prompt
|
|
// followed by the given output. If Format
|
|
// is NULL no additional output is produced.
|
|
// Output is produced under the
|
|
// DEBUG_OUTPUT_PROMPT mask.
|
|
// This method only outputs the prompt; it
|
|
// does not get input.
|
|
STDMETHODV(OutputPrompt)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN OPTIONAL PCSTR Format,
|
|
...
|
|
) PURE;
|
|
STDMETHOD(OutputPromptVaList)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN OPTIONAL PCSTR Format,
|
|
IN va_list Args
|
|
) PURE;
|
|
// Gets the text that would be displayed by OutputPrompt.
|
|
STDMETHOD(GetPromptText)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG TextSize
|
|
) PURE;
|
|
// Outputs information about the current
|
|
// debuggee state such as a register
|
|
// summary, disassembly at the current PC,
|
|
// closest symbol and others.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputCurrentState)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Outputs the debugger and extension version
|
|
// information. This method is reentrant.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputVersionInformation)(
|
|
THIS_
|
|
IN ULONG OutputControl
|
|
) PURE;
|
|
|
|
// In user-mode debugging sessions the
|
|
// engine will set an event when
|
|
// exceptions are continued. This can
|
|
// be used to synchronize other processes
|
|
// with the debuggers handling of events.
|
|
// For example, this is used to support
|
|
// the e argument to ntsd.
|
|
STDMETHOD(GetNotifyEventHandle)(
|
|
THIS_
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
STDMETHOD(SetNotifyEventHandle)(
|
|
THIS_
|
|
IN ULONG64 Handle
|
|
) PURE;
|
|
|
|
STDMETHOD(Assemble)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PCSTR Instr,
|
|
OUT PULONG64 EndOffset
|
|
) PURE;
|
|
STDMETHOD(Disassemble)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DisassemblySize,
|
|
OUT PULONG64 EndOffset
|
|
) PURE;
|
|
// Returns the value of the effective address
|
|
// computed for the last Disassemble, if there
|
|
// was one.
|
|
STDMETHOD(GetDisassembleEffectiveOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Uses the line prefix if necessary.
|
|
STDMETHOD(OutputDisassembly)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG64 Offset,
|
|
IN ULONG Flags,
|
|
OUT PULONG64 EndOffset
|
|
) PURE;
|
|
// Produces multiple lines of disassembly output.
|
|
// There will be PreviousLines of disassembly before
|
|
// the given offset if a valid disassembly exists.
|
|
// In all, there will be TotalLines of output produced.
|
|
// The first and last line offsets are returned
|
|
// specially and all lines offsets can be retrieved
|
|
// through LineOffsets. LineOffsets will contain
|
|
// offsets for each line where disassembly started.
|
|
// When disassembly of a single instruction takes
|
|
// multiple lines the initial offset will be followed
|
|
// by DEBUG_INVALID_OFFSET.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputDisassemblyLines)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG PreviousLines,
|
|
IN ULONG TotalLines,
|
|
IN ULONG64 Offset,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PULONG OffsetLine,
|
|
OUT OPTIONAL PULONG64 StartOffset,
|
|
OUT OPTIONAL PULONG64 EndOffset,
|
|
OUT OPTIONAL /* size_is(TotalLines) */ PULONG64 LineOffsets
|
|
) PURE;
|
|
// Returns the offset of the start of
|
|
// the instruction thats the given
|
|
// delta away from the instruction
|
|
// at the initial offset.
|
|
// This routine does not check for
|
|
// validity of the instruction or
|
|
// the memory containing it.
|
|
STDMETHOD(GetNearInstruction)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN LONG Delta,
|
|
OUT PULONG64 NearOffset
|
|
) PURE;
|
|
|
|
// Offsets can be passed in as zero to use the current
|
|
// thread state.
|
|
STDMETHOD(GetStackTrace)(
|
|
THIS_
|
|
IN ULONG64 FrameOffset,
|
|
IN ULONG64 StackOffset,
|
|
IN ULONG64 InstructionOffset,
|
|
OUT /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
|
|
IN ULONG FramesSize,
|
|
OUT OPTIONAL PULONG FramesFilled
|
|
) PURE;
|
|
// Does a simple stack trace to determine
|
|
// what the current return address is.
|
|
STDMETHOD(GetReturnOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// If Frames is NULL OutputStackTrace will
|
|
// use GetStackTrace to get FramesSize frames
|
|
// and then output them. The current register
|
|
// values for frame, stack and instruction offsets
|
|
// are used.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputStackTrace)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN OPTIONAL /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
|
|
IN ULONG FramesSize,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Returns information about the debuggee such
|
|
// as user vs. kernel, dump vs. live, etc.
|
|
STDMETHOD(GetDebuggeeType)(
|
|
THIS_
|
|
OUT PULONG Class,
|
|
OUT PULONG Qualifier
|
|
) PURE;
|
|
// Returns the type of physical processors in
|
|
// the machine.
|
|
// Returns one of the IMAGE_FILE_MACHINE values.
|
|
STDMETHOD(GetActualProcessorType)(
|
|
THIS_
|
|
OUT PULONG Type
|
|
) PURE;
|
|
// Returns the type of processor used in the
|
|
// current processor context.
|
|
STDMETHOD(GetExecutingProcessorType)(
|
|
THIS_
|
|
OUT PULONG Type
|
|
) PURE;
|
|
// Query all the possible processor types that
|
|
// may be encountered during this debug session.
|
|
STDMETHOD(GetNumberPossibleExecutingProcessorTypes)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetPossibleExecutingProcessorTypes)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PULONG Types
|
|
) PURE;
|
|
// Get the number of actual processors in
|
|
// the machine.
|
|
STDMETHOD(GetNumberProcessors)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
// PlatformId is one of the VER_PLATFORM values.
|
|
// Major and minor are as given in the NT
|
|
// kernel debugger protocol.
|
|
// ServicePackString and ServicePackNumber indicate the
|
|
// system service pack level. ServicePackNumber is not
|
|
// available in some sessions where the service pack level
|
|
// is only expressed as a string. The service pack information
|
|
// will be empty if the system does not have a service pack
|
|
// applied.
|
|
// The build string is string information identifying the
|
|
// particular build of the system. The build string is
|
|
// empty if the system has no particular identifying
|
|
// information.
|
|
STDMETHOD(GetSystemVersion)(
|
|
THIS_
|
|
OUT PULONG PlatformId,
|
|
OUT PULONG Major,
|
|
OUT PULONG Minor,
|
|
OUT OPTIONAL PSTR ServicePackString,
|
|
IN ULONG ServicePackStringSize,
|
|
OUT OPTIONAL PULONG ServicePackStringUsed,
|
|
OUT PULONG ServicePackNumber,
|
|
OUT OPTIONAL PSTR BuildString,
|
|
IN ULONG BuildStringSize,
|
|
OUT OPTIONAL PULONG BuildStringUsed
|
|
) PURE;
|
|
// Returns the page size for the currently executing
|
|
// processor context. The page size may vary between
|
|
// processor types.
|
|
STDMETHOD(GetPageSize)(
|
|
THIS_
|
|
OUT PULONG Size
|
|
) PURE;
|
|
// Returns S_OK if the current processor context uses
|
|
// 64-bit addresses, otherwise S_FALSE.
|
|
STDMETHOD(IsPointer64Bit)(
|
|
THIS
|
|
) PURE;
|
|
// Reads the bugcheck data area and returns the
|
|
// current contents. This method only works
|
|
// in kernel debugging sessions.
|
|
STDMETHOD(ReadBugCheckData)(
|
|
THIS_
|
|
OUT PULONG Code,
|
|
OUT PULONG64 Arg1,
|
|
OUT PULONG64 Arg2,
|
|
OUT PULONG64 Arg3,
|
|
OUT PULONG64 Arg4
|
|
) PURE;
|
|
|
|
// Query all the processor types supported by
|
|
// the engine. This is a complete list and is
|
|
// not related to the machine running the engine
|
|
// or the debuggee.
|
|
STDMETHOD(GetNumberSupportedProcessorTypes)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetSupportedProcessorTypes)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PULONG Types
|
|
) PURE;
|
|
// Returns a full, descriptive name and an
|
|
// abbreviated name for a processor type.
|
|
STDMETHOD(GetProcessorTypeNames)(
|
|
THIS_
|
|
IN ULONG Type,
|
|
OUT OPTIONAL PSTR FullNameBuffer,
|
|
IN ULONG FullNameBufferSize,
|
|
OUT OPTIONAL PULONG FullNameSize,
|
|
OUT OPTIONAL PSTR AbbrevNameBuffer,
|
|
IN ULONG AbbrevNameBufferSize,
|
|
OUT OPTIONAL PULONG AbbrevNameSize
|
|
) PURE;
|
|
|
|
// Gets and sets the type of processor to
|
|
// use when doing things like setting
|
|
// breakpoints, accessing registers,
|
|
// getting stack traces and so on.
|
|
STDMETHOD(GetEffectiveProcessorType)(
|
|
THIS_
|
|
OUT PULONG Type
|
|
) PURE;
|
|
STDMETHOD(SetEffectiveProcessorType)(
|
|
THIS_
|
|
IN ULONG Type
|
|
) PURE;
|
|
|
|
// Returns information about whether and how
|
|
// the debuggee is running. Status will
|
|
// be GO if the debuggee is running and
|
|
// BREAK if it isnt.
|
|
// If no debuggee exists the status is
|
|
// NO_DEBUGGEE.
|
|
// This method is reentrant.
|
|
STDMETHOD(GetExecutionStatus)(
|
|
THIS_
|
|
OUT PULONG Status
|
|
) PURE;
|
|
// Changes the execution status of the
|
|
// engine from stopped to running.
|
|
// Status must be one of the go or step
|
|
// status values.
|
|
STDMETHOD(SetExecutionStatus)(
|
|
THIS_
|
|
IN ULONG Status
|
|
) PURE;
|
|
|
|
// Controls what code interpretation level the debugger
|
|
// runs at. The debugger checks the code level when
|
|
// deciding whether to step by a source line or
|
|
// assembly instruction along with other related operations.
|
|
STDMETHOD(GetCodeLevel)(
|
|
THIS_
|
|
OUT PULONG Level
|
|
) PURE;
|
|
STDMETHOD(SetCodeLevel)(
|
|
THIS_
|
|
IN ULONG Level
|
|
) PURE;
|
|
|
|
// Gets and sets engine control flags.
|
|
// These methods are reentrant.
|
|
STDMETHOD(GetEngineOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddEngineOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveEngineOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetEngineOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
|
|
// Gets and sets control values for
|
|
// handling system error events.
|
|
// If the system error level is less
|
|
// than or equal to the given levels
|
|
// the error may be displayed and
|
|
// the default break for the event
|
|
// may be set.
|
|
STDMETHOD(GetSystemErrorControl)(
|
|
THIS_
|
|
OUT PULONG OutputLevel,
|
|
OUT PULONG BreakLevel
|
|
) PURE;
|
|
STDMETHOD(SetSystemErrorControl)(
|
|
THIS_
|
|
IN ULONG OutputLevel,
|
|
IN ULONG BreakLevel
|
|
) PURE;
|
|
|
|
// The command processor supports simple
|
|
// string replacement macros in Evaluate and
|
|
// Execute. There are currently ten macro
|
|
// slots available. Slots 0-9 map to
|
|
// the command invocations $u0-$u9.
|
|
STDMETHOD(GetTextMacro)(
|
|
THIS_
|
|
IN ULONG Slot,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG MacroSize
|
|
) PURE;
|
|
STDMETHOD(SetTextMacro)(
|
|
THIS_
|
|
IN ULONG Slot,
|
|
IN PCSTR Macro
|
|
) PURE;
|
|
|
|
// Controls the default number radix used
|
|
// in expressions and commands.
|
|
STDMETHOD(GetRadix)(
|
|
THIS_
|
|
OUT PULONG Radix
|
|
) PURE;
|
|
STDMETHOD(SetRadix)(
|
|
THIS_
|
|
IN ULONG Radix
|
|
) PURE;
|
|
|
|
// Evaluates the given expression string and
|
|
// returns the resulting value.
|
|
// If DesiredType is DEBUG_VALUE_INVALID then
|
|
// the natural type is used.
|
|
// RemainderIndex, if provided, is set to the index
|
|
// of the first character in the input string that was
|
|
// not used when evaluating the expression.
|
|
STDMETHOD(Evaluate)(
|
|
THIS_
|
|
IN PCSTR Expression,
|
|
IN ULONG DesiredType,
|
|
OUT PDEBUG_VALUE Value,
|
|
OUT OPTIONAL PULONG RemainderIndex
|
|
) PURE;
|
|
// Attempts to convert the input value to a value
|
|
// of the requested type in the output value.
|
|
// Conversions can fail if no conversion exists.
|
|
// Successful conversions may be lossy.
|
|
STDMETHOD(CoerceValue)(
|
|
THIS_
|
|
IN PDEBUG_VALUE In,
|
|
IN ULONG OutType,
|
|
OUT PDEBUG_VALUE Out
|
|
) PURE;
|
|
STDMETHOD(CoerceValues)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN /* size_is(Count) */ PDEBUG_VALUE In,
|
|
IN /* size_is(Count) */ PULONG OutTypes,
|
|
OUT /* size_is(Count) */ PDEBUG_VALUE Out
|
|
) PURE;
|
|
|
|
// Executes the given command string.
|
|
// If the string has multiple commands
|
|
// Execute will not return until all
|
|
// of them have been executed. If this
|
|
// requires waiting for the debuggee to
|
|
// execute an internal wait will be done
|
|
// so Execute can take an arbitrary amount
|
|
// of time.
|
|
STDMETHOD(Execute)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN PCSTR Command,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// Executes the given command file by
|
|
// reading a line at a time and processing
|
|
// it with Execute.
|
|
STDMETHOD(ExecuteCommandFile)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN PCSTR CommandFile,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Breakpoint interfaces are described
|
|
// elsewhere in this section.
|
|
STDMETHOD(GetNumberBreakpoints)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
// It is possible for this retrieval function to
|
|
// fail even with an index within the number of
|
|
// existing breakpoints if the breakpoint is
|
|
// a private breakpoint.
|
|
STDMETHOD(GetBreakpointByIndex)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT PDEBUG_BREAKPOINT* Bp
|
|
) PURE;
|
|
STDMETHOD(GetBreakpointById)(
|
|
THIS_
|
|
IN ULONG Id,
|
|
OUT PDEBUG_BREAKPOINT* Bp
|
|
) PURE;
|
|
// If Ids is non-NULL the Count breakpoints
|
|
// referred to in the Ids array are returned,
|
|
// otherwise breakpoints from index Start to
|
|
// Start + Count 1 are returned.
|
|
STDMETHOD(GetBreakpointParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_BREAKPOINT_PARAMETERS Params
|
|
) PURE;
|
|
// Breakpoints are created empty and disabled.
|
|
// When their parameters have been set they
|
|
// should be enabled by setting the ENABLE flag.
|
|
// If DesiredId is DEBUG_ANY_ID then the
|
|
// engine picks an unused ID. If DesiredId
|
|
// is any other number the engine attempts
|
|
// to use the given ID for the breakpoint.
|
|
// If another breakpoint exists with that ID
|
|
// the call will fail.
|
|
STDMETHOD(AddBreakpoint)(
|
|
THIS_
|
|
IN ULONG Type,
|
|
IN ULONG DesiredId,
|
|
OUT PDEBUG_BREAKPOINT* Bp
|
|
) PURE;
|
|
// Breakpoint interface is invalid after this call.
|
|
STDMETHOD(RemoveBreakpoint)(
|
|
THIS_
|
|
IN PDEBUG_BREAKPOINT Bp
|
|
) PURE;
|
|
|
|
// Control and use extension DLLs.
|
|
STDMETHOD(AddExtension)(
|
|
THIS_
|
|
IN PCSTR Path,
|
|
IN ULONG Flags,
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
STDMETHOD(RemoveExtension)(
|
|
THIS_
|
|
IN ULONG64 Handle
|
|
) PURE;
|
|
STDMETHOD(GetExtensionByPath)(
|
|
THIS_
|
|
IN PCSTR Path,
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// If Handle is zero the extension
|
|
// chain is walked searching for the
|
|
// function.
|
|
STDMETHOD(CallExtension)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN PCSTR Function,
|
|
IN OPTIONAL PCSTR Arguments
|
|
) PURE;
|
|
// GetExtensionFunction works like
|
|
// GetProcAddress on extension DLLs
|
|
// to allow raw function-call-level
|
|
// interaction with extension DLLs.
|
|
// Such functions do not need to
|
|
// follow the standard extension prototype
|
|
// if they are not going to be called
|
|
// through the text extension interface.
|
|
// _EFN_ is automatically prepended to
|
|
// the name string given.
|
|
// This function cannot be called remotely.
|
|
STDMETHOD(GetExtensionFunction)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN PCSTR FuncName,
|
|
OUT FARPROC* Function
|
|
) PURE;
|
|
// These methods return alternate
|
|
// extension interfaces in order to allow
|
|
// interface-style extension DLLs to mix in
|
|
// older extension calls.
|
|
// Structure sizes must be initialized before
|
|
// the call.
|
|
// These methods cannot be called remotely.
|
|
STDMETHOD(GetWindbgExtensionApis32)(
|
|
THIS_
|
|
IN OUT PWINDBG_EXTENSION_APIS32 Api
|
|
) PURE;
|
|
STDMETHOD(GetWindbgExtensionApis64)(
|
|
THIS_
|
|
IN OUT PWINDBG_EXTENSION_APIS64 Api
|
|
) PURE;
|
|
|
|
// The engine provides a simple mechanism
|
|
// to filter common events. Arbitrarily complicated
|
|
// filtering can be done by registering event callbacks
|
|
// but simple event filtering only requires
|
|
// setting the options of one of the predefined
|
|
// event filters.
|
|
// Simple event filters are either for specific
|
|
// events and therefore have an enumerant or
|
|
// they are for an exception and are based on
|
|
// the exceptions code. Exception filters
|
|
// are further divided into exceptions specially
|
|
// handled by the engine, which is a fixed set,
|
|
// and arbitrary exceptions.
|
|
// All three groups of filters are indexed together
|
|
// with the specific filters first, then the specific
|
|
// exception filters and finally the arbitrary
|
|
// exception filters.
|
|
// The first specific exception is the default
|
|
// exception. If an exception event occurs for
|
|
// an exception without settings the default
|
|
// exception settings are used.
|
|
STDMETHOD(GetNumberEventFilters)(
|
|
THIS_
|
|
OUT PULONG SpecificEvents,
|
|
OUT PULONG SpecificExceptions,
|
|
OUT PULONG ArbitraryExceptions
|
|
) PURE;
|
|
// Some filters have descriptive text associated with them.
|
|
STDMETHOD(GetEventFilterText)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG TextSize
|
|
) PURE;
|
|
// All filters support executing a command when the
|
|
// event occurs.
|
|
STDMETHOD(GetEventFilterCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG CommandSize
|
|
) PURE;
|
|
STDMETHOD(SetEventFilterCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Command
|
|
) PURE;
|
|
STDMETHOD(GetSpecificFilterParameters)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
STDMETHOD(SetSpecificFilterParameters)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
IN /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
// Some specific filters have arguments to further
|
|
// qualify their operation.
|
|
STDMETHOD(GetSpecificFilterArgument)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ArgumentSize
|
|
) PURE;
|
|
STDMETHOD(SetSpecificFilterArgument)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Argument
|
|
) PURE;
|
|
// If Codes is non-NULL Start is ignored.
|
|
STDMETHOD(GetExceptionFilterParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG Codes,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
// The codes in the parameter data control the application
|
|
// of the parameter data. If a code is not already in
|
|
// the set of filters it is added. If the ExecutionOption
|
|
// for a code is REMOVE then the filter is removed.
|
|
// Specific exception filters cannot be removed.
|
|
STDMETHOD(SetExceptionFilterParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
// Exception filters support an additional command for
|
|
// second-chance events.
|
|
STDMETHOD(GetExceptionFilterSecondCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG CommandSize
|
|
) PURE;
|
|
STDMETHOD(SetExceptionFilterSecondCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Command
|
|
) PURE;
|
|
|
|
// Yields processing to the engine until
|
|
// an event occurs. This method may
|
|
// only be called by the thread that started
|
|
// the debug session.
|
|
// When an event occurs the engine carries
|
|
// out all event processing such as calling
|
|
// callbacks.
|
|
// If the callbacks indicate that execution should
|
|
// break the wait will return, otherwise it
|
|
// goes back to waiting for a new event.
|
|
// If the timeout expires, S_FALSE is returned.
|
|
// The timeout is not currently supported for
|
|
// kernel debugging.
|
|
STDMETHOD(WaitForEvent)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG Timeout
|
|
) PURE;
|
|
|
|
// Retrieves information about the last event that occurred.
|
|
// EventType is one of the event callback mask bits.
|
|
// ExtraInformation contains additional event-specific
|
|
// information. Not all events have additional information.
|
|
STDMETHOD(GetLastEventInformation)(
|
|
THIS_
|
|
OUT PULONG Type,
|
|
OUT PULONG ProcessId,
|
|
OUT PULONG ThreadId,
|
|
OUT OPTIONAL PVOID ExtraInformation,
|
|
IN ULONG ExtraInformationSize,
|
|
OUT OPTIONAL PULONG ExtraInformationUsed,
|
|
OUT OPTIONAL PSTR Description,
|
|
IN ULONG DescriptionSize,
|
|
OUT OPTIONAL PULONG DescriptionUsed
|
|
) PURE;
|
|
};
|
|
|
|
// OutputTextReplacements flags.
|
|
#define DEBUG_OUT_TEXT_REPL_DEFAULT 0x00000000
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugControl2
|
|
DECLARE_INTERFACE_(IDebugControl2, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugControl.
|
|
|
|
// Checks for a user interrupt, such a Ctrl-C
|
|
// or stop button.
|
|
// This method is reentrant.
|
|
STDMETHOD(GetInterrupt)(
|
|
THIS
|
|
) PURE;
|
|
// Registers a user interrupt.
|
|
// This method is reentrant.
|
|
STDMETHOD(SetInterrupt)(
|
|
THIS_
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// Interrupting a user-mode process requires
|
|
// access to some system resources that the
|
|
// process may hold itself, preventing the
|
|
// interrupt from occurring. The engine
|
|
// will time-out pending interrupt requests
|
|
// and simulate an interrupt if necessary.
|
|
// These methods control the interrupt timeout.
|
|
STDMETHOD(GetInterruptTimeout)(
|
|
THIS_
|
|
OUT PULONG Seconds
|
|
) PURE;
|
|
STDMETHOD(SetInterruptTimeout)(
|
|
THIS_
|
|
IN ULONG Seconds
|
|
) PURE;
|
|
|
|
STDMETHOD(GetLogFile)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG FileSize,
|
|
OUT PBOOL Append
|
|
) PURE;
|
|
// Opens a log file which collects all
|
|
// output. Output from every client except
|
|
// those that explicitly disable logging
|
|
// goes into the log.
|
|
// Opening a log file closes any log file
|
|
// already open.
|
|
STDMETHOD(OpenLogFile)(
|
|
THIS_
|
|
IN PCSTR File,
|
|
IN BOOL Append
|
|
) PURE;
|
|
STDMETHOD(CloseLogFile)(
|
|
THIS
|
|
) PURE;
|
|
// Controls what output is logged.
|
|
STDMETHOD(GetLogMask)(
|
|
THIS_
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
STDMETHOD(SetLogMask)(
|
|
THIS_
|
|
IN ULONG Mask
|
|
) PURE;
|
|
|
|
// Input requests input from all clients.
|
|
// The first input that is returned is used
|
|
// to satisfy the call. Other returned
|
|
// input is discarded.
|
|
STDMETHOD(Input)(
|
|
THIS_
|
|
OUT PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG InputSize
|
|
) PURE;
|
|
// This method is used by clients to return
|
|
// input when it is available. It will
|
|
// return S_OK if the input is used to
|
|
// satisfy an Input call and S_FALSE if
|
|
// the input is ignored.
|
|
// This method is reentrant.
|
|
STDMETHOD(ReturnInput)(
|
|
THIS_
|
|
IN PCSTR Buffer
|
|
) PURE;
|
|
|
|
// Sends output through clients
|
|
// output callbacks if the mask is allowed
|
|
// by the current output control mask and
|
|
// according to the output distribution
|
|
// settings.
|
|
STDMETHODV(Output)(
|
|
THIS_
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
...
|
|
) PURE;
|
|
STDMETHOD(OutputVaList)(
|
|
THIS_
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
IN va_list Args
|
|
) PURE;
|
|
// The following methods allow direct control
|
|
// over the distribution of the given output
|
|
// for situations where something other than
|
|
// the default is desired. These methods require
|
|
// extra work in the engine so they should
|
|
// only be used when necessary.
|
|
STDMETHODV(ControlledOutput)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
...
|
|
) PURE;
|
|
STDMETHOD(ControlledOutputVaList)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Mask,
|
|
IN PCSTR Format,
|
|
IN va_list Args
|
|
) PURE;
|
|
|
|
// Displays the standard command-line prompt
|
|
// followed by the given output. If Format
|
|
// is NULL no additional output is produced.
|
|
// Output is produced under the
|
|
// DEBUG_OUTPUT_PROMPT mask.
|
|
// This method only outputs the prompt; it
|
|
// does not get input.
|
|
STDMETHODV(OutputPrompt)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN OPTIONAL PCSTR Format,
|
|
...
|
|
) PURE;
|
|
STDMETHOD(OutputPromptVaList)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN OPTIONAL PCSTR Format,
|
|
IN va_list Args
|
|
) PURE;
|
|
// Gets the text that would be displayed by OutputPrompt.
|
|
STDMETHOD(GetPromptText)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG TextSize
|
|
) PURE;
|
|
// Outputs information about the current
|
|
// debuggee state such as a register
|
|
// summary, disassembly at the current PC,
|
|
// closest symbol and others.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputCurrentState)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Outputs the debugger and extension version
|
|
// information. This method is reentrant.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputVersionInformation)(
|
|
THIS_
|
|
IN ULONG OutputControl
|
|
) PURE;
|
|
|
|
// In user-mode debugging sessions the
|
|
// engine will set an event when
|
|
// exceptions are continued. This can
|
|
// be used to synchronize other processes
|
|
// with the debuggers handling of events.
|
|
// For example, this is used to support
|
|
// the e argument to ntsd.
|
|
STDMETHOD(GetNotifyEventHandle)(
|
|
THIS_
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
STDMETHOD(SetNotifyEventHandle)(
|
|
THIS_
|
|
IN ULONG64 Handle
|
|
) PURE;
|
|
|
|
STDMETHOD(Assemble)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PCSTR Instr,
|
|
OUT PULONG64 EndOffset
|
|
) PURE;
|
|
STDMETHOD(Disassemble)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DisassemblySize,
|
|
OUT PULONG64 EndOffset
|
|
) PURE;
|
|
// Returns the value of the effective address
|
|
// computed for the last Disassemble, if there
|
|
// was one.
|
|
STDMETHOD(GetDisassembleEffectiveOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Uses the line prefix if necessary.
|
|
STDMETHOD(OutputDisassembly)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG64 Offset,
|
|
IN ULONG Flags,
|
|
OUT PULONG64 EndOffset
|
|
) PURE;
|
|
// Produces multiple lines of disassembly output.
|
|
// There will be PreviousLines of disassembly before
|
|
// the given offset if a valid disassembly exists.
|
|
// In all, there will be TotalLines of output produced.
|
|
// The first and last line offsets are returned
|
|
// specially and all lines offsets can be retrieved
|
|
// through LineOffsets. LineOffsets will contain
|
|
// offsets for each line where disassembly started.
|
|
// When disassembly of a single instruction takes
|
|
// multiple lines the initial offset will be followed
|
|
// by DEBUG_INVALID_OFFSET.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputDisassemblyLines)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG PreviousLines,
|
|
IN ULONG TotalLines,
|
|
IN ULONG64 Offset,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PULONG OffsetLine,
|
|
OUT OPTIONAL PULONG64 StartOffset,
|
|
OUT OPTIONAL PULONG64 EndOffset,
|
|
OUT OPTIONAL /* size_is(TotalLines) */ PULONG64 LineOffsets
|
|
) PURE;
|
|
// Returns the offset of the start of
|
|
// the instruction thats the given
|
|
// delta away from the instruction
|
|
// at the initial offset.
|
|
// This routine does not check for
|
|
// validity of the instruction or
|
|
// the memory containing it.
|
|
STDMETHOD(GetNearInstruction)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN LONG Delta,
|
|
OUT PULONG64 NearOffset
|
|
) PURE;
|
|
|
|
// Offsets can be passed in as zero to use the current
|
|
// thread state.
|
|
STDMETHOD(GetStackTrace)(
|
|
THIS_
|
|
IN ULONG64 FrameOffset,
|
|
IN ULONG64 StackOffset,
|
|
IN ULONG64 InstructionOffset,
|
|
OUT /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
|
|
IN ULONG FramesSize,
|
|
OUT OPTIONAL PULONG FramesFilled
|
|
) PURE;
|
|
// Does a simple stack trace to determine
|
|
// what the current return address is.
|
|
STDMETHOD(GetReturnOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// If Frames is NULL OutputStackTrace will
|
|
// use GetStackTrace to get FramesSize frames
|
|
// and then output them. The current register
|
|
// values for frame, stack and instruction offsets
|
|
// are used.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputStackTrace)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN OPTIONAL /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
|
|
IN ULONG FramesSize,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Returns information about the debuggee such
|
|
// as user vs. kernel, dump vs. live, etc.
|
|
STDMETHOD(GetDebuggeeType)(
|
|
THIS_
|
|
OUT PULONG Class,
|
|
OUT PULONG Qualifier
|
|
) PURE;
|
|
// Returns the type of physical processors in
|
|
// the machine.
|
|
// Returns one of the IMAGE_FILE_MACHINE values.
|
|
STDMETHOD(GetActualProcessorType)(
|
|
THIS_
|
|
OUT PULONG Type
|
|
) PURE;
|
|
// Returns the type of processor used in the
|
|
// current processor context.
|
|
STDMETHOD(GetExecutingProcessorType)(
|
|
THIS_
|
|
OUT PULONG Type
|
|
) PURE;
|
|
// Query all the possible processor types that
|
|
// may be encountered during this debug session.
|
|
STDMETHOD(GetNumberPossibleExecutingProcessorTypes)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetPossibleExecutingProcessorTypes)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PULONG Types
|
|
) PURE;
|
|
// Get the number of actual processors in
|
|
// the machine.
|
|
STDMETHOD(GetNumberProcessors)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
// PlatformId is one of the VER_PLATFORM values.
|
|
// Major and minor are as given in the NT
|
|
// kernel debugger protocol.
|
|
// ServicePackString and ServicePackNumber indicate the
|
|
// system service pack level. ServicePackNumber is not
|
|
// available in some sessions where the service pack level
|
|
// is only expressed as a string. The service pack information
|
|
// will be empty if the system does not have a service pack
|
|
// applied.
|
|
// The build string is string information identifying the
|
|
// particular build of the system. The build string is
|
|
// empty if the system has no particular identifying
|
|
// information.
|
|
STDMETHOD(GetSystemVersion)(
|
|
THIS_
|
|
OUT PULONG PlatformId,
|
|
OUT PULONG Major,
|
|
OUT PULONG Minor,
|
|
OUT OPTIONAL PSTR ServicePackString,
|
|
IN ULONG ServicePackStringSize,
|
|
OUT OPTIONAL PULONG ServicePackStringUsed,
|
|
OUT PULONG ServicePackNumber,
|
|
OUT OPTIONAL PSTR BuildString,
|
|
IN ULONG BuildStringSize,
|
|
OUT OPTIONAL PULONG BuildStringUsed
|
|
) PURE;
|
|
// Returns the page size for the currently executing
|
|
// processor context. The page size may vary between
|
|
// processor types.
|
|
STDMETHOD(GetPageSize)(
|
|
THIS_
|
|
OUT PULONG Size
|
|
) PURE;
|
|
// Returns S_OK if the current processor context uses
|
|
// 64-bit addresses, otherwise S_FALSE.
|
|
STDMETHOD(IsPointer64Bit)(
|
|
THIS
|
|
) PURE;
|
|
// Reads the bugcheck data area and returns the
|
|
// current contents. This method only works
|
|
// in kernel debugging sessions.
|
|
STDMETHOD(ReadBugCheckData)(
|
|
THIS_
|
|
OUT PULONG Code,
|
|
OUT PULONG64 Arg1,
|
|
OUT PULONG64 Arg2,
|
|
OUT PULONG64 Arg3,
|
|
OUT PULONG64 Arg4
|
|
) PURE;
|
|
|
|
// Query all the processor types supported by
|
|
// the engine. This is a complete list and is
|
|
// not related to the machine running the engine
|
|
// or the debuggee.
|
|
STDMETHOD(GetNumberSupportedProcessorTypes)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetSupportedProcessorTypes)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PULONG Types
|
|
) PURE;
|
|
// Returns a full, descriptive name and an
|
|
// abbreviated name for a processor type.
|
|
STDMETHOD(GetProcessorTypeNames)(
|
|
THIS_
|
|
IN ULONG Type,
|
|
OUT OPTIONAL PSTR FullNameBuffer,
|
|
IN ULONG FullNameBufferSize,
|
|
OUT OPTIONAL PULONG FullNameSize,
|
|
OUT OPTIONAL PSTR AbbrevNameBuffer,
|
|
IN ULONG AbbrevNameBufferSize,
|
|
OUT OPTIONAL PULONG AbbrevNameSize
|
|
) PURE;
|
|
|
|
// Gets and sets the type of processor to
|
|
// use when doing things like setting
|
|
// breakpoints, accessing registers,
|
|
// getting stack traces and so on.
|
|
STDMETHOD(GetEffectiveProcessorType)(
|
|
THIS_
|
|
OUT PULONG Type
|
|
) PURE;
|
|
STDMETHOD(SetEffectiveProcessorType)(
|
|
THIS_
|
|
IN ULONG Type
|
|
) PURE;
|
|
|
|
// Returns information about whether and how
|
|
// the debuggee is running. Status will
|
|
// be GO if the debuggee is running and
|
|
// BREAK if it isnt.
|
|
// If no debuggee exists the status is
|
|
// NO_DEBUGGEE.
|
|
// This method is reentrant.
|
|
STDMETHOD(GetExecutionStatus)(
|
|
THIS_
|
|
OUT PULONG Status
|
|
) PURE;
|
|
// Changes the execution status of the
|
|
// engine from stopped to running.
|
|
// Status must be one of the go or step
|
|
// status values.
|
|
STDMETHOD(SetExecutionStatus)(
|
|
THIS_
|
|
IN ULONG Status
|
|
) PURE;
|
|
|
|
// Controls what code interpretation level the debugger
|
|
// runs at. The debugger checks the code level when
|
|
// deciding whether to step by a source line or
|
|
// assembly instruction along with other related operations.
|
|
STDMETHOD(GetCodeLevel)(
|
|
THIS_
|
|
OUT PULONG Level
|
|
) PURE;
|
|
STDMETHOD(SetCodeLevel)(
|
|
THIS_
|
|
IN ULONG Level
|
|
) PURE;
|
|
|
|
// Gets and sets engine control flags.
|
|
// These methods are reentrant.
|
|
STDMETHOD(GetEngineOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddEngineOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveEngineOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetEngineOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
|
|
// Gets and sets control values for
|
|
// handling system error events.
|
|
// If the system error level is less
|
|
// than or equal to the given levels
|
|
// the error may be displayed and
|
|
// the default break for the event
|
|
// may be set.
|
|
STDMETHOD(GetSystemErrorControl)(
|
|
THIS_
|
|
OUT PULONG OutputLevel,
|
|
OUT PULONG BreakLevel
|
|
) PURE;
|
|
STDMETHOD(SetSystemErrorControl)(
|
|
THIS_
|
|
IN ULONG OutputLevel,
|
|
IN ULONG BreakLevel
|
|
) PURE;
|
|
|
|
// The command processor supports simple
|
|
// string replacement macros in Evaluate and
|
|
// Execute. There are currently ten macro
|
|
// slots available. Slots 0-9 map to
|
|
// the command invocations $u0-$u9.
|
|
STDMETHOD(GetTextMacro)(
|
|
THIS_
|
|
IN ULONG Slot,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG MacroSize
|
|
) PURE;
|
|
STDMETHOD(SetTextMacro)(
|
|
THIS_
|
|
IN ULONG Slot,
|
|
IN PCSTR Macro
|
|
) PURE;
|
|
|
|
// Controls the default number radix used
|
|
// in expressions and commands.
|
|
STDMETHOD(GetRadix)(
|
|
THIS_
|
|
OUT PULONG Radix
|
|
) PURE;
|
|
STDMETHOD(SetRadix)(
|
|
THIS_
|
|
IN ULONG Radix
|
|
) PURE;
|
|
|
|
// Evaluates the given expression string and
|
|
// returns the resulting value.
|
|
// If DesiredType is DEBUG_VALUE_INVALID then
|
|
// the natural type is used.
|
|
// RemainderIndex, if provided, is set to the index
|
|
// of the first character in the input string that was
|
|
// not used when evaluating the expression.
|
|
STDMETHOD(Evaluate)(
|
|
THIS_
|
|
IN PCSTR Expression,
|
|
IN ULONG DesiredType,
|
|
OUT PDEBUG_VALUE Value,
|
|
OUT OPTIONAL PULONG RemainderIndex
|
|
) PURE;
|
|
// Attempts to convert the input value to a value
|
|
// of the requested type in the output value.
|
|
// Conversions can fail if no conversion exists.
|
|
// Successful conversions may be lossy.
|
|
STDMETHOD(CoerceValue)(
|
|
THIS_
|
|
IN PDEBUG_VALUE In,
|
|
IN ULONG OutType,
|
|
OUT PDEBUG_VALUE Out
|
|
) PURE;
|
|
STDMETHOD(CoerceValues)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN /* size_is(Count) */ PDEBUG_VALUE In,
|
|
IN /* size_is(Count) */ PULONG OutTypes,
|
|
OUT /* size_is(Count) */ PDEBUG_VALUE Out
|
|
) PURE;
|
|
|
|
// Executes the given command string.
|
|
// If the string has multiple commands
|
|
// Execute will not return until all
|
|
// of them have been executed. If this
|
|
// requires waiting for the debuggee to
|
|
// execute an internal wait will be done
|
|
// so Execute can take an arbitrary amount
|
|
// of time.
|
|
STDMETHOD(Execute)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN PCSTR Command,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
// Executes the given command file by
|
|
// reading a line at a time and processing
|
|
// it with Execute.
|
|
STDMETHOD(ExecuteCommandFile)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN PCSTR CommandFile,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Breakpoint interfaces are described
|
|
// elsewhere in this section.
|
|
STDMETHOD(GetNumberBreakpoints)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
// It is possible for this retrieval function to
|
|
// fail even with an index within the number of
|
|
// existing breakpoints if the breakpoint is
|
|
// a private breakpoint.
|
|
STDMETHOD(GetBreakpointByIndex)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT PDEBUG_BREAKPOINT* Bp
|
|
) PURE;
|
|
STDMETHOD(GetBreakpointById)(
|
|
THIS_
|
|
IN ULONG Id,
|
|
OUT PDEBUG_BREAKPOINT* Bp
|
|
) PURE;
|
|
// If Ids is non-NULL the Count breakpoints
|
|
// referred to in the Ids array are returned,
|
|
// otherwise breakpoints from index Start to
|
|
// Start + Count 1 are returned.
|
|
STDMETHOD(GetBreakpointParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_BREAKPOINT_PARAMETERS Params
|
|
) PURE;
|
|
// Breakpoints are created empty and disabled.
|
|
// When their parameters have been set they
|
|
// should be enabled by setting the ENABLE flag.
|
|
// If DesiredId is DEBUG_ANY_ID then the
|
|
// engine picks an unused ID. If DesiredId
|
|
// is any other number the engine attempts
|
|
// to use the given ID for the breakpoint.
|
|
// If another breakpoint exists with that ID
|
|
// the call will fail.
|
|
STDMETHOD(AddBreakpoint)(
|
|
THIS_
|
|
IN ULONG Type,
|
|
IN ULONG DesiredId,
|
|
OUT PDEBUG_BREAKPOINT* Bp
|
|
) PURE;
|
|
// Breakpoint interface is invalid after this call.
|
|
STDMETHOD(RemoveBreakpoint)(
|
|
THIS_
|
|
IN PDEBUG_BREAKPOINT Bp
|
|
) PURE;
|
|
|
|
// Control and use extension DLLs.
|
|
STDMETHOD(AddExtension)(
|
|
THIS_
|
|
IN PCSTR Path,
|
|
IN ULONG Flags,
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
STDMETHOD(RemoveExtension)(
|
|
THIS_
|
|
IN ULONG64 Handle
|
|
) PURE;
|
|
STDMETHOD(GetExtensionByPath)(
|
|
THIS_
|
|
IN PCSTR Path,
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// If Handle is zero the extension
|
|
// chain is walked searching for the
|
|
// function.
|
|
STDMETHOD(CallExtension)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN PCSTR Function,
|
|
IN OPTIONAL PCSTR Arguments
|
|
) PURE;
|
|
// GetExtensionFunction works like
|
|
// GetProcAddress on extension DLLs
|
|
// to allow raw function-call-level
|
|
// interaction with extension DLLs.
|
|
// Such functions do not need to
|
|
// follow the standard extension prototype
|
|
// if they are not going to be called
|
|
// through the text extension interface.
|
|
// This function cannot be called remotely.
|
|
STDMETHOD(GetExtensionFunction)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN PCSTR FuncName,
|
|
OUT FARPROC* Function
|
|
) PURE;
|
|
// These methods return alternate
|
|
// extension interfaces in order to allow
|
|
// interface-style extension DLLs to mix in
|
|
// older extension calls.
|
|
// Structure sizes must be initialized before
|
|
// the call.
|
|
// These methods cannot be called remotely.
|
|
STDMETHOD(GetWindbgExtensionApis32)(
|
|
THIS_
|
|
IN OUT PWINDBG_EXTENSION_APIS32 Api
|
|
) PURE;
|
|
STDMETHOD(GetWindbgExtensionApis64)(
|
|
THIS_
|
|
IN OUT PWINDBG_EXTENSION_APIS64 Api
|
|
) PURE;
|
|
|
|
// The engine provides a simple mechanism
|
|
// to filter common events. Arbitrarily complicated
|
|
// filtering can be done by registering event callbacks
|
|
// but simple event filtering only requires
|
|
// setting the options of one of the predefined
|
|
// event filters.
|
|
// Simple event filters are either for specific
|
|
// events and therefore have an enumerant or
|
|
// they are for an exception and are based on
|
|
// the exceptions code. Exception filters
|
|
// are further divided into exceptions specially
|
|
// handled by the engine, which is a fixed set,
|
|
// and arbitrary exceptions.
|
|
// All three groups of filters are indexed together
|
|
// with the specific filters first, then the specific
|
|
// exception filters and finally the arbitrary
|
|
// exception filters.
|
|
// The first specific exception is the default
|
|
// exception. If an exception event occurs for
|
|
// an exception without settings the default
|
|
// exception settings are used.
|
|
STDMETHOD(GetNumberEventFilters)(
|
|
THIS_
|
|
OUT PULONG SpecificEvents,
|
|
OUT PULONG SpecificExceptions,
|
|
OUT PULONG ArbitraryExceptions
|
|
) PURE;
|
|
// Some filters have descriptive text associated with them.
|
|
STDMETHOD(GetEventFilterText)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG TextSize
|
|
) PURE;
|
|
// All filters support executing a command when the
|
|
// event occurs.
|
|
STDMETHOD(GetEventFilterCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG CommandSize
|
|
) PURE;
|
|
STDMETHOD(SetEventFilterCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Command
|
|
) PURE;
|
|
STDMETHOD(GetSpecificFilterParameters)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
STDMETHOD(SetSpecificFilterParameters)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
IN /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
// Some specific filters have arguments to further
|
|
// qualify their operation.
|
|
STDMETHOD(GetSpecificFilterArgument)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ArgumentSize
|
|
) PURE;
|
|
STDMETHOD(SetSpecificFilterArgument)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Argument
|
|
) PURE;
|
|
// If Codes is non-NULL Start is ignored.
|
|
STDMETHOD(GetExceptionFilterParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG Codes,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
// The codes in the parameter data control the application
|
|
// of the parameter data. If a code is not already in
|
|
// the set of filters it is added. If the ExecutionOption
|
|
// for a code is REMOVE then the filter is removed.
|
|
// Specific exception filters cannot be removed.
|
|
STDMETHOD(SetExceptionFilterParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
|
|
) PURE;
|
|
// Exception filters support an additional command for
|
|
// second-chance events.
|
|
STDMETHOD(GetExceptionFilterSecondCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG CommandSize
|
|
) PURE;
|
|
STDMETHOD(SetExceptionFilterSecondCommand)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Command
|
|
) PURE;
|
|
|
|
// Yields processing to the engine until
|
|
// an event occurs. This method may
|
|
// only be called by the thread that started
|
|
// the debug session.
|
|
// When an event occurs the engine carries
|
|
// out all event processing such as calling
|
|
// callbacks.
|
|
// If the callbacks indicate that execution should
|
|
// break the wait will return, otherwise it
|
|
// goes back to waiting for a new event.
|
|
// If the timeout expires, S_FALSE is returned.
|
|
// The timeout is not currently supported for
|
|
// kernel debugging.
|
|
STDMETHOD(WaitForEvent)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG Timeout
|
|
) PURE;
|
|
|
|
// Retrieves information about the last event that occurred.
|
|
// EventType is one of the event callback mask bits.
|
|
// ExtraInformation contains additional event-specific
|
|
// information. Not all events have additional information.
|
|
STDMETHOD(GetLastEventInformation)(
|
|
THIS_
|
|
OUT PULONG Type,
|
|
OUT PULONG ProcessId,
|
|
OUT PULONG ThreadId,
|
|
OUT OPTIONAL PVOID ExtraInformation,
|
|
IN ULONG ExtraInformationSize,
|
|
OUT OPTIONAL PULONG ExtraInformationUsed,
|
|
OUT OPTIONAL PSTR Description,
|
|
IN ULONG DescriptionSize,
|
|
OUT OPTIONAL PULONG DescriptionUsed
|
|
) PURE;
|
|
|
|
// IDebugControl2.
|
|
|
|
STDMETHOD(GetCurrentTimeDate)(
|
|
THIS_
|
|
OUT PULONG TimeDate
|
|
) PURE;
|
|
// Retrieves the number of seconds since the
|
|
// machine started running.
|
|
STDMETHOD(GetCurrentSystemUpTime)(
|
|
THIS_
|
|
OUT PULONG UpTime
|
|
) PURE;
|
|
|
|
// If the current session is a dump session,
|
|
// retrieves any extended format information.
|
|
STDMETHOD(GetDumpFormatFlags)(
|
|
THIS_
|
|
OUT PULONG FormatFlags
|
|
) PURE;
|
|
|
|
// The debugger has been enhanced to allow
|
|
// arbitrary text replacements in addition
|
|
// to the simple $u0-$u9 text macros.
|
|
// Text replacement takes a given source
|
|
// text in commands and converts it to the
|
|
// given destination text. Replacements
|
|
// are named by their source text so that
|
|
// only one replacement for a source text
|
|
// string can exist.
|
|
STDMETHOD(GetNumberTextReplacements)(
|
|
THIS_
|
|
OUT PULONG NumRepl
|
|
) PURE;
|
|
// If SrcText is non-NULL the replacement
|
|
// is looked up by source text, otherwise
|
|
// Index is used to get the Nth replacement.
|
|
STDMETHOD(GetTextReplacement)(
|
|
THIS_
|
|
IN OPTIONAL PCSTR SrcText,
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR SrcBuffer,
|
|
IN ULONG SrcBufferSize,
|
|
OUT OPTIONAL PULONG SrcSize,
|
|
OUT OPTIONAL PSTR DstBuffer,
|
|
IN ULONG DstBufferSize,
|
|
OUT OPTIONAL PULONG DstSize
|
|
) PURE;
|
|
// Setting the destination text to
|
|
// NULL removes the alias.
|
|
STDMETHOD(SetTextReplacement)(
|
|
THIS_
|
|
IN PCSTR SrcText,
|
|
IN OPTIONAL PCSTR DstText
|
|
) PURE;
|
|
STDMETHOD(RemoveTextReplacements)(
|
|
THIS
|
|
) PURE;
|
|
// Outputs the complete list of current
|
|
// replacements.
|
|
STDMETHOD(OutputTextReplacements)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugDataSpaces.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Data space indices for callbacks and other methods.
|
|
#define DEBUG_DATA_SPACE_VIRTUAL 0
|
|
#define DEBUG_DATA_SPACE_PHYSICAL 1
|
|
#define DEBUG_DATA_SPACE_CONTROL 2
|
|
#define DEBUG_DATA_SPACE_IO 3
|
|
#define DEBUG_DATA_SPACE_MSR 4
|
|
#define DEBUG_DATA_SPACE_BUS_DATA 5
|
|
#define DEBUG_DATA_SPACE_DEBUGGER_DATA 6
|
|
// Count of data spaces.
|
|
#define DEBUG_DATA_SPACE_COUNT 7
|
|
|
|
// Indices for ReadDebuggerData interface
|
|
#define DEBUG_DATA_KernBase 24
|
|
#define DEBUG_DATA_BreakpointWithStatusAddr 32
|
|
#define DEBUG_DATA_SavedContextAddr 40
|
|
#define DEBUG_DATA_KiCallUserModeAddr 56
|
|
#define DEBUG_DATA_KeUserCallbackDispatcherAddr 64
|
|
#define DEBUG_DATA_PsLoadedModuleListAddr 72
|
|
#define DEBUG_DATA_PsActiveProcessHeadAddr 80
|
|
#define DEBUG_DATA_PspCidTableAddr 88
|
|
#define DEBUG_DATA_ExpSystemResourcesListAddr 96
|
|
#define DEBUG_DATA_ExpPagedPoolDescriptorAddr 104
|
|
#define DEBUG_DATA_ExpNumberOfPagedPoolsAddr 112
|
|
#define DEBUG_DATA_KeTimeIncrementAddr 120
|
|
#define DEBUG_DATA_KeBugCheckCallbackListHeadAddr 128
|
|
#define DEBUG_DATA_KiBugcheckDataAddr 136
|
|
#define DEBUG_DATA_IopErrorLogListHeadAddr 144
|
|
#define DEBUG_DATA_ObpRootDirectoryObjectAddr 152
|
|
#define DEBUG_DATA_ObpTypeObjectTypeAddr 160
|
|
#define DEBUG_DATA_MmSystemCacheStartAddr 168
|
|
#define DEBUG_DATA_MmSystemCacheEndAddr 176
|
|
#define DEBUG_DATA_MmSystemCacheWsAddr 184
|
|
#define DEBUG_DATA_MmPfnDatabaseAddr 192
|
|
#define DEBUG_DATA_MmSystemPtesStartAddr 200
|
|
#define DEBUG_DATA_MmSystemPtesEndAddr 208
|
|
#define DEBUG_DATA_MmSubsectionBaseAddr 216
|
|
#define DEBUG_DATA_MmNumberOfPagingFilesAddr 224
|
|
#define DEBUG_DATA_MmLowestPhysicalPageAddr 232
|
|
#define DEBUG_DATA_MmHighestPhysicalPageAddr 240
|
|
#define DEBUG_DATA_MmNumberOfPhysicalPagesAddr 248
|
|
#define DEBUG_DATA_MmMaximumNonPagedPoolInBytesAddr 256
|
|
#define DEBUG_DATA_MmNonPagedSystemStartAddr 264
|
|
#define DEBUG_DATA_MmNonPagedPoolStartAddr 272
|
|
#define DEBUG_DATA_MmNonPagedPoolEndAddr 280
|
|
#define DEBUG_DATA_MmPagedPoolStartAddr 288
|
|
#define DEBUG_DATA_MmPagedPoolEndAddr 296
|
|
#define DEBUG_DATA_MmPagedPoolInformationAddr 304
|
|
#define DEBUG_DATA_MmPageSize 312
|
|
#define DEBUG_DATA_MmSizeOfPagedPoolInBytesAddr 320
|
|
#define DEBUG_DATA_MmTotalCommitLimitAddr 328
|
|
#define DEBUG_DATA_MmTotalCommittedPagesAddr 336
|
|
#define DEBUG_DATA_MmSharedCommitAddr 344
|
|
#define DEBUG_DATA_MmDriverCommitAddr 352
|
|
#define DEBUG_DATA_MmProcessCommitAddr 360
|
|
#define DEBUG_DATA_MmPagedPoolCommitAddr 368
|
|
#define DEBUG_DATA_MmExtendedCommitAddr 376
|
|
#define DEBUG_DATA_MmZeroedPageListHeadAddr 384
|
|
#define DEBUG_DATA_MmFreePageListHeadAddr 392
|
|
#define DEBUG_DATA_MmStandbyPageListHeadAddr 400
|
|
#define DEBUG_DATA_MmModifiedPageListHeadAddr 408
|
|
#define DEBUG_DATA_MmModifiedNoWritePageListHeadAddr 416
|
|
#define DEBUG_DATA_MmAvailablePagesAddr 424
|
|
#define DEBUG_DATA_MmResidentAvailablePagesAddr 432
|
|
#define DEBUG_DATA_PoolTrackTableAddr 440
|
|
#define DEBUG_DATA_NonPagedPoolDescriptorAddr 448
|
|
#define DEBUG_DATA_MmHighestUserAddressAddr 456
|
|
#define DEBUG_DATA_MmSystemRangeStartAddr 464
|
|
#define DEBUG_DATA_MmUserProbeAddressAddr 472
|
|
#define DEBUG_DATA_KdPrintCircularBufferAddr 480
|
|
#define DEBUG_DATA_KdPrintCircularBufferEndAddr 488
|
|
#define DEBUG_DATA_KdPrintWritePointerAddr 496
|
|
#define DEBUG_DATA_KdPrintRolloverCountAddr 504
|
|
#define DEBUG_DATA_MmLoadedUserImageListAddr 512
|
|
#define DEBUG_DATA_NtBuildLabAddr 520
|
|
#define DEBUG_DATA_KiNormalSystemCall 528
|
|
#define DEBUG_DATA_KiProcessorBlockAddr 536
|
|
#define DEBUG_DATA_MmUnloadedDriversAddr 544
|
|
#define DEBUG_DATA_MmLastUnloadedDriverAddr 552
|
|
#define DEBUG_DATA_MmTriageActionTakenAddr 560
|
|
#define DEBUG_DATA_MmSpecialPoolTagAddr 568
|
|
#define DEBUG_DATA_KernelVerifierAddr 576
|
|
#define DEBUG_DATA_MmVerifierDataAddr 584
|
|
#define DEBUG_DATA_MmAllocatedNonPagedPoolAddr 592
|
|
#define DEBUG_DATA_MmPeakCommitmentAddr 600
|
|
#define DEBUG_DATA_MmTotalCommitLimitMaximumAddr 608
|
|
#define DEBUG_DATA_CmNtCSDVersionAddr 616
|
|
#define DEBUG_DATA_MmPhysicalMemoryBlockAddr 624
|
|
|
|
#define DEBUG_DATA_PaeEnabled 100000
|
|
#define DEBUG_DATA_SharedUserData 100008
|
|
|
|
//
|
|
// Processor information structures.
|
|
//
|
|
|
|
typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_ALPHA
|
|
{
|
|
ULONG Type;
|
|
ULONG Revision;
|
|
} DEBUG_PROCESSOR_IDENTIFICATION_ALPHA, *PDEBUG_PROCESSOR_IDENTIFICATION_ALPHA;
|
|
|
|
typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_AMD64
|
|
{
|
|
ULONG Family;
|
|
ULONG Model;
|
|
ULONG Stepping;
|
|
CHAR VendorString[16];
|
|
} DEBUG_PROCESSOR_IDENTIFICATION_AMD64, *PDEBUG_PROCESSOR_IDENTIFICATION_AMD64;
|
|
|
|
typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_IA64
|
|
{
|
|
ULONG Model;
|
|
ULONG Revision;
|
|
ULONG Family;
|
|
ULONG ArchRev;
|
|
CHAR VendorString[16];
|
|
} DEBUG_PROCESSOR_IDENTIFICATION_IA64, *PDEBUG_PROCESSOR_IDENTIFICATION_IA64;
|
|
|
|
typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_X86
|
|
{
|
|
ULONG Family;
|
|
ULONG Model;
|
|
ULONG Stepping;
|
|
CHAR VendorString[16];
|
|
} DEBUG_PROCESSOR_IDENTIFICATION_X86, *PDEBUG_PROCESSOR_IDENTIFICATION_X86;
|
|
|
|
typedef union _DEBUG_PROCESSOR_IDENTIFICATION_ALL
|
|
{
|
|
DEBUG_PROCESSOR_IDENTIFICATION_ALPHA Alpha;
|
|
DEBUG_PROCESSOR_IDENTIFICATION_AMD64 Amd64;
|
|
DEBUG_PROCESSOR_IDENTIFICATION_IA64 Ia64;
|
|
DEBUG_PROCESSOR_IDENTIFICATION_X86 X86;
|
|
} DEBUG_PROCESSOR_IDENTIFICATION_ALL, *PDEBUG_PROCESSOR_IDENTIFICATION_ALL;
|
|
|
|
// Indices for ReadProcessorSystemData.
|
|
#define DEBUG_DATA_KPCR_OFFSET 0
|
|
#define DEBUG_DATA_KPRCB_OFFSET 1
|
|
#define DEBUG_DATA_KTHREAD_OFFSET 2
|
|
#define DEBUG_DATA_BASE_TRANSLATION_VIRTUAL_OFFSET 3
|
|
#define DEBUG_DATA_PROCESSOR_IDENTIFICATION 4
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugDataSpaces
|
|
DECLARE_INTERFACE_(IDebugDataSpaces, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugDataSpaces.
|
|
STDMETHOD(ReadVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
// SearchVirtual searches the given virtual
|
|
// address range for the given pattern. PatternSize
|
|
// gives the byte length of the pattern and PatternGranularity
|
|
// controls the granularity of comparisons during
|
|
// the search.
|
|
// For example, a DWORD-granular search would
|
|
// use a pattern granularity of four to search by DWORD
|
|
// increments.
|
|
STDMETHOD(SearchVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Length,
|
|
IN PVOID Pattern,
|
|
IN ULONG PatternSize,
|
|
IN ULONG PatternGranularity,
|
|
OUT PULONG64 MatchOffset
|
|
) PURE;
|
|
// These methods are identical to Read/WriteVirtual
|
|
// except that they avoid the kernel virtual memory
|
|
// cache entirely and are therefore useful for reading
|
|
// virtual memory which is inherently volatile, such
|
|
// as memory-mapped device areas, without contaminating
|
|
// or invalidating the cache.
|
|
// In user-mode they are the same as Read/WriteVirtual.
|
|
STDMETHOD(ReadVirtualUncached)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteVirtualUncached)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
// The following two methods are convenience
|
|
// methods for accessing pointer values.
|
|
// They automatically convert between native pointers
|
|
// and canonical 64-bit values as necessary.
|
|
// These routines stop at the first failure.
|
|
STDMETHOD(ReadPointersVirtual)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN ULONG64 Offset,
|
|
OUT /* size_is(Count) */ PULONG64 Ptrs
|
|
) PURE;
|
|
STDMETHOD(WritePointersVirtual)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN ULONG64 Offset,
|
|
IN /* size_is(Count) */ PULONG64 Ptrs
|
|
) PURE;
|
|
// All non-virtual data spaces are only
|
|
// available when kernel debugging.
|
|
STDMETHOD(ReadPhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WritePhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(ReadControl)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteControl)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(ReadIo)(
|
|
THIS_
|
|
IN ULONG InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG AddressSpace,
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteIo)(
|
|
THIS_
|
|
IN ULONG InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG AddressSpace,
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(ReadMsr)(
|
|
THIS_
|
|
IN ULONG Msr,
|
|
OUT PULONG64 Value
|
|
) PURE;
|
|
STDMETHOD(WriteMsr)(
|
|
THIS_
|
|
IN ULONG Msr,
|
|
IN ULONG64 Value
|
|
) PURE;
|
|
STDMETHOD(ReadBusData)(
|
|
THIS_
|
|
IN ULONG BusDataType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN ULONG Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteBusData)(
|
|
THIS_
|
|
IN ULONG BusDataType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN ULONG Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(CheckLowMemory)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD(ReadDebuggerData)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DataSize
|
|
) PURE;
|
|
STDMETHOD(ReadProcessorSystemData)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
IN ULONG Index,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DataSize
|
|
) PURE;
|
|
};
|
|
|
|
//
|
|
// Handle data types and structures.
|
|
//
|
|
|
|
#define DEBUG_HANDLE_DATA_TYPE_BASIC 0
|
|
#define DEBUG_HANDLE_DATA_TYPE_TYPE_NAME 1
|
|
#define DEBUG_HANDLE_DATA_TYPE_OBJECT_NAME 2
|
|
#define DEBUG_HANDLE_DATA_TYPE_HANDLE_COUNT 3
|
|
|
|
typedef struct _DEBUG_HANDLE_DATA_BASIC
|
|
{
|
|
ULONG TypeNameSize;
|
|
ULONG ObjectNameSize;
|
|
ULONG Attributes;
|
|
ULONG GrantedAccess;
|
|
ULONG HandleCount;
|
|
ULONG PointerCount;
|
|
} DEBUG_HANDLE_DATA_BASIC, *PDEBUG_HANDLE_DATA_BASIC;
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugDataSpaces2
|
|
DECLARE_INTERFACE_(IDebugDataSpaces2, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugDataSpaces.
|
|
STDMETHOD(ReadVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
// SearchVirtual searches the given virtual
|
|
// address range for the given pattern. PatternSize
|
|
// gives the byte length of the pattern and PatternGranularity
|
|
// controls the granularity of comparisons during
|
|
// the search.
|
|
// For example, a DWORD-granular search would
|
|
// use a pattern granularity of four to search by DWORD
|
|
// increments.
|
|
STDMETHOD(SearchVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Length,
|
|
IN PVOID Pattern,
|
|
IN ULONG PatternSize,
|
|
IN ULONG PatternGranularity,
|
|
OUT PULONG64 MatchOffset
|
|
) PURE;
|
|
// These methods are identical to Read/WriteVirtual
|
|
// except that they avoid the kernel virtual memory
|
|
// cache entirely and are therefore useful for reading
|
|
// virtual memory which is inherently volatile, such
|
|
// as memory-mapped device areas, without contaminating
|
|
// or invalidating the cache.
|
|
// In user-mode they are the same as Read/WriteVirtual.
|
|
STDMETHOD(ReadVirtualUncached)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteVirtualUncached)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
// The following two methods are convenience
|
|
// methods for accessing pointer values.
|
|
// They automatically convert between native pointers
|
|
// and canonical 64-bit values as necessary.
|
|
// These routines stop at the first failure.
|
|
STDMETHOD(ReadPointersVirtual)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN ULONG64 Offset,
|
|
OUT /* size_is(Count) */ PULONG64 Ptrs
|
|
) PURE;
|
|
STDMETHOD(WritePointersVirtual)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN ULONG64 Offset,
|
|
IN /* size_is(Count) */ PULONG64 Ptrs
|
|
) PURE;
|
|
// All non-virtual data spaces are only
|
|
// available when kernel debugging.
|
|
STDMETHOD(ReadPhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WritePhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(ReadControl)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteControl)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(ReadIo)(
|
|
THIS_
|
|
IN ULONG InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG AddressSpace,
|
|
IN ULONG64 Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteIo)(
|
|
THIS_
|
|
IN ULONG InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG AddressSpace,
|
|
IN ULONG64 Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(ReadMsr)(
|
|
THIS_
|
|
IN ULONG Msr,
|
|
OUT PULONG64 Value
|
|
) PURE;
|
|
STDMETHOD(WriteMsr)(
|
|
THIS_
|
|
IN ULONG Msr,
|
|
IN ULONG64 Value
|
|
) PURE;
|
|
STDMETHOD(ReadBusData)(
|
|
THIS_
|
|
IN ULONG BusDataType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN ULONG Offset,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteBusData)(
|
|
THIS_
|
|
IN ULONG BusDataType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN ULONG Offset,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(CheckLowMemory)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD(ReadDebuggerData)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DataSize
|
|
) PURE;
|
|
STDMETHOD(ReadProcessorSystemData)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
IN ULONG Index,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DataSize
|
|
) PURE;
|
|
|
|
// IDebugDataSpaces2.
|
|
|
|
STDMETHOD(VirtualToPhysical)(
|
|
THIS_
|
|
IN ULONG64 Virtual,
|
|
OUT PULONG64 Physical
|
|
) PURE;
|
|
// Returns the physical addresses for the
|
|
// N levels of the systems paging structures.
|
|
// Level zero is the starting base physical
|
|
// address for virtual translations.
|
|
// Levels one-(N-1) will point to the appropriate
|
|
// paging descriptor for the virtual address at
|
|
// the given level of the paging hierarchy. The
|
|
// exact number of levels depends on many factors.
|
|
// The last level will be the fully translated
|
|
// physical address, matching what VirtualToPhysical
|
|
// returns. If the address can only be partially
|
|
// translated S_FALSE is returned.
|
|
STDMETHOD(GetVirtualTranslationPhysicalOffsets)(
|
|
THIS_
|
|
IN ULONG64 Virtual,
|
|
OUT OPTIONAL /* size_is(OffsetsSize) */ PULONG64 Offsets,
|
|
IN ULONG OffsetsSize,
|
|
OUT OPTIONAL PULONG Levels
|
|
) PURE;
|
|
|
|
// System handle data is accessible in certain
|
|
// debug sessions. The particular data available
|
|
// varies from session to session and platform
|
|
// to platform.
|
|
STDMETHOD(ReadHandleData)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN ULONG DataType,
|
|
OUT OPTIONAL PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG DataSize
|
|
) PURE;
|
|
|
|
// Fills memory with the given pattern.
|
|
// The fill stops at the first non-writable byte.
|
|
STDMETHOD(FillVirtual)(
|
|
THIS_
|
|
IN ULONG64 Start,
|
|
IN ULONG Size,
|
|
IN PVOID Pattern,
|
|
IN ULONG PatternSize,
|
|
OUT OPTIONAL PULONG Filled
|
|
) PURE;
|
|
STDMETHOD(FillPhysical)(
|
|
THIS_
|
|
IN ULONG64 Start,
|
|
IN ULONG Size,
|
|
IN PVOID Pattern,
|
|
IN ULONG PatternSize,
|
|
OUT OPTIONAL PULONG Filled
|
|
) PURE;
|
|
|
|
// Queries virtual memory mapping information given
|
|
// an address similarly to the Win32 API VirtualQuery.
|
|
// MEMORY_BASIC_INFORMATION64 is defined in crash.h.
|
|
// This method currently only works for user-mode sessions.
|
|
STDMETHOD(QueryVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PMEMORY_BASIC_INFORMATION64 Info
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugEventCallbacks.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Interest mask bits.
|
|
#define DEBUG_EVENT_BREAKPOINT 0x00000001
|
|
#define DEBUG_EVENT_EXCEPTION 0x00000002
|
|
#define DEBUG_EVENT_CREATE_THREAD 0x00000004
|
|
#define DEBUG_EVENT_EXIT_THREAD 0x00000008
|
|
#define DEBUG_EVENT_CREATE_PROCESS 0x00000010
|
|
#define DEBUG_EVENT_EXIT_PROCESS 0x00000020
|
|
#define DEBUG_EVENT_LOAD_MODULE 0x00000040
|
|
#define DEBUG_EVENT_UNLOAD_MODULE 0x00000080
|
|
#define DEBUG_EVENT_SYSTEM_ERROR 0x00000100
|
|
#define DEBUG_EVENT_SESSION_STATUS 0x00000200
|
|
#define DEBUG_EVENT_CHANGE_DEBUGGEE_STATE 0x00000400
|
|
#define DEBUG_EVENT_CHANGE_ENGINE_STATE 0x00000800
|
|
#define DEBUG_EVENT_CHANGE_SYMBOL_STATE 0x00001000
|
|
|
|
// SessionStatus flags.
|
|
// A debuggee has been discovered for the session.
|
|
#define DEBUG_SESSION_ACTIVE 0x00000000
|
|
// The session has been ended by EndSession.
|
|
#define DEBUG_SESSION_END_SESSION_ACTIVE_TERMINATE 0x00000001
|
|
#define DEBUG_SESSION_END_SESSION_ACTIVE_DETACH 0x00000002
|
|
#define DEBUG_SESSION_END_SESSION_PASSIVE 0x00000003
|
|
// The debuggee has run to completion. User-mode only.
|
|
#define DEBUG_SESSION_END 0x00000004
|
|
// The target machine has rebooted. Kernel-mode only.
|
|
#define DEBUG_SESSION_REBOOT 0x00000005
|
|
// The target machine has hibernated. Kernel-mode only.
|
|
#define DEBUG_SESSION_HIBERNATE 0x00000006
|
|
// The engine was unable to continue the session.
|
|
#define DEBUG_SESSION_FAILURE 0x00000007
|
|
|
|
// ChangeDebuggeeState flags.
|
|
// The debuggees state has changed generally, such
|
|
// as when the debuggee has been executing.
|
|
// Argument is zero.
|
|
#define DEBUG_CDS_ALL 0xffffffff
|
|
// Registers have changed. If only a single register
|
|
// changed, argument is the index of the register.
|
|
// Otherwise it is DEBUG_ANY_ID.
|
|
#define DEBUG_CDS_REGISTERS 0x00000001
|
|
// Data spaces have changed. If only a single
|
|
// space was affected, argument is the data
|
|
// space. Otherwise it is DEBUG_ANY_ID.
|
|
#define DEBUG_CDS_DATA 0x00000002
|
|
|
|
// ChangeEngineState flags.
|
|
// The engine state has changed generally.
|
|
// Argument is zero.
|
|
#define DEBUG_CES_ALL 0xffffffff
|
|
// Current thread changed. This may imply a change
|
|
// of process also. Argument is the ID of the new
|
|
// current thread.
|
|
#define DEBUG_CES_CURRENT_THREAD 0x00000001
|
|
// Effective processor changed. Argument is the
|
|
// new processor type.
|
|
#define DEBUG_CES_EFFECTIVE_PROCESSOR 0x00000002
|
|
// Breakpoints changed. If only a single breakpoint
|
|
// changed, argument is the ID of the breakpoint.
|
|
// Otherwise it is DEBUG_ANY_ID.
|
|
#define DEBUG_CES_BREAKPOINTS 0x00000004
|
|
// Code interpretation level changed. Argument is
|
|
// the new level.
|
|
#define DEBUG_CES_CODE_LEVEL 0x00000008
|
|
// Execution status changed. Argument is the new
|
|
// execution status.
|
|
#define DEBUG_CES_EXECUTION_STATUS 0x00000010
|
|
// Engine options have changed. Argument is the new
|
|
// options value.
|
|
#define DEBUG_CES_ENGINE_OPTIONS 0x00000020
|
|
// Log file information has changed. Argument
|
|
// is TRUE if a log file was opened and FALSE if
|
|
// a log file was closed.
|
|
#define DEBUG_CES_LOG_FILE 0x00000040
|
|
// Default number radix has changed. Argument
|
|
// is the new radix.
|
|
#define DEBUG_CES_RADIX 0x00000080
|
|
// Event filters changed. If only a single filter
|
|
// changed the argument is the filter's index,
|
|
// otherwise it is DEBUG_ANY_ID.
|
|
#define DEBUG_CES_EVENT_FILTERS 0x00000100
|
|
// Process options have changed. Argument is the new
|
|
// options value.
|
|
#define DEBUG_CES_PROCESS_OPTIONS 0x00000200
|
|
// Extensions have been added or removed.
|
|
#define DEBUG_CES_EXTENSIONS 0x00000400
|
|
|
|
// ChangeSymbolState flags.
|
|
// Symbol state has changed generally, such
|
|
// as after reload operations. Argument is zero.
|
|
#define DEBUG_CSS_ALL 0xffffffff
|
|
// Modules have been loaded. If only a
|
|
// single module changed, argument is the
|
|
// base address of the module. Otherwise
|
|
// it is zero.
|
|
#define DEBUG_CSS_LOADS 0x00000001
|
|
// Modules have been unloaded. If only a
|
|
// single module changed, argument is the
|
|
// base address of the module. Otherwise
|
|
// it is zero.
|
|
#define DEBUG_CSS_UNLOADS 0x00000002
|
|
// Current symbol scope changed.
|
|
#define DEBUG_CSS_SCOPE 0x00000004
|
|
// Paths have changed.
|
|
#define DEBUG_CSS_PATHS 0x00000008
|
|
// Symbol options have changed. Argument is the new
|
|
// options value.
|
|
#define DEBUG_CSS_SYMBOL_OPTIONS 0x00000010
|
|
// Type options have changed. Argument is the new
|
|
// options value.
|
|
#define DEBUG_CSS_TYPE_OPTIONS 0x00000020
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugEventCallbacks
|
|
DECLARE_INTERFACE_(IDebugEventCallbacks, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugEventCallbacks.
|
|
|
|
// The engine calls GetInterestMask once when
|
|
// the event callbacks are set for a client.
|
|
STDMETHOD(GetInterestMask)(
|
|
THIS_
|
|
OUT PULONG Mask
|
|
) PURE;
|
|
|
|
// A breakpoint event is generated when
|
|
// a breakpoint exception is received and
|
|
// it can be mapped to an existing breakpoint.
|
|
// The callback method is given a reference
|
|
// to the breakpoint and should release it when
|
|
// it is done with it.
|
|
STDMETHOD(Breakpoint)(
|
|
THIS_
|
|
IN PDEBUG_BREAKPOINT Bp
|
|
) PURE;
|
|
|
|
// Exceptions include breaks which cannot
|
|
// be mapped to an existing breakpoint
|
|
// instance.
|
|
STDMETHOD(Exception)(
|
|
THIS_
|
|
IN PEXCEPTION_RECORD64 Exception,
|
|
IN ULONG FirstChance
|
|
) PURE;
|
|
|
|
// Any of these values can be zero if they
|
|
// cannot be provided by the engine.
|
|
// Currently the kernel does not return thread
|
|
// or process change events.
|
|
STDMETHOD(CreateThread)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN ULONG64 DataOffset,
|
|
IN ULONG64 StartOffset
|
|
) PURE;
|
|
STDMETHOD(ExitThread)(
|
|
THIS_
|
|
IN ULONG ExitCode
|
|
) PURE;
|
|
|
|
// Any of these values can be zero if they
|
|
// cannot be provided by the engine.
|
|
STDMETHOD(CreateProcess)(
|
|
THIS_
|
|
IN ULONG64 ImageFileHandle,
|
|
IN ULONG64 Handle,
|
|
IN ULONG64 BaseOffset,
|
|
IN ULONG ModuleSize,
|
|
IN PCSTR ModuleName,
|
|
IN PCSTR ImageName,
|
|
IN ULONG CheckSum,
|
|
IN ULONG TimeDateStamp,
|
|
IN ULONG64 InitialThreadHandle,
|
|
IN ULONG64 ThreadDataOffset,
|
|
IN ULONG64 StartOffset
|
|
) PURE;
|
|
STDMETHOD(ExitProcess)(
|
|
THIS_
|
|
IN ULONG ExitCode
|
|
) PURE;
|
|
|
|
// Any of these values may be zero.
|
|
STDMETHOD(LoadModule)(
|
|
THIS_
|
|
IN ULONG64 ImageFileHandle,
|
|
IN ULONG64 BaseOffset,
|
|
IN ULONG ModuleSize,
|
|
IN PCSTR ModuleName,
|
|
IN PCSTR ImageName,
|
|
IN ULONG CheckSum,
|
|
IN ULONG TimeDateStamp
|
|
) PURE;
|
|
STDMETHOD(UnloadModule)(
|
|
THIS_
|
|
IN PCSTR ImageBaseName,
|
|
IN ULONG64 BaseOffset
|
|
) PURE;
|
|
|
|
STDMETHOD(SystemError)(
|
|
THIS_
|
|
IN ULONG Error,
|
|
IN ULONG Level
|
|
) PURE;
|
|
|
|
// Session status is synchronous like the other
|
|
// wait callbacks but it is called as the state
|
|
// of the session is changing rather than at
|
|
// specific events so its return value does not
|
|
// influence waiting. Implementations should just
|
|
// return DEBUG_STATUS_NO_CHANGE.
|
|
// Also, because some of the status
|
|
// notifications are very early or very
|
|
// late in the session lifetime there may not be
|
|
// current processes or threads when the notification
|
|
// is generated.
|
|
STDMETHOD(SessionStatus)(
|
|
THIS_
|
|
IN ULONG Status
|
|
) PURE;
|
|
|
|
// The following callbacks are informational
|
|
// callbacks notifying the provider about
|
|
// changes in debug state. The return value
|
|
// of these callbacks is ignored. Implementations
|
|
// can not call back into the engine.
|
|
|
|
// Debuggee state, such as registers or data spaces,
|
|
// has changed.
|
|
STDMETHOD(ChangeDebuggeeState)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG64 Argument
|
|
) PURE;
|
|
// Engine state has changed.
|
|
STDMETHOD(ChangeEngineState)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG64 Argument
|
|
) PURE;
|
|
// Symbol state has changed.
|
|
STDMETHOD(ChangeSymbolState)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG64 Argument
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugInputCallbacks.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugInputCallbacks
|
|
DECLARE_INTERFACE_(IDebugInputCallbacks, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugInputCallbacks.
|
|
|
|
// A call to the StartInput method is a request for
|
|
// a line of input from any client. The returned input
|
|
// should always be zero-terminated. The buffer size
|
|
// provided is only a guideline. A client can return
|
|
// more if necessary and the engine will truncate it
|
|
// before returning from IDebugControl::Input.
|
|
// The return value is ignored.
|
|
STDMETHOD(StartInput)(
|
|
THIS_
|
|
IN ULONG BufferSize
|
|
) PURE;
|
|
// The return value is ignored.
|
|
STDMETHOD(EndInput)(
|
|
THIS
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugOutputCallbacks.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugOutputCallbacks
|
|
DECLARE_INTERFACE_(IDebugOutputCallbacks, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugOutputCallbacks.
|
|
|
|
// This method is only called if the supplied mask
|
|
// is allowed by the clients output control.
|
|
// The return value is ignored.
|
|
STDMETHOD(Output)(
|
|
THIS_
|
|
IN ULONG Mask,
|
|
IN PCSTR Text
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugRegisters.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#define DEBUG_REGISTER_SUB_REGISTER 0x00000001
|
|
|
|
#define DEBUG_REGISTERS_DEFAULT 0x00000000
|
|
#define DEBUG_REGISTERS_INT32 0x00000001
|
|
#define DEBUG_REGISTERS_INT64 0x00000002
|
|
#define DEBUG_REGISTERS_FLOAT 0x00000004
|
|
#define DEBUG_REGISTERS_ALL 0x00000007
|
|
|
|
typedef struct _DEBUG_REGISTER_DESCRIPTION
|
|
{
|
|
// DEBUG_VALUE type.
|
|
ULONG Type;
|
|
ULONG Flags;
|
|
|
|
// If this is a subregister the full
|
|
// registers description index is
|
|
// given in SubregMaster. The length, mask
|
|
// and shift describe how the subregisters
|
|
// bits fit into the full register.
|
|
ULONG SubregMaster;
|
|
ULONG SubregLength;
|
|
ULONG64 SubregMask;
|
|
ULONG SubregShift;
|
|
|
|
ULONG Reserved0;
|
|
} DEBUG_REGISTER_DESCRIPTION, *PDEBUG_REGISTER_DESCRIPTION;
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugRegisters
|
|
DECLARE_INTERFACE_(IDebugRegisters, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugRegisters.
|
|
STDMETHOD(GetNumberRegisters)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetDescription)(
|
|
THIS_
|
|
IN ULONG Register,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize,
|
|
OUT OPTIONAL PDEBUG_REGISTER_DESCRIPTION Desc
|
|
) PURE;
|
|
STDMETHOD(GetIndexByName)(
|
|
THIS_
|
|
IN PCSTR Name,
|
|
OUT PULONG Index
|
|
) PURE;
|
|
|
|
STDMETHOD(GetValue)(
|
|
THIS_
|
|
IN ULONG Register,
|
|
OUT PDEBUG_VALUE Value
|
|
) PURE;
|
|
// SetValue makes a best effort at coercing
|
|
// the given value into the given registers
|
|
// value type. If the given value is larger
|
|
// than the register can hold the least
|
|
// significant bits will be dropped. Float
|
|
// to int and int to float will be done
|
|
// if necessary. Subregister bits will be
|
|
// inserted into the master register.
|
|
STDMETHOD(SetValue)(
|
|
THIS_
|
|
IN ULONG Register,
|
|
IN PDEBUG_VALUE Value
|
|
) PURE;
|
|
// Gets Count register values. If Indices is
|
|
// non-NULL it must contain Count register
|
|
// indices which control the registers affected.
|
|
// If Indices is NULL the registers from Start
|
|
// to Start + Count 1 are retrieved.
|
|
STDMETHOD(GetValues)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG Indices,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_VALUE Values
|
|
) PURE;
|
|
STDMETHOD(SetValues)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG Indices,
|
|
IN ULONG Start,
|
|
IN /* size_is(Count) */ PDEBUG_VALUE Values
|
|
) PURE;
|
|
|
|
// Outputs a group of registers in a well-formatted
|
|
// way thats specific to the platforms register set.
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputRegisters)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Abstracted pieces of processor information.
|
|
// The mapping of these values to architectural
|
|
// registers is architecture-specific and their
|
|
// interpretation and existence may vary. They
|
|
// are intended to be directly compatible with
|
|
// calls which take this information, such as
|
|
// stack walking.
|
|
STDMETHOD(GetInstructionOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(GetStackOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(GetFrameOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugSymbolGroup
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// OutputSymbols flags.
|
|
// Default output contains <Name>**NAME**<Offset>**OFF**<Value>**VALUE**
|
|
// per symbol.
|
|
#define DEBUG_OUTPUT_SYMBOLS_DEFAULT 0x00000000
|
|
#define DEBUG_OUTPUT_SYMBOLS_NO_NAMES 0x00000001
|
|
#define DEBUG_OUTPUT_SYMBOLS_NO_OFFSETS 0x00000002
|
|
#define DEBUG_OUTPUT_SYMBOLS_NO_VALUES 0x00000004
|
|
#define DEBUG_OUTPUT_SYMBOLS_NO_TYPES 0x00000010
|
|
|
|
#define DEBUG_OUTPUT_NAME_END "**NAME**"
|
|
#define DEBUG_OUTPUT_OFFSET_END "**OFF**"
|
|
#define DEBUG_OUTPUT_VALUE_END "**VALUE**"
|
|
#define DEBUG_OUTPUT_TYPE_END "**TYPE**"
|
|
|
|
// DEBUG_SYMBOL_PARAMETERS flags.
|
|
// Cumulative expansion level, takes four bits.
|
|
#define DEBUG_SYMBOL_EXPANSION_LEVEL_MASK 0x0000000f
|
|
// Symbols subelements follow.
|
|
#define DEBUG_SYMBOL_EXPANDED 0x00000010
|
|
// Symbols value is read-only.
|
|
#define DEBUG_SYMBOL_READ_ONLY 0x00000020
|
|
// Symbol subelements are array elements.
|
|
#define DEBUG_SYMBOL_IS_ARRAY 0x00000040
|
|
// Symbol is a float value.
|
|
#define DEBUG_SYMBOL_IS_FLOAT 0x00000080
|
|
// Symbol is a scope argument.
|
|
#define DEBUG_SYMBOL_IS_ARGUMENT 0x00000100
|
|
// Symbol is a scope argument.
|
|
#define DEBUG_SYMBOL_IS_LOCAL 0x00000200
|
|
|
|
typedef struct _DEBUG_SYMBOL_PARAMETERS
|
|
{
|
|
ULONG64 Module;
|
|
ULONG TypeId;
|
|
// ParentSymbol may be DEBUG_ANY_ID when unknown.
|
|
ULONG ParentSymbol;
|
|
// A subelement of a symbol can be a field, such
|
|
// as in structs, unions or classes; or an array
|
|
// element count for arrays.
|
|
ULONG SubElements;
|
|
ULONG Flags;
|
|
ULONG64 Reserved;
|
|
} DEBUG_SYMBOL_PARAMETERS, *PDEBUG_SYMBOL_PARAMETERS;
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugSymbolGroup
|
|
DECLARE_INTERFACE_(IDebugSymbolGroup, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugSymbolGroup.
|
|
STDMETHOD(GetNumberSymbols)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(AddSymbol)(
|
|
THIS_
|
|
IN PCSTR Name,
|
|
OUT PULONG Index
|
|
) PURE;
|
|
STDMETHOD(RemoveSymbolByName)(
|
|
THIS_
|
|
IN PCSTR Name
|
|
) PURE;
|
|
STDMETHOD(RemoveSymbolByIndex)(
|
|
THIS_
|
|
IN ULONG Index
|
|
) PURE;
|
|
STDMETHOD(GetSymbolName)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG NameSize
|
|
) PURE;
|
|
STDMETHOD(GetSymbolParameters)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT /* size_is(Count) */ PDEBUG_SYMBOL_PARAMETERS Params
|
|
) PURE;
|
|
STDMETHOD(ExpandSymbol)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN BOOL Expand
|
|
) PURE;
|
|
// Uses the line prefix.
|
|
STDMETHOD(OutputSymbols)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG Flags,
|
|
IN ULONG Start,
|
|
IN ULONG Count
|
|
) PURE;
|
|
STDMETHOD(WriteSymbol)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Value
|
|
) PURE;
|
|
STDMETHOD(OutputAsType)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN PCSTR Type
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugSymbols.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//
|
|
// Information about a module.
|
|
//
|
|
|
|
// Flags.
|
|
#define DEBUG_MODULE_LOADED 0x00000000
|
|
#define DEBUG_MODULE_UNLOADED 0x00000001
|
|
|
|
// Symbol types.
|
|
#define DEBUG_SYMTYPE_NONE 0
|
|
#define DEBUG_SYMTYPE_COFF 1
|
|
#define DEBUG_SYMTYPE_CODEVIEW 2
|
|
#define DEBUG_SYMTYPE_PDB 3
|
|
#define DEBUG_SYMTYPE_EXPORT 4
|
|
#define DEBUG_SYMTYPE_DEFERRED 5
|
|
#define DEBUG_SYMTYPE_SYM 6
|
|
#define DEBUG_SYMTYPE_DIA 7
|
|
|
|
typedef struct _DEBUG_MODULE_PARAMETERS
|
|
{
|
|
ULONG64 Base;
|
|
ULONG Size;
|
|
ULONG TimeDateStamp;
|
|
ULONG Checksum;
|
|
ULONG Flags;
|
|
ULONG SymbolType;
|
|
ULONG ImageNameSize;
|
|
ULONG ModuleNameSize;
|
|
ULONG LoadedImageNameSize;
|
|
ULONG SymbolFileNameSize;
|
|
ULONG MappedImageNameSize;
|
|
ULONG64 Reserved[2];
|
|
} DEBUG_MODULE_PARAMETERS, *PDEBUG_MODULE_PARAMETERS;
|
|
|
|
// Scope arguments are function arguments
|
|
// and thus only change when the scope
|
|
// crosses functions.
|
|
#define DEBUG_SCOPE_GROUP_ARGUMENTS 0x00000001
|
|
// Scope locals are locals declared in a particular
|
|
// scope and are only defined within that scope.
|
|
#define DEBUG_SCOPE_GROUP_LOCALS 0x00000002
|
|
// All symbols in the scope.
|
|
#define DEBUG_SCOPE_GROUP_ALL 0x00000003
|
|
|
|
// Typed data output control flags.
|
|
#define DEBUG_OUTTYPE_DEFAULT 0x00000000
|
|
#define DEBUG_OUTTYPE_NO_INDENT 0x00000001
|
|
#define DEBUG_OUTTYPE_NO_OFFSET 0x00000002
|
|
#define DEBUG_OUTTYPE_VERBOSE 0x00000004
|
|
#define DEBUG_OUTTYPE_COMPACT_OUTPUT 0x00000008
|
|
#define DEBUG_OUTTYPE_RECURSION_LEVEL(Max) (((Max) & 0xf) << 4)
|
|
#define DEBUG_OUTTYPE_ADDRESS_OF_FIELD 0x00010000
|
|
#define DEBUG_OUTTYPE_ADDRESS_AT_END 0x00020000
|
|
#define DEBUG_OUTTYPE_BLOCK_RECURSE 0x00200000
|
|
|
|
// FindSourceFile flags.
|
|
#define DEBUG_FIND_SOURCE_DEFAULT 0x00000000
|
|
// Returns fully-qualified paths only. If this
|
|
// is not set the path returned may be relative.
|
|
#define DEBUG_FIND_SOURCE_FULL_PATH 0x00000001
|
|
// Scans all the path elements for a match and
|
|
// returns the one that has the most similarity
|
|
// between the given file and the matching element.
|
|
#define DEBUG_FIND_SOURCE_BEST_MATCH 0x00000002
|
|
|
|
// A special value marking an offset that should not
|
|
// be treated as a valid offset. This is only used
|
|
// in special situations where it is unlikely that
|
|
// this value would be a valid offset.
|
|
#define DEBUG_INVALID_OFFSET ((ULONG64)-1)
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugSymbols
|
|
DECLARE_INTERFACE_(IDebugSymbols, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugSymbols.
|
|
|
|
// Controls the symbol options used during
|
|
// symbol operations.
|
|
// Uses the same flags as dbghelps SymSetOptions.
|
|
STDMETHOD(GetSymbolOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddSymbolOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveSymbolOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetSymbolOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
|
|
STDMETHOD(GetNameByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize,
|
|
OUT OPTIONAL PULONG64 Displacement
|
|
) PURE;
|
|
// A symbol name may not be unique, particularly
|
|
// when overloaded functions exist which all
|
|
// have the same name. If GetOffsetByName
|
|
// finds multiple matches for the name it
|
|
// can return any one of them. In that
|
|
// case it will return S_FALSE to indicate
|
|
// that ambiguity was arbitrarily resolved.
|
|
// A caller can then use SearchSymbols to
|
|
// find all of the matches if it wishes to
|
|
// perform different disambiguation.
|
|
STDMETHOD(GetOffsetByName)(
|
|
THIS_
|
|
IN PCSTR Symbol,
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// GetNearNameByOffset returns symbols
|
|
// located near the symbol closest to
|
|
// to the offset, such as the previous
|
|
// or next symbol. If Delta is zero it
|
|
// operates identically to GetNameByOffset.
|
|
// If Delta is nonzero and such a symbol
|
|
// does not exist an error is returned.
|
|
// The next symbol, if one exists, will
|
|
// always have a higher offset than the
|
|
// input offset so the displacement is
|
|
// always negative. The situation is
|
|
// reversed for the previous symbol.
|
|
STDMETHOD(GetNearNameByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN LONG Delta,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize,
|
|
OUT OPTIONAL PULONG64 Displacement
|
|
) PURE;
|
|
|
|
STDMETHOD(GetLineByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT OPTIONAL PULONG Line,
|
|
OUT OPTIONAL PSTR FileBuffer,
|
|
IN ULONG FileBufferSize,
|
|
OUT OPTIONAL PULONG FileSize,
|
|
OUT OPTIONAL PULONG64 Displacement
|
|
) PURE;
|
|
STDMETHOD(GetOffsetByLine)(
|
|
THIS_
|
|
IN ULONG Line,
|
|
IN PCSTR File,
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
|
|
// Enumerates the engines list of modules
|
|
// loaded for the current process. This may
|
|
// or may not match the system module list
|
|
// for the process. Reload can be used to
|
|
// synchronize the engines list with the system
|
|
// if necessary.
|
|
// Some sessions also track recently unloaded
|
|
// code modules for help in analyzing failures
|
|
// where an attempt is made to call unloaded code.
|
|
// These modules are indexed after the loaded
|
|
// modules.
|
|
STDMETHOD(GetNumberModules)(
|
|
THIS_
|
|
OUT PULONG Loaded,
|
|
OUT PULONG Unloaded
|
|
) PURE;
|
|
STDMETHOD(GetModuleByIndex)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT PULONG64 Base
|
|
) PURE;
|
|
// The module name may not be unique.
|
|
// This method returns the first match.
|
|
STDMETHOD(GetModuleByModuleName)(
|
|
THIS_
|
|
IN PCSTR Name,
|
|
IN ULONG StartIndex,
|
|
OUT OPTIONAL PULONG Index,
|
|
OUT OPTIONAL PULONG64 Base
|
|
) PURE;
|
|
// Offset can be any offset within
|
|
// the module extent. Extents may
|
|
// not be unique when including unloaded
|
|
// drivers. This method returns the
|
|
// first match.
|
|
STDMETHOD(GetModuleByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG StartIndex,
|
|
OUT OPTIONAL PULONG Index,
|
|
OUT OPTIONAL PULONG64 Base
|
|
) PURE;
|
|
// If Index is DEBUG_ANY_ID the base address
|
|
// is used to look up the module instead.
|
|
STDMETHOD(GetModuleNames)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN ULONG64 Base,
|
|
OUT OPTIONAL PSTR ImageNameBuffer,
|
|
IN ULONG ImageNameBufferSize,
|
|
OUT OPTIONAL PULONG ImageNameSize,
|
|
OUT OPTIONAL PSTR ModuleNameBuffer,
|
|
IN ULONG ModuleNameBufferSize,
|
|
OUT OPTIONAL PULONG ModuleNameSize,
|
|
OUT OPTIONAL PSTR LoadedImageNameBuffer,
|
|
IN ULONG LoadedImageNameBufferSize,
|
|
OUT OPTIONAL PULONG LoadedImageNameSize
|
|
) PURE;
|
|
STDMETHOD(GetModuleParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG64 Bases,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_MODULE_PARAMETERS Params
|
|
) PURE;
|
|
// Looks up the module from a <Module>!<Symbol>
|
|
// string.
|
|
STDMETHOD(GetSymbolModule)(
|
|
THIS_
|
|
IN PCSTR Symbol,
|
|
OUT PULONG64 Base
|
|
) PURE;
|
|
|
|
// Returns the string name of a type.
|
|
STDMETHOD(GetTypeName)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize
|
|
) PURE;
|
|
// Returns the ID for a type name.
|
|
STDMETHOD(GetTypeId)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN PCSTR Name,
|
|
OUT PULONG TypeId
|
|
) PURE;
|
|
STDMETHOD(GetTypeSize)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT PULONG Size
|
|
) PURE;
|
|
// Given a type which can contain members
|
|
// this method returns the offset of a
|
|
// particular member within the type.
|
|
// TypeId should give the container type ID
|
|
// and Field gives the dot-separated path
|
|
// to the field of interest.
|
|
STDMETHOD(GetFieldOffset)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN PCSTR Field,
|
|
OUT PULONG Offset
|
|
) PURE;
|
|
|
|
STDMETHOD(GetSymbolTypeId)(
|
|
THIS_
|
|
IN PCSTR Symbol,
|
|
OUT PULONG TypeId,
|
|
OUT OPTIONAL PULONG64 Module
|
|
) PURE;
|
|
// As with GetOffsetByName a symbol's
|
|
// name may be ambiguous. GetOffsetTypeId
|
|
// returns the type for the symbol closest
|
|
// to the given offset and can be used
|
|
// to avoid ambiguity.
|
|
STDMETHOD(GetOffsetTypeId)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG TypeId,
|
|
OUT OPTIONAL PULONG64 Module
|
|
) PURE;
|
|
|
|
// Helpers for virtual and physical data
|
|
// which combine creation of a location with
|
|
// the actual operation.
|
|
STDMETHOD(ReadTypedDataVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteTypedDataVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(OutputTypedDataVirtual)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
STDMETHOD(ReadTypedDataPhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteTypedDataPhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(OutputTypedDataPhysical)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Function arguments and scope block symbols
|
|
// can be retrieved relative to currently
|
|
// executing code. A caller can provide just
|
|
// a code offset for scoping purposes and look
|
|
// up names or the caller can provide a full frame
|
|
// and look up actual values. The values for
|
|
// scoped symbols are best-guess and may or may not
|
|
// be accurate depending on program optimizations,
|
|
// the machine architecture, the current point
|
|
// in the programs execution and so on.
|
|
// A caller can also provide a complete register
|
|
// context for setting a scope to a previous
|
|
// machine state such as a context saved for
|
|
// an exception. Usually this isnt necessary
|
|
// and the current register context is used.
|
|
STDMETHOD(GetScope)(
|
|
THIS_
|
|
OUT OPTIONAL PULONG64 InstructionOffset,
|
|
OUT OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
|
|
OUT OPTIONAL PVOID ScopeContext,
|
|
IN ULONG ScopeContextSize
|
|
) PURE;
|
|
// If ScopeFrame or ScopeContext is non-NULL then
|
|
// InstructionOffset is ignored.
|
|
// If ScopeContext is NULL the current
|
|
// register context is used.
|
|
// If the scope identified by the given
|
|
// information is the same as before
|
|
// SetScope returns S_OK. If the scope
|
|
// information changes, such as when the
|
|
// scope moves between functions or scope
|
|
// blocks, SetScope returns S_FALSE.
|
|
STDMETHOD(SetScope)(
|
|
THIS_
|
|
IN ULONG64 InstructionOffset,
|
|
IN OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
|
|
IN OPTIONAL PVOID ScopeContext,
|
|
IN ULONG ScopeContextSize
|
|
) PURE;
|
|
// ResetScope clears the scope information
|
|
// for situations where scoped symbols
|
|
// mask global symbols or when resetting
|
|
// from explicit information to the current
|
|
// information.
|
|
STDMETHOD(ResetScope)(
|
|
THIS
|
|
) PURE;
|
|
// A scope symbol is tied to its particular
|
|
// scope and only is meaningful within the scope.
|
|
// The returned group can be updated by passing it back
|
|
// into the method for lower-cost
|
|
// incremental updates when stepping.
|
|
STDMETHOD(GetScopeSymbolGroup)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN OPTIONAL PDEBUG_SYMBOL_GROUP Update,
|
|
OUT PDEBUG_SYMBOL_GROUP* Symbols
|
|
) PURE;
|
|
|
|
// Create a new symbol group.
|
|
STDMETHOD(CreateSymbolGroup)(
|
|
THIS_
|
|
OUT PDEBUG_SYMBOL_GROUP* Group
|
|
) PURE;
|
|
|
|
// StartSymbolMatch matches symbol names
|
|
// against the given pattern using simple
|
|
// regular expressions. The search results
|
|
// are iterated through using GetNextSymbolMatch.
|
|
// When the caller is done examining results
|
|
// the match should be freed via EndSymbolMatch.
|
|
// If the match pattern contains a module name
|
|
// the search is restricted to a single module.
|
|
// Pattern matching is only done on symbol names,
|
|
// not module names.
|
|
// All active symbol match handles are invalidated
|
|
// when the set of loaded symbols changes.
|
|
STDMETHOD(StartSymbolMatch)(
|
|
THIS_
|
|
IN PCSTR Pattern,
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// If Buffer is NULL the match does not
|
|
// advance.
|
|
STDMETHOD(GetNextSymbolMatch)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG MatchSize,
|
|
OUT OPTIONAL PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(EndSymbolMatch)(
|
|
THIS_
|
|
IN ULONG64 Handle
|
|
) PURE;
|
|
|
|
STDMETHOD(Reload)(
|
|
THIS_
|
|
IN PCSTR Module
|
|
) PURE;
|
|
|
|
STDMETHOD(GetSymbolPath)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PathSize
|
|
) PURE;
|
|
STDMETHOD(SetSymbolPath)(
|
|
THIS_
|
|
IN PCSTR Path
|
|
) PURE;
|
|
STDMETHOD(AppendSymbolPath)(
|
|
THIS_
|
|
IN PCSTR Addition
|
|
) PURE;
|
|
|
|
// Manipulate the path for executable images.
|
|
// Some dump files need to load executable images
|
|
// in order to resolve dump information. This
|
|
// path controls where the engine looks for
|
|
// images.
|
|
STDMETHOD(GetImagePath)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PathSize
|
|
) PURE;
|
|
STDMETHOD(SetImagePath)(
|
|
THIS_
|
|
IN PCSTR Path
|
|
) PURE;
|
|
STDMETHOD(AppendImagePath)(
|
|
THIS_
|
|
IN PCSTR Addition
|
|
) PURE;
|
|
|
|
// Path routines for source file location
|
|
// methods.
|
|
STDMETHOD(GetSourcePath)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PathSize
|
|
) PURE;
|
|
// Gets the nth part of the source path.
|
|
STDMETHOD(GetSourcePathElement)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ElementSize
|
|
) PURE;
|
|
STDMETHOD(SetSourcePath)(
|
|
THIS_
|
|
IN PCSTR Path
|
|
) PURE;
|
|
STDMETHOD(AppendSourcePath)(
|
|
THIS_
|
|
IN PCSTR Addition
|
|
) PURE;
|
|
// Uses the given file path and the source path
|
|
// information to try and locate an existing file.
|
|
// The given file path is merged with elements
|
|
// of the source path and checked for existence.
|
|
// If a match is found the element used is returned.
|
|
// A starting element can be specified to restrict
|
|
// the search to a subset of the path elements;
|
|
// this can be useful when checking for multiple
|
|
// matches along the source path.
|
|
// The returned element can be 1, indicating
|
|
// the file was found directly and not on the path.
|
|
STDMETHOD(FindSourceFile)(
|
|
THIS_
|
|
IN ULONG StartElement,
|
|
IN PCSTR File,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PULONG FoundElement,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG FoundSize
|
|
) PURE;
|
|
// Retrieves all the line offset information
|
|
// for a particular source file. Buffer is
|
|
// first intialized to DEBUG_INVALID_OFFSET for
|
|
// every entry. Then for each piece of line
|
|
// symbol information Buffer[Line] set to
|
|
// Lines offset. This produces a per-line
|
|
// map of the offsets for the lines of the
|
|
// given file. Line numbers are decremented
|
|
// for the map so Buffer[0] contains the offset
|
|
// for line number 1.
|
|
// If there is no line information at all for
|
|
// the given file the method fails rather
|
|
// than returning a map of invalid offsets.
|
|
STDMETHOD(GetSourceFileLineOffsets)(
|
|
THIS_
|
|
IN PCSTR File,
|
|
OUT OPTIONAL /* size_is(BufferLines) */ PULONG64 Buffer,
|
|
IN ULONG BufferLines,
|
|
OUT OPTIONAL PULONG FileLines
|
|
) PURE;
|
|
};
|
|
|
|
//
|
|
// GetModuleNameString strings.
|
|
//
|
|
|
|
#define DEBUG_MODNAME_IMAGE 0x00000000
|
|
#define DEBUG_MODNAME_MODULE 0x00000001
|
|
#define DEBUG_MODNAME_LOADED_IMAGE 0x00000002
|
|
#define DEBUG_MODNAME_SYMBOL_FILE 0x00000003
|
|
#define DEBUG_MODNAME_MAPPED_IMAGE 0x00000004
|
|
|
|
//
|
|
// Type options, used with Get/SetTypeOptions.
|
|
//
|
|
|
|
// Display PUSHORT and USHORT arrays in UNICODE
|
|
#define DEBUG_TYPEOPTS_UNICODE_DISPLAY 0x00000001
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugSymbols2
|
|
DECLARE_INTERFACE_(IDebugSymbols2, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugSymbols.
|
|
|
|
// Controls the symbol options used during
|
|
// symbol operations.
|
|
// Uses the same flags as dbghelps SymSetOptions.
|
|
STDMETHOD(GetSymbolOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddSymbolOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveSymbolOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetSymbolOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
|
|
STDMETHOD(GetNameByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize,
|
|
OUT OPTIONAL PULONG64 Displacement
|
|
) PURE;
|
|
// A symbol name may not be unique, particularly
|
|
// when overloaded functions exist which all
|
|
// have the same name. If GetOffsetByName
|
|
// finds multiple matches for the name it
|
|
// can return any one of them. In that
|
|
// case it will return S_FALSE to indicate
|
|
// that ambiguity was arbitrarily resolved.
|
|
// A caller can then use SearchSymbols to
|
|
// find all of the matches if it wishes to
|
|
// perform different disambiguation.
|
|
STDMETHOD(GetOffsetByName)(
|
|
THIS_
|
|
IN PCSTR Symbol,
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// GetNearNameByOffset returns symbols
|
|
// located near the symbol closest to
|
|
// to the offset, such as the previous
|
|
// or next symbol. If Delta is zero it
|
|
// operates identically to GetNameByOffset.
|
|
// If Delta is nonzero and such a symbol
|
|
// does not exist an error is returned.
|
|
// The next symbol, if one exists, will
|
|
// always have a higher offset than the
|
|
// input offset so the displacement is
|
|
// always negative. The situation is
|
|
// reversed for the previous symbol.
|
|
STDMETHOD(GetNearNameByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN LONG Delta,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize,
|
|
OUT OPTIONAL PULONG64 Displacement
|
|
) PURE;
|
|
|
|
STDMETHOD(GetLineByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT OPTIONAL PULONG Line,
|
|
OUT OPTIONAL PSTR FileBuffer,
|
|
IN ULONG FileBufferSize,
|
|
OUT OPTIONAL PULONG FileSize,
|
|
OUT OPTIONAL PULONG64 Displacement
|
|
) PURE;
|
|
STDMETHOD(GetOffsetByLine)(
|
|
THIS_
|
|
IN ULONG Line,
|
|
IN PCSTR File,
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
|
|
// Enumerates the engines list of modules
|
|
// loaded for the current process. This may
|
|
// or may not match the system module list
|
|
// for the process. Reload can be used to
|
|
// synchronize the engines list with the system
|
|
// if necessary.
|
|
// Some sessions also track recently unloaded
|
|
// code modules for help in analyzing failures
|
|
// where an attempt is made to call unloaded code.
|
|
// These modules are indexed after the loaded
|
|
// modules.
|
|
STDMETHOD(GetNumberModules)(
|
|
THIS_
|
|
OUT PULONG Loaded,
|
|
OUT PULONG Unloaded
|
|
) PURE;
|
|
STDMETHOD(GetModuleByIndex)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT PULONG64 Base
|
|
) PURE;
|
|
// The module name may not be unique.
|
|
// This method returns the first match.
|
|
STDMETHOD(GetModuleByModuleName)(
|
|
THIS_
|
|
IN PCSTR Name,
|
|
IN ULONG StartIndex,
|
|
OUT OPTIONAL PULONG Index,
|
|
OUT OPTIONAL PULONG64 Base
|
|
) PURE;
|
|
// Offset can be any offset within
|
|
// the module extent. Extents may
|
|
// not be unique when including unloaded
|
|
// drivers. This method returns the
|
|
// first match.
|
|
STDMETHOD(GetModuleByOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG StartIndex,
|
|
OUT OPTIONAL PULONG Index,
|
|
OUT OPTIONAL PULONG64 Base
|
|
) PURE;
|
|
// If Index is DEBUG_ANY_ID the base address
|
|
// is used to look up the module instead.
|
|
STDMETHOD(GetModuleNames)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN ULONG64 Base,
|
|
OUT OPTIONAL PSTR ImageNameBuffer,
|
|
IN ULONG ImageNameBufferSize,
|
|
OUT OPTIONAL PULONG ImageNameSize,
|
|
OUT OPTIONAL PSTR ModuleNameBuffer,
|
|
IN ULONG ModuleNameBufferSize,
|
|
OUT OPTIONAL PULONG ModuleNameSize,
|
|
OUT OPTIONAL PSTR LoadedImageNameBuffer,
|
|
IN ULONG LoadedImageNameBufferSize,
|
|
OUT OPTIONAL PULONG LoadedImageNameSize
|
|
) PURE;
|
|
STDMETHOD(GetModuleParameters)(
|
|
THIS_
|
|
IN ULONG Count,
|
|
IN OPTIONAL /* size_is(Count) */ PULONG64 Bases,
|
|
IN ULONG Start,
|
|
OUT /* size_is(Count) */ PDEBUG_MODULE_PARAMETERS Params
|
|
) PURE;
|
|
// Looks up the module from a <Module>!<Symbol>
|
|
// string.
|
|
STDMETHOD(GetSymbolModule)(
|
|
THIS_
|
|
IN PCSTR Symbol,
|
|
OUT PULONG64 Base
|
|
) PURE;
|
|
|
|
// Returns the string name of a type.
|
|
STDMETHOD(GetTypeName)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize
|
|
) PURE;
|
|
// Returns the ID for a type name.
|
|
STDMETHOD(GetTypeId)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN PCSTR Name,
|
|
OUT PULONG TypeId
|
|
) PURE;
|
|
STDMETHOD(GetTypeSize)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT PULONG Size
|
|
) PURE;
|
|
// Given a type which can contain members
|
|
// this method returns the offset of a
|
|
// particular member within the type.
|
|
// TypeId should give the container type ID
|
|
// and Field gives the dot-separated path
|
|
// to the field of interest.
|
|
STDMETHOD(GetFieldOffset)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN PCSTR Field,
|
|
OUT PULONG Offset
|
|
) PURE;
|
|
|
|
STDMETHOD(GetSymbolTypeId)(
|
|
THIS_
|
|
IN PCSTR Symbol,
|
|
OUT PULONG TypeId,
|
|
OUT OPTIONAL PULONG64 Module
|
|
) PURE;
|
|
// As with GetOffsetByName a symbol's
|
|
// name may be ambiguous. GetOffsetTypeId
|
|
// returns the type for the symbol closest
|
|
// to the given offset and can be used
|
|
// to avoid ambiguity.
|
|
STDMETHOD(GetOffsetTypeId)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG TypeId,
|
|
OUT OPTIONAL PULONG64 Module
|
|
) PURE;
|
|
|
|
// Helpers for virtual and physical data
|
|
// which combine creation of a location with
|
|
// the actual operation.
|
|
STDMETHOD(ReadTypedDataVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteTypedDataVirtual)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(OutputTypedDataVirtual)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
STDMETHOD(ReadTypedDataPhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
OUT PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesRead
|
|
) PURE;
|
|
STDMETHOD(WriteTypedDataPhysical)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG BytesWritten
|
|
) PURE;
|
|
STDMETHOD(OutputTypedDataPhysical)(
|
|
THIS_
|
|
IN ULONG OutputControl,
|
|
IN ULONG64 Offset,
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN ULONG Flags
|
|
) PURE;
|
|
|
|
// Function arguments and scope block symbols
|
|
// can be retrieved relative to currently
|
|
// executing code. A caller can provide just
|
|
// a code offset for scoping purposes and look
|
|
// up names or the caller can provide a full frame
|
|
// and look up actual values. The values for
|
|
// scoped symbols are best-guess and may or may not
|
|
// be accurate depending on program optimizations,
|
|
// the machine architecture, the current point
|
|
// in the programs execution and so on.
|
|
// A caller can also provide a complete register
|
|
// context for setting a scope to a previous
|
|
// machine state such as a context saved for
|
|
// an exception. Usually this isnt necessary
|
|
// and the current register context is used.
|
|
STDMETHOD(GetScope)(
|
|
THIS_
|
|
OUT OPTIONAL PULONG64 InstructionOffset,
|
|
OUT OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
|
|
OUT OPTIONAL PVOID ScopeContext,
|
|
IN ULONG ScopeContextSize
|
|
) PURE;
|
|
// If ScopeFrame or ScopeContext is non-NULL then
|
|
// InstructionOffset is ignored.
|
|
// If ScopeContext is NULL the current
|
|
// register context is used.
|
|
// If the scope identified by the given
|
|
// information is the same as before
|
|
// SetScope returns S_OK. If the scope
|
|
// information changes, such as when the
|
|
// scope moves between functions or scope
|
|
// blocks, SetScope returns S_FALSE.
|
|
STDMETHOD(SetScope)(
|
|
THIS_
|
|
IN ULONG64 InstructionOffset,
|
|
IN OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
|
|
IN OPTIONAL PVOID ScopeContext,
|
|
IN ULONG ScopeContextSize
|
|
) PURE;
|
|
// ResetScope clears the scope information
|
|
// for situations where scoped symbols
|
|
// mask global symbols or when resetting
|
|
// from explicit information to the current
|
|
// information.
|
|
STDMETHOD(ResetScope)(
|
|
THIS
|
|
) PURE;
|
|
// A scope symbol is tied to its particular
|
|
// scope and only is meaningful within the scope.
|
|
// The returned group can be updated by passing it back
|
|
// into the method for lower-cost
|
|
// incremental updates when stepping.
|
|
STDMETHOD(GetScopeSymbolGroup)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN OPTIONAL PDEBUG_SYMBOL_GROUP Update,
|
|
OUT PDEBUG_SYMBOL_GROUP* Symbols
|
|
) PURE;
|
|
|
|
// Create a new symbol group.
|
|
STDMETHOD(CreateSymbolGroup)(
|
|
THIS_
|
|
OUT PDEBUG_SYMBOL_GROUP* Group
|
|
) PURE;
|
|
|
|
// StartSymbolMatch matches symbol names
|
|
// against the given pattern using simple
|
|
// regular expressions. The search results
|
|
// are iterated through using GetNextSymbolMatch.
|
|
// When the caller is done examining results
|
|
// the match should be freed via EndSymbolMatch.
|
|
// If the match pattern contains a module name
|
|
// the search is restricted to a single module.
|
|
// Pattern matching is only done on symbol names,
|
|
// not module names.
|
|
// All active symbol match handles are invalidated
|
|
// when the set of loaded symbols changes.
|
|
STDMETHOD(StartSymbolMatch)(
|
|
THIS_
|
|
IN PCSTR Pattern,
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// If Buffer is NULL the match does not
|
|
// advance.
|
|
STDMETHOD(GetNextSymbolMatch)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG MatchSize,
|
|
OUT OPTIONAL PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(EndSymbolMatch)(
|
|
THIS_
|
|
IN ULONG64 Handle
|
|
) PURE;
|
|
|
|
STDMETHOD(Reload)(
|
|
THIS_
|
|
IN PCSTR Module
|
|
) PURE;
|
|
|
|
STDMETHOD(GetSymbolPath)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PathSize
|
|
) PURE;
|
|
STDMETHOD(SetSymbolPath)(
|
|
THIS_
|
|
IN PCSTR Path
|
|
) PURE;
|
|
STDMETHOD(AppendSymbolPath)(
|
|
THIS_
|
|
IN PCSTR Addition
|
|
) PURE;
|
|
|
|
// Manipulate the path for executable images.
|
|
// Some dump files need to load executable images
|
|
// in order to resolve dump information. This
|
|
// path controls where the engine looks for
|
|
// images.
|
|
STDMETHOD(GetImagePath)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PathSize
|
|
) PURE;
|
|
STDMETHOD(SetImagePath)(
|
|
THIS_
|
|
IN PCSTR Path
|
|
) PURE;
|
|
STDMETHOD(AppendImagePath)(
|
|
THIS_
|
|
IN PCSTR Addition
|
|
) PURE;
|
|
|
|
// Path routines for source file location
|
|
// methods.
|
|
STDMETHOD(GetSourcePath)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG PathSize
|
|
) PURE;
|
|
// Gets the nth part of the source path.
|
|
STDMETHOD(GetSourcePathElement)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ElementSize
|
|
) PURE;
|
|
STDMETHOD(SetSourcePath)(
|
|
THIS_
|
|
IN PCSTR Path
|
|
) PURE;
|
|
STDMETHOD(AppendSourcePath)(
|
|
THIS_
|
|
IN PCSTR Addition
|
|
) PURE;
|
|
// Uses the given file path and the source path
|
|
// information to try and locate an existing file.
|
|
// The given file path is merged with elements
|
|
// of the source path and checked for existence.
|
|
// If a match is found the element used is returned.
|
|
// A starting element can be specified to restrict
|
|
// the search to a subset of the path elements;
|
|
// this can be useful when checking for multiple
|
|
// matches along the source path.
|
|
// The returned element can be 1, indicating
|
|
// the file was found directly and not on the path.
|
|
STDMETHOD(FindSourceFile)(
|
|
THIS_
|
|
IN ULONG StartElement,
|
|
IN PCSTR File,
|
|
IN ULONG Flags,
|
|
OUT OPTIONAL PULONG FoundElement,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG FoundSize
|
|
) PURE;
|
|
// Retrieves all the line offset information
|
|
// for a particular source file. Buffer is
|
|
// first intialized to DEBUG_INVALID_OFFSET for
|
|
// every entry. Then for each piece of line
|
|
// symbol information Buffer[Line] set to
|
|
// Lines offset. This produces a per-line
|
|
// map of the offsets for the lines of the
|
|
// given file. Line numbers are decremented
|
|
// for the map so Buffer[0] contains the offset
|
|
// for line number 1.
|
|
// If there is no line information at all for
|
|
// the given file the method fails rather
|
|
// than returning a map of invalid offsets.
|
|
STDMETHOD(GetSourceFileLineOffsets)(
|
|
THIS_
|
|
IN PCSTR File,
|
|
OUT OPTIONAL /* size_is(BufferLines) */ PULONG64 Buffer,
|
|
IN ULONG BufferLines,
|
|
OUT OPTIONAL PULONG FileLines
|
|
) PURE;
|
|
|
|
// IDebugSymbols2.
|
|
|
|
// If Index is DEBUG_ANY_ID the base address
|
|
// is used to look up the module instead.
|
|
// Item is specified as in VerQueryValue.
|
|
// Module version information is only
|
|
// available for loaded modules and may
|
|
// not be available in all debug sessions.
|
|
STDMETHOD(GetModuleVersionInformation)(
|
|
THIS_
|
|
IN ULONG Index,
|
|
IN ULONG64 Base,
|
|
IN PCSTR Item,
|
|
OUT OPTIONAL PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG VerInfoSize
|
|
) PURE;
|
|
// Retrieves any available module name string
|
|
// such as module name or symbol file name.
|
|
// If Index is DEBUG_ANY_ID the base address
|
|
// is used to look up the module instead.
|
|
// If symbols are deferred an error will
|
|
// be returned.
|
|
// E_NOINTERFACE may be returned, indicating
|
|
// no information exists.
|
|
STDMETHOD(GetModuleNameString)(
|
|
THIS_
|
|
IN ULONG Which,
|
|
IN ULONG Index,
|
|
IN ULONG64 Base,
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG NameSize
|
|
) PURE;
|
|
|
|
// Returns the string name of a constant type.
|
|
STDMETHOD(GetConstantName)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN ULONG64 Value,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize
|
|
) PURE;
|
|
|
|
// Gets name of a field in a struct
|
|
// FieldNumber is 0 based index of field in a struct
|
|
// Method fails with E_INVALIDARG if FieldNumber is
|
|
// too high for the struct fields
|
|
STDMETHOD(GetFieldName)(
|
|
THIS_
|
|
IN ULONG64 Module,
|
|
IN ULONG TypeId,
|
|
IN ULONG FieldIndex,
|
|
OUT OPTIONAL PSTR NameBuffer,
|
|
IN ULONG NameBufferSize,
|
|
OUT OPTIONAL PULONG NameSize
|
|
) PURE;
|
|
|
|
// Control options for typed values.
|
|
STDMETHOD(GetTypeOptions)(
|
|
THIS_
|
|
OUT PULONG Options
|
|
) PURE;
|
|
STDMETHOD(AddTypeOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(RemoveTypeOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
STDMETHOD(SetTypeOptions)(
|
|
THIS_
|
|
IN ULONG Options
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// IDebugSystemObjects
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugSystemObjects
|
|
DECLARE_INTERFACE_(IDebugSystemObjects, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugSystemObjects.
|
|
|
|
// In user mode debugging the debugger
|
|
// tracks all threads and processes and
|
|
// enumerates them through the following
|
|
// methods. When enumerating threads
|
|
// the threads are enumerated for the current
|
|
// process.
|
|
// Kernel mode debugging currently is
|
|
// limited to enumerating only the threads
|
|
// assigned to processors, not all of
|
|
// the threads in the system. Process
|
|
// enumeration is limited to a single
|
|
// virtual process representing kernel space.
|
|
|
|
// Returns the ID of the thread on which
|
|
// the last event occurred.
|
|
STDMETHOD(GetEventThread)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(GetEventProcess)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
|
|
// Controls implicit thread used by the
|
|
// debug engine. The debuggers current
|
|
// thread is just a piece of data held
|
|
// by the debugger for calls which use
|
|
// thread-specific information. In those
|
|
// calls the debuggers current thread is used.
|
|
// The debuggers current thread is not related
|
|
// to any system thread attribute.
|
|
// IDs for threads are small integer IDs
|
|
// maintained by the engine. They are not
|
|
// related to system thread IDs.
|
|
STDMETHOD(GetCurrentThreadId)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(SetCurrentThreadId)(
|
|
THIS_
|
|
IN ULONG Id
|
|
) PURE;
|
|
// The current process is the process
|
|
// that owns the current thread.
|
|
STDMETHOD(GetCurrentProcessId)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Setting the current process automatically
|
|
// sets the current thread to the thread that
|
|
// was last current in that process.
|
|
STDMETHOD(SetCurrentProcessId)(
|
|
THIS_
|
|
IN ULONG Id
|
|
) PURE;
|
|
|
|
// Gets the number of threads in the current process.
|
|
STDMETHOD(GetNumberThreads)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
// Gets thread count information for all processes
|
|
// and the largest number of threads in a single process.
|
|
STDMETHOD(GetTotalNumberThreads)(
|
|
THIS_
|
|
OUT PULONG Total,
|
|
OUT PULONG LargestProcess
|
|
) PURE;
|
|
STDMETHOD(GetThreadIdsByIndex)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
|
|
) PURE;
|
|
// Gets the debugger ID for the thread
|
|
// currently running on the given
|
|
// processor. Only works in kernel
|
|
// debugging.
|
|
STDMETHOD(GetThreadIdByProcessor)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the offset of the current threads
|
|
// system data structure. When kernel debugging
|
|
// this is the offset of the KTHREAD.
|
|
// When user debugging it is the offset
|
|
// of the current TEB.
|
|
STDMETHOD(GetCurrentThreadDataOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given
|
|
// system thread data structure.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdByDataOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the offset of the current threads
|
|
// TEB. In user mode this is equivalent to
|
|
// the threads data offset.
|
|
STDMETHOD(GetCurrentThreadTeb)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given TEB.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdByTeb)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the system unique ID for the current thread.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetCurrentThreadSystemId)(
|
|
THIS_
|
|
OUT PULONG SysId
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given
|
|
// system thread ID.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdBySystemId)(
|
|
THIS_
|
|
IN ULONG SysId,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the handle of the current thread.
|
|
// In kernel mode the value returned is the
|
|
// index of the processor the thread is
|
|
// executing on plus one.
|
|
STDMETHOD(GetCurrentThreadHandle)(
|
|
THIS_
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given handle.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdByHandle)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
|
|
// Currently kernel mode sessions will only have
|
|
// a single process representing kernel space.
|
|
STDMETHOD(GetNumberProcesses)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetProcessIdsByIndex)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
|
|
) PURE;
|
|
// Returns the offset of the current processs
|
|
// system data structure. When kernel debugging
|
|
// this is the offset of the KPROCESS of
|
|
// the process that owns the current thread.
|
|
// When user debugging it is the offset
|
|
// of the current PEB.
|
|
STDMETHOD(GetCurrentProcessDataOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given
|
|
// system process data structure.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetProcessIdByDataOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the offset of the current processs
|
|
// PEB. In user mode this is equivalent to
|
|
// the processs data offset.
|
|
STDMETHOD(GetCurrentProcessPeb)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given PEB.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetProcessIdByPeb)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the system unique ID for the current process.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetCurrentProcessSystemId)(
|
|
THIS_
|
|
OUT PULONG SysId
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given
|
|
// system process ID.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetProcessIdBySystemId)(
|
|
THIS_
|
|
IN ULONG SysId,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the handle of the current process.
|
|
// In kernel mode this is the kernel processs
|
|
// artificial handle used for symbol operations
|
|
// and so can only be used with dbghelp APIs.
|
|
STDMETHOD(GetCurrentProcessHandle)(
|
|
THIS_
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given handle.
|
|
STDMETHOD(GetProcessIdByHandle)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Retrieve the name of the executable loaded
|
|
// in the process. This may fail if no executable
|
|
// was identified.
|
|
STDMETHOD(GetCurrentProcessExecutableName)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ExeSize
|
|
) PURE;
|
|
};
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IDebugSystemObjects2
|
|
DECLARE_INTERFACE_(IDebugSystemObjects2, IUnknown)
|
|
{
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
) PURE;
|
|
STDMETHOD_(ULONG, AddRef)(
|
|
THIS
|
|
) PURE;
|
|
STDMETHOD_(ULONG, Release)(
|
|
THIS
|
|
) PURE;
|
|
|
|
// IDebugSystemObjects.
|
|
|
|
// In user mode debugging the debugger
|
|
// tracks all threads and processes and
|
|
// enumerates them through the following
|
|
// methods. When enumerating threads
|
|
// the threads are enumerated for the current
|
|
// process.
|
|
// Kernel mode debugging currently is
|
|
// limited to enumerating only the threads
|
|
// assigned to processors, not all of
|
|
// the threads in the system. Process
|
|
// enumeration is limited to a single
|
|
// virtual process representing kernel space.
|
|
|
|
// Returns the ID of the thread on which
|
|
// the last event occurred.
|
|
STDMETHOD(GetEventThread)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(GetEventProcess)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
|
|
// Controls implicit thread used by the
|
|
// debug engine. The debuggers current
|
|
// thread is just a piece of data held
|
|
// by the debugger for calls which use
|
|
// thread-specific information. In those
|
|
// calls the debuggers current thread is used.
|
|
// The debuggers current thread is not related
|
|
// to any system thread attribute.
|
|
// IDs for threads are small integer IDs
|
|
// maintained by the engine. They are not
|
|
// related to system thread IDs.
|
|
STDMETHOD(GetCurrentThreadId)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
STDMETHOD(SetCurrentThreadId)(
|
|
THIS_
|
|
IN ULONG Id
|
|
) PURE;
|
|
// The current process is the process
|
|
// that owns the current thread.
|
|
STDMETHOD(GetCurrentProcessId)(
|
|
THIS_
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Setting the current process automatically
|
|
// sets the current thread to the thread that
|
|
// was last current in that process.
|
|
STDMETHOD(SetCurrentProcessId)(
|
|
THIS_
|
|
IN ULONG Id
|
|
) PURE;
|
|
|
|
// Gets the number of threads in the current process.
|
|
STDMETHOD(GetNumberThreads)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
// Gets thread count information for all processes
|
|
// and the largest number of threads in a single process.
|
|
STDMETHOD(GetTotalNumberThreads)(
|
|
THIS_
|
|
OUT PULONG Total,
|
|
OUT PULONG LargestProcess
|
|
) PURE;
|
|
STDMETHOD(GetThreadIdsByIndex)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
|
|
) PURE;
|
|
// Gets the debugger ID for the thread
|
|
// currently running on the given
|
|
// processor. Only works in kernel
|
|
// debugging.
|
|
STDMETHOD(GetThreadIdByProcessor)(
|
|
THIS_
|
|
IN ULONG Processor,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the offset of the current threads
|
|
// system data structure. When kernel debugging
|
|
// this is the offset of the KTHREAD.
|
|
// When user debugging it is the offset
|
|
// of the current TEB.
|
|
STDMETHOD(GetCurrentThreadDataOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given
|
|
// system thread data structure.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdByDataOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the offset of the current threads
|
|
// TEB. In user mode this is equivalent to
|
|
// the threads data offset.
|
|
STDMETHOD(GetCurrentThreadTeb)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given TEB.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdByTeb)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the system unique ID for the current thread.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetCurrentThreadSystemId)(
|
|
THIS_
|
|
OUT PULONG SysId
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given
|
|
// system thread ID.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdBySystemId)(
|
|
THIS_
|
|
IN ULONG SysId,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the handle of the current thread.
|
|
// In kernel mode the value returned is the
|
|
// index of the processor the thread is
|
|
// executing on plus one.
|
|
STDMETHOD(GetCurrentThreadHandle)(
|
|
THIS_
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// Looks up a debugger thread ID for the given handle.
|
|
// Currently when kernel debugging this will fail
|
|
// if the thread is not executing on a processor.
|
|
STDMETHOD(GetThreadIdByHandle)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
|
|
// Currently kernel mode sessions will only have
|
|
// a single process representing kernel space.
|
|
STDMETHOD(GetNumberProcesses)(
|
|
THIS_
|
|
OUT PULONG Number
|
|
) PURE;
|
|
STDMETHOD(GetProcessIdsByIndex)(
|
|
THIS_
|
|
IN ULONG Start,
|
|
IN ULONG Count,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
|
|
OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
|
|
) PURE;
|
|
// Returns the offset of the current processs
|
|
// system data structure. When kernel debugging
|
|
// this is the offset of the KPROCESS of
|
|
// the process that owns the current thread.
|
|
// When user debugging it is the offset
|
|
// of the current PEB.
|
|
STDMETHOD(GetCurrentProcessDataOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given
|
|
// system process data structure.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetProcessIdByDataOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the offset of the current processs
|
|
// PEB. In user mode this is equivalent to
|
|
// the processs data offset.
|
|
STDMETHOD(GetCurrentProcessPeb)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given PEB.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetProcessIdByPeb)(
|
|
THIS_
|
|
IN ULONG64 Offset,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the system unique ID for the current process.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetCurrentProcessSystemId)(
|
|
THIS_
|
|
OUT PULONG SysId
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given
|
|
// system process ID.
|
|
// Not currently supported when kernel debugging.
|
|
STDMETHOD(GetProcessIdBySystemId)(
|
|
THIS_
|
|
IN ULONG SysId,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Returns the handle of the current process.
|
|
// In kernel mode this is the kernel processs
|
|
// artificial handle used for symbol operations
|
|
// and so can only be used with dbghelp APIs.
|
|
STDMETHOD(GetCurrentProcessHandle)(
|
|
THIS_
|
|
OUT PULONG64 Handle
|
|
) PURE;
|
|
// Looks up a debugger process ID for the given handle.
|
|
STDMETHOD(GetProcessIdByHandle)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
OUT PULONG Id
|
|
) PURE;
|
|
// Retrieve the name of the executable loaded
|
|
// in the process. This may fail if no executable
|
|
// was identified.
|
|
STDMETHOD(GetCurrentProcessExecutableName)(
|
|
THIS_
|
|
OUT OPTIONAL PSTR Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT OPTIONAL PULONG ExeSize
|
|
) PURE;
|
|
|
|
// IDebugSystemObjects2.
|
|
|
|
// Return the number of seconds that the current
|
|
// process has been running.
|
|
STDMETHOD(GetCurrentProcessUpTime)(
|
|
THIS_
|
|
OUT PULONG UpTime
|
|
) PURE;
|
|
|
|
// During kernel sessions the debugger retrieves
|
|
// some information from the system thread and process
|
|
// running on the current processor. For example,
|
|
// the debugger will retrieve virtual memory translation
|
|
// information for when the debugger needs to
|
|
// carry out its own virtual to physical translations.
|
|
// Occasionally it can be interesting to perform
|
|
// similar operations but on a process which isnt
|
|
// currently running. The follow methods allow a caller
|
|
// to override the data offsets used by the debugger
|
|
// so that other system threads and processes can
|
|
// be used instead. These values are defaulted to
|
|
// the thread and process running on the current
|
|
// processor each time the debuggee executes or
|
|
// the current processor changes.
|
|
// The thread and process settings are independent so
|
|
// it is possible to refer to a thread in a process
|
|
// other than the current process and vice versa.
|
|
// Setting an offset of zero will reload the
|
|
// default value.
|
|
STDMETHOD(GetImplicitThreadDataOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(SetImplicitThreadDataOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(GetImplicitProcessDataOffset)(
|
|
THIS_
|
|
OUT PULONG64 Offset
|
|
) PURE;
|
|
STDMETHOD(SetImplicitProcessDataOffset)(
|
|
THIS_
|
|
IN ULONG64 Offset
|
|
) PURE;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Extension callbacks.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
// Returns a version with the major version in
|
|
// the high word and the minor version in the low word.
|
|
#define DEBUG_EXTENSION_VERSION(Major, Minor) \
|
|
((((Major) & 0xffff) << 16) | ((Minor) & 0xffff))
|
|
|
|
// Initialization routine. Called once when the extension DLL
|
|
// is loaded. Returns a version and returns flags detailing
|
|
// overall qualities of the extension DLL.
|
|
// A session may or may not be active at the time the DLL
|
|
// is loaded so initialization routines should not expect
|
|
// to be able to query session information.
|
|
typedef HRESULT (CALLBACK* PDEBUG_EXTENSION_INITIALIZE)
|
|
(OUT PULONG Version, OUT PULONG Flags);
|
|
// Exit routine. Called once just before the extension DLL is
|
|
// unloaded. As with initialization, a session may or
|
|
// may not be active at the time of the call.
|
|
typedef void (CALLBACK* PDEBUG_EXTENSION_UNINITIALIZE)
|
|
(void);
|
|
|
|
// A debuggee has been discovered for the session. It
|
|
// is not necessarily halted.
|
|
#define DEBUG_NOTIFY_SESSION_ACTIVE 0x00000000
|
|
// The session no longer has a debuggee.
|
|
#define DEBUG_NOTIFY_SESSION_INACTIVE 0x00000001
|
|
// The debuggee is halted and accessible.
|
|
#define DEBUG_NOTIFY_SESSION_ACCESSIBLE 0x00000002
|
|
// The debuggee is running or inaccessible.
|
|
#define DEBUG_NOTIFY_SESSION_INACCESSIBLE 0x00000003
|
|
|
|
typedef void (CALLBACK* PDEBUG_EXTENSION_NOTIFY)
|
|
(IN ULONG Notify, IN ULONG64 Argument);
|
|
|
|
// A PDEBUG_EXTENSION_CALL function can return this code
|
|
// to indicate that it was unable to handle the request
|
|
// and that the search for an extension function should
|
|
// continue down the extension DLL chain.
|
|
// Taken from STATUS_VALIDATE_CONTINUE
|
|
|
|
#define DEBUG_EXTENSION_CONTINUE_SEARCH \
|
|
HRESULT_FROM_NT(0xC0000271L)
|
|
|
|
// Every routine in an extension DLL has the following prototype.
|
|
// The extension may be called from multiple clients so it
|
|
// should not cache the client value between calls.
|
|
typedef HRESULT (CALLBACK* PDEBUG_EXTENSION_CALL)
|
|
(IN PDEBUG_CLIENT Client, IN OPTIONAL PCSTR Args);
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// Extension functions.
|
|
//
|
|
// Extension functions differ from extension callbacks in that
|
|
// they are arbitrary functions exported from an extension DLL
|
|
// for other code callers instead of for human invocation from
|
|
// debugger commands. Extension function pointers are retrieved
|
|
// for an extension DLL with IDebugControl::GetExtensionFunction.
|
|
//
|
|
// Extension function names must begin with _EFN_. Other than that
|
|
// they can have any name and prototype. Extension functions
|
|
// must be public exports of their extension DLL. They should
|
|
// have a typedef for their function pointer prototype in an
|
|
// extension header so that callers have a header file to include
|
|
// with a type that allows a correctly-formed invocation of the
|
|
// extension function.
|
|
//
|
|
// The engine does not perform any validation of calls to
|
|
// extension functions. Once the extension function pointer
|
|
// is retrieved with GetExtensionFunction all calls go
|
|
// directly between the caller and the extension function and
|
|
// are not mediated by the engine.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// C++ implementation helper classes.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef DEBUG_NO_IMPLEMENTATION
|
|
|
|
//
|
|
// DebugBaseEventCallbacks provides a do-nothing base implementation
|
|
// of IDebugEventCallbacks. A program can derive their own
|
|
// event callbacks class from DebugBaseEventCallbacks and implement
|
|
// only the methods they are interested in. Programs must be
|
|
// careful to implement GetInterestMask appropriately.
|
|
//
|
|
class DebugBaseEventCallbacks : public IDebugEventCallbacks
|
|
{
|
|
public:
|
|
// IUnknown.
|
|
STDMETHOD(QueryInterface)(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
)
|
|
{
|
|
*Interface = NULL;
|
|
|
|
#if _MSC_VER >= 1100
|
|
if (IsEqualIID(InterfaceId, __uuidof(IUnknown)) ||
|
|
IsEqualIID(InterfaceId, __uuidof(IDebugEventCallbacks)))
|
|
#else
|
|
if (IsEqualIID(InterfaceId, IID_IUnknown) ||
|
|
IsEqualIID(InterfaceId, IID_IDebugEventCallbacks))
|
|
#endif
|
|
{
|
|
*Interface = (IDebugEventCallbacks *)this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
// IDebugEventCallbacks.
|
|
|
|
STDMETHOD(Breakpoint)(
|
|
THIS_
|
|
IN PDEBUG_BREAKPOINT Bp
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Bp);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(Exception)(
|
|
THIS_
|
|
IN PEXCEPTION_RECORD64 Exception,
|
|
IN ULONG FirstChance
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Exception);
|
|
UNREFERENCED_PARAMETER(FirstChance);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(CreateThread)(
|
|
THIS_
|
|
IN ULONG64 Handle,
|
|
IN ULONG64 DataOffset,
|
|
IN ULONG64 StartOffset
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Handle);
|
|
UNREFERENCED_PARAMETER(DataOffset);
|
|
UNREFERENCED_PARAMETER(StartOffset);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(ExitThread)(
|
|
THIS_
|
|
IN ULONG ExitCode
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(ExitCode);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(CreateProcess)(
|
|
THIS_
|
|
IN ULONG64 ImageFileHandle,
|
|
IN ULONG64 Handle,
|
|
IN ULONG64 BaseOffset,
|
|
IN ULONG ModuleSize,
|
|
IN PCSTR ModuleName,
|
|
IN PCSTR ImageName,
|
|
IN ULONG CheckSum,
|
|
IN ULONG TimeDateStamp,
|
|
IN ULONG64 InitialThreadHandle,
|
|
IN ULONG64 ThreadDataOffset,
|
|
IN ULONG64 StartOffset
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(ImageFileHandle);
|
|
UNREFERENCED_PARAMETER(Handle);
|
|
UNREFERENCED_PARAMETER(BaseOffset);
|
|
UNREFERENCED_PARAMETER(ModuleSize);
|
|
UNREFERENCED_PARAMETER(ModuleName);
|
|
UNREFERENCED_PARAMETER(ImageName);
|
|
UNREFERENCED_PARAMETER(CheckSum);
|
|
UNREFERENCED_PARAMETER(TimeDateStamp);
|
|
UNREFERENCED_PARAMETER(InitialThreadHandle);
|
|
UNREFERENCED_PARAMETER(ThreadDataOffset);
|
|
UNREFERENCED_PARAMETER(StartOffset);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(ExitProcess)(
|
|
THIS_
|
|
IN ULONG ExitCode
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(ExitCode);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(LoadModule)(
|
|
THIS_
|
|
IN ULONG64 ImageFileHandle,
|
|
IN ULONG64 BaseOffset,
|
|
IN ULONG ModuleSize,
|
|
IN PCSTR ModuleName,
|
|
IN PCSTR ImageName,
|
|
IN ULONG CheckSum,
|
|
IN ULONG TimeDateStamp
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(ImageFileHandle);
|
|
UNREFERENCED_PARAMETER(BaseOffset);
|
|
UNREFERENCED_PARAMETER(ModuleSize);
|
|
UNREFERENCED_PARAMETER(ModuleName);
|
|
UNREFERENCED_PARAMETER(ImageName);
|
|
UNREFERENCED_PARAMETER(CheckSum);
|
|
UNREFERENCED_PARAMETER(TimeDateStamp);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(UnloadModule)(
|
|
THIS_
|
|
IN PCSTR ImageBaseName,
|
|
IN ULONG64 BaseOffset
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(ImageBaseName);
|
|
UNREFERENCED_PARAMETER(BaseOffset);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(SystemError)(
|
|
THIS_
|
|
IN ULONG Error,
|
|
IN ULONG Level
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Error);
|
|
UNREFERENCED_PARAMETER(Level);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(SessionStatus)(
|
|
THIS_
|
|
IN ULONG Status
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Status);
|
|
return DEBUG_STATUS_NO_CHANGE;
|
|
}
|
|
STDMETHOD(ChangeDebuggeeState)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG64 Argument
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Flags);
|
|
UNREFERENCED_PARAMETER(Argument);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(ChangeEngineState)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG64 Argument
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Flags);
|
|
UNREFERENCED_PARAMETER(Argument);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(ChangeSymbolState)(
|
|
THIS_
|
|
IN ULONG Flags,
|
|
IN ULONG64 Argument
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(Flags);
|
|
UNREFERENCED_PARAMETER(Argument);
|
|
return S_OK;
|
|
}
|
|
};
|
|
|
|
#endif // #ifndef DEBUG_NO_IMPLEMENTATION
|
|
|
|
#endif // #ifdef __cplusplus
|
|
|
|
#endif // #ifndef __DBGENG_H__
|