windows-nt/Source/XPSP1/NT/sdktools/debuggers/exdi/exdi_x86_64.idl
2020-09-26 16:20:57 +08:00

226 lines
7.7 KiB
Plaintext

import "..\exdi.idl";
interface IeXdiX86_64Context;
// HRESULT GetContext ([in, out] PCONTEXT_X86_64 pContext);
// HRESULT SetContext ([in] CONTEXT_X86_64 Context);
cpp_quote("// The following constants are bit definitions for the ModeFlags value in CONTEXT_X86_64.")
cpp_quote("// They are provided to allow debuggers to correctly disassemble instructions based on")
cpp_quote("// the current operating mode of the processor.")
cpp_quote("#define X86_64_MODE_D (0x0001) // D bit from the current CS selector")
cpp_quote("#define X86_64_MODE_L (0x0002) // L bit (long mode) from the current CS selector")
cpp_quote("#define X86_64_MODE_LME (0x0004) // LME bit (lomg mode enable) from extended feature MSR")
cpp_quote("#define X86_64_MODE_REX (0x0008) // REX bit (register extension) from extended feature MSR")
typedef
struct _SEG64_DESC_INFO
{
DWORD64 SegBase;
DWORD64 SegLimit;
DWORD SegFlags;
} SEG64_DESC_INFO;
typedef
struct _SSE_REG
{
DWORD Reg0;
DWORD Reg1;
DWORD Reg2;
DWORD Reg3;
} SSE_REG;
#define NUM_SSE_REGS 16
typedef
struct _CONTEXT_X86_64
{
struct
{
BOOL fSegmentRegs;
BOOL fControlRegs;
BOOL fIntegerRegs;
BOOL fFloatingPointRegs;
BOOL fDebugRegs;
BOOL fSegmentDescriptors;
BOOL fSSERegisters;
BOOL fSystemRegisters;
} RegGroupSelection; // These flags are used to select groups of registers only
// (instead of the totality) for reading or writing.
// both Segment & Control registers (used if either RegGroupSelection.fSegmentRegs or
// RegGroupSelection.fControlRegs is TRUE).
DWORD SegCs;
DWORD SegSs;
// Segment registers (used if RegGroupSelection.fSegmentRegs is TRUE).
// except CS and SS which are in "Segment and Control" - see above
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
// Mode flags define the current processor mode (16/32/64 bit)
DWORD64 ModeFlags;
// Control registers (used if RegGroupSelection.fControlRegs is TRUE).
// except CS and SS which are in "Segment and Control" - see above
DWORD64 EFlags;
DWORD64 Rbp;
DWORD64 Rip;
DWORD64 Rsp;
// Integer registers (used if RegGroupSelection.fIntegerRegs is TRUE).
DWORD64 Rax;
DWORD64 Rbx;
DWORD64 Rcx;
DWORD64 Rdx;
DWORD64 Rsi;
DWORD64 Rdi;
DWORD64 R8;
DWORD64 R9;
DWORD64 R10;
DWORD64 R11;
DWORD64 R12;
DWORD64 R13;
DWORD64 R14;
DWORD64 R15;
// Floating point registers (used if RegGroupSelection.fFloatingPointRegs is TRUE).
DWORD ControlWord;
DWORD StatusWord;
DWORD TagWord;
DWORD ErrorOffset;
DWORD ErrorSelector;
DWORD DataOffset;
DWORD DataSelector;
BYTE RegisterArea [SIZE_OF_80387_REGISTERS_IN_BYTES];
// Debug registers (used if RegGroupSelection.fDebugRegs is TRUE)
DWORD64 Dr0;
DWORD64 Dr1;
DWORD64 Dr2;
DWORD64 Dr3;
DWORD64 Dr6;
DWORD64 Dr7;
// Descriptors and base registers (used if RegGroupSelection.fSegmentDescriptors is TRUE)
SEG64_DESC_INFO DescriptorCs;
SEG64_DESC_INFO DescriptorSs;
SEG64_DESC_INFO DescriptorGs;
SEG64_DESC_INFO DescriptorFs;
SEG64_DESC_INFO DescriptorEs;
SEG64_DESC_INFO DescriptorDs;
DWORD64 IDTBase;
DWORD64 IDTLimit;
DWORD64 GDTBase;
DWORD64 GDTLimit;
DWORD SelLDT;
SEG64_DESC_INFO SegLDT;
DWORD SelTSS;
SEG64_DESC_INFO SegTSS;
// System registers (used if RegGroupSelection.fSystemRegisters is TRUE)
DWORD64 RegCr0;
DWORD64 RegCr2;
DWORD64 RegCr3;
DWORD64 RegCr4;
DWORD64 RegCr8; // Cr8 - Task priority register.
// SSE registers (used if RegGroupSelection.fSSERegisters is TRUE)
DWORD RegMXCSR;
SSE_REG RegSSE[NUM_SSE_REGS];
} CONTEXT_X86_64, *PCONTEXT_X86_64;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// IeXdiX86_64Context
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// X86_64 context access interface
[
object,
uuid(4795B125-6CDE-4e76-B8D3-D5ED69ECE739),
helpstring("IeXdiX86_64Context interface - eXdi Context access for 64 Bit X86 processors 1.0 for Platform Builder 3.0 debugger - Microsoft 1999"),
pointer_default(ref)
]
interface IeXdiX86_64Context : IUnknown
{
/*++
Routine Name:
GetContext
Routine Description:
Read Context - Read a set of CPU / Co-Proc registers that define the state of the target
The CONTEXT.RegGroupSelection bitfield allow to select which group of register need to be read only
Argument(s):
pContext - Return context (CPU dependant structure).
Note: The context is also passed in to indicate only the RegGroupSelection (which reg groups are read)
Return Value:
Error status:
S_OK: Function successful
EXDI_E_CANNOTWHILETGTRUNNING Cannot proceed while target running. Must halt the target first.
Note: this error is generated only if the probe / target does not support this operation "on the fly".
see DEBUG_ACCESS_CAPABILITIES_STRUCT.fReadRegWhileRunning
EXDI_E_NOTIMPL: Not implemented
EXDI_E_OUTOFMEMORY: Failed to allocate necessary memory
EXDI_E_INVALIDARG: One or more arguments are invalid
EXDI_E_ABORT: Operation aborted
EXDI_E_FAIL: Unspecified failure
EXDI_E_COMMUNICATION: Communication error between host driver and target
EXDI_E_USEDBYCONCURENTTHREAD: Cannot proceed immediately because resource is already used by concurent thread.
--*/
HRESULT GetContext
(
[in, out] PCONTEXT_X86_64 pContext
);
/*++
Routine Name:
SetContext
Routine Description:
Write Context - Write a set of CPU / Co-Proc registers that define the state of the target
The CONTEXT.RegGroupSelection bitfield allow to select which group of register need to be written only
Argument(s):
pContext - Return context (CPU dependant structure).
Note: The context is also passed in to indicate only the RegGroupSelection (which reg groups are read)
Return Value:
Error status:
S_OK: Function successful
EXDI_E_CANNOTWHILETGTRUNNING Cannot proceed while target running. Must halt the target first.
Note: this error is generated only if the probe / target does not support this operation "on the fly".
see DEBUG_ACCESS_CAPABILITIES_STRUCT.fWriteRegWhileRunning
EXDI_E_NOTIMPL: Not implemented
EXDI_E_OUTOFMEMORY: Failed to allocate necessary memory
EXDI_E_INVALIDARG: One or more arguments are invalid
EXDI_E_ABORT: Operation aborted
EXDI_E_FAIL: Unspecified failure
EXDI_E_COMMUNICATION: Communication error between host driver and target
EXDI_E_USEDBYCONCURENTTHREAD: Cannot proceed immediately because resource is already used by concurent thread.
--*/
HRESULT SetContext
(
[in] CONTEXT_X86_64 Context
);
}; // interface IeXdiX86_64Context