mirror of https://github.com/UMSKT/xpmgr.git
261 lines
9.0 KiB
Plaintext
261 lines
9.0 KiB
Plaintext
// ==++==
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// ==--==
|
|
/*****************************************************************************
|
|
** **
|
|
** clrdata.idl - Common Language Runtime data access interfaces for **
|
|
** clients needing to access runtime state from outside **
|
|
** runtime, such as out-of-process debuggers. **
|
|
** **
|
|
** The access interface defines two different types of code running: **
|
|
** The host is the user of the access interface. **
|
|
** The target is the target of the access. **
|
|
** **
|
|
** The host and target can be have different instruction sets, **
|
|
** pointer sizes, runtime versions and so on. **
|
|
** **
|
|
*****************************************************************************/
|
|
|
|
import "unknwn.idl";
|
|
|
|
/* ------------------------------------------------------------------------- *
|
|
* Forward declarations.
|
|
* ------------------------------------------------------------------------- */
|
|
|
|
interface ICLRDataEnumMemoryRegions;
|
|
interface ICLRDataEnumMemoryRegionsCallback;
|
|
interface ICLRDataTarget;
|
|
interface ICLRDataTarget2;
|
|
interface ICLRMetadataLocator;
|
|
|
|
/*
|
|
* Addresses in the access interface are always the largest possible.
|
|
* If the target uses a smaller address size then addresses are converted
|
|
* up by sign extension.
|
|
*/
|
|
typedef ULONG64 CLRDATA_ADDRESS;
|
|
|
|
/* ------------------------------------------------------------------------- *
|
|
* Creation function.
|
|
* Can create ICLRDataEnumMemoryRegions.
|
|
* ------------------------------------------------------------------------- */
|
|
|
|
#pragma midl_echo("STDAPI CLRDataCreateInstance(REFIID iid, ICLRDataTarget* target, void** iface);")
|
|
#pragma midl_echo("typedef HRESULT (STDAPICALLTYPE* PFN_CLRDataCreateInstance)(REFIID iid, ICLRDataTarget* target, void** iface);")
|
|
|
|
/*
|
|
* Interface for providing access to a particular target process. The
|
|
* data access services will call functions on this interface to
|
|
* access memory and other data in the target process.
|
|
*
|
|
* The API client must implement this interface as appropriate for the
|
|
* particular target (for example, a live process or a memory dump).
|
|
*
|
|
*/
|
|
[
|
|
object,
|
|
local,
|
|
uuid(3E11CCEE-D08B-43e5-AF01-32717A64DA03),
|
|
pointer_default(unique)
|
|
]
|
|
interface ICLRDataTarget : IUnknown
|
|
{
|
|
/*
|
|
* Return which kind of instruction set is in use in the
|
|
* target. Value is one of the IMAGE_FILE_MACHINE_* constants.
|
|
*/
|
|
HRESULT GetMachineType([out] ULONG32* machineType);
|
|
|
|
/*
|
|
* Return the size of a pointer on the target, in bytes.
|
|
*/
|
|
HRESULT GetPointerSize([out] ULONG32* pointerSize);
|
|
|
|
/*
|
|
* Find the base address for a given image.
|
|
* Image name may or may not have a path. If a path
|
|
* is given matching is done with the whole path, otherwise
|
|
* matching is done only on the file part.
|
|
* In either case, matching should be case-insensitive.
|
|
*/
|
|
HRESULT GetImageBase([in, string] LPCWSTR imagePath,
|
|
[out] CLRDATA_ADDRESS* baseAddress);
|
|
|
|
/*
|
|
* Virtual memory access. If any bytes can be processed
|
|
* the call is considered successful.
|
|
*/
|
|
HRESULT ReadVirtual([in] CLRDATA_ADDRESS address,
|
|
[out, size_is(bytesRequested), length_is(*bytesRead)] BYTE* buffer,
|
|
[in] ULONG32 bytesRequested,
|
|
[out] ULONG32* bytesRead);
|
|
HRESULT WriteVirtual([in] CLRDATA_ADDRESS address,
|
|
[in, size_is(bytesRequested)] BYTE* buffer,
|
|
[in] ULONG32 bytesRequested,
|
|
[out] ULONG32* bytesWritten);
|
|
|
|
/*
|
|
* TLS data access for the current thread.
|
|
*/
|
|
HRESULT GetTLSValue([in] ULONG32 threadID,
|
|
[in] ULONG32 index,
|
|
[out] CLRDATA_ADDRESS* value);
|
|
HRESULT SetTLSValue([in] ULONG32 threadID,
|
|
[in] ULONG32 index,
|
|
[in] CLRDATA_ADDRESS value);
|
|
|
|
/*
|
|
* System ID for the current thread.
|
|
* If there is no "current" thread for the target
|
|
* implementation this can fail.
|
|
*/
|
|
HRESULT GetCurrentThreadID([out] ULONG32* threadID);
|
|
|
|
/*
|
|
* Thread context.
|
|
*/
|
|
HRESULT GetThreadContext([in] ULONG32 threadID,
|
|
[in] ULONG32 contextFlags,
|
|
[in] ULONG32 contextSize,
|
|
[out, size_is(contextSize)] BYTE* context);
|
|
HRESULT SetThreadContext([in] ULONG32 threadID,
|
|
[in] ULONG32 contextSize,
|
|
[in, size_is(contextSize)] BYTE* context);
|
|
|
|
/*
|
|
* Generic request facility to allow addition of
|
|
* queries and operations without requiring an interface revision.
|
|
*/
|
|
|
|
HRESULT Request([in] ULONG32 reqCode,
|
|
[in] ULONG32 inBufferSize,
|
|
[in, size_is(inBufferSize)] BYTE* inBuffer,
|
|
[in] ULONG32 outBufferSize,
|
|
[out, size_is(outBufferSize)] BYTE* outBuffer);
|
|
};
|
|
|
|
/*
|
|
* Interface used by the data access services layer to manipulate
|
|
* virtual memory regions in the target. The target may not support
|
|
* modification.
|
|
*/
|
|
[
|
|
object,
|
|
local,
|
|
uuid(6d05fae3-189c-4630-a6dc-1c251e1c01ab),
|
|
pointer_default(unique)
|
|
]
|
|
interface ICLRDataTarget2 : ICLRDataTarget
|
|
{
|
|
/*
|
|
* Ask the target to allocate memory in its address space.
|
|
*/
|
|
HRESULT AllocVirtual([in] CLRDATA_ADDRESS addr,
|
|
[in] ULONG32 size,
|
|
[in] ULONG32 typeFlags,
|
|
[in] ULONG32 protectFlags,
|
|
[out] CLRDATA_ADDRESS* virt);
|
|
|
|
/*
|
|
* Ask the target to free a previously allocated memory block.
|
|
*/
|
|
HRESULT FreeVirtual([in] CLRDATA_ADDRESS addr,
|
|
[in] ULONG32 size,
|
|
[in] ULONG32 typeFlags);
|
|
};
|
|
|
|
/*
|
|
* Interface used by the data access services layer to locate metadata
|
|
* of assemblies in a target.
|
|
*
|
|
* The API client must implement this interface as appropriate for the
|
|
* particular target (for example, a live process or a memory dump).
|
|
*
|
|
* This is an old interface you should not be using.
|
|
* see code:ICorDebugMetaDataLocator in cordebug.idl
|
|
*
|
|
*/
|
|
[
|
|
object,
|
|
local,
|
|
uuid(aa8fa804-bc05-4642-b2c5-c353ed22fc63),
|
|
pointer_default(unique)
|
|
]
|
|
interface ICLRMetadataLocator : IUnknown
|
|
{
|
|
/*
|
|
* Ask the target to retrieve metadata for an image.
|
|
*/
|
|
HRESULT GetMetadata([in] LPCWSTR imagePath,
|
|
[in] ULONG32 imageTimestamp,
|
|
[in] ULONG32 imageSize,
|
|
[in] GUID* mvid,
|
|
[in] ULONG32 mdRva,
|
|
[in] ULONG32 flags,
|
|
[in] ULONG32 bufferSize,
|
|
[out, size_is(bufferSize), length_is(*dataSize)]
|
|
BYTE* buffer,
|
|
[out] ULONG32* dataSize);
|
|
};
|
|
|
|
|
|
/*
|
|
* Callback interface for enumerating memory regions.
|
|
*/
|
|
[
|
|
object,
|
|
local,
|
|
uuid(BCDD6908-BA2D-4ec5-96CF-DF4D5CDCB4A4)
|
|
]
|
|
interface ICLRDataEnumMemoryRegionsCallback : IUnknown
|
|
{
|
|
/*
|
|
* ICLRDataEnumMemoryRegions::EnumMemoryRegions will call this
|
|
* function for every memory region enumerated. Regions reported
|
|
* through this callback may be duplicate or overlapping. Failure
|
|
* return results will be noted, but will not stop the
|
|
* enumeration.
|
|
*/
|
|
HRESULT EnumMemoryRegion([in] CLRDATA_ADDRESS address,
|
|
[in] ULONG32 size);
|
|
}
|
|
|
|
/*
|
|
* Flags for controlling which memory regions are enumerated.
|
|
*/
|
|
typedef enum CLRDataEnumMemoryFlags
|
|
{
|
|
CLRDATA_ENUM_MEM_DEFAULT = 0x0,
|
|
CLRDATA_ENUM_MEM_MINI = CLRDATA_ENUM_MEM_DEFAULT, // generating skinny mini-dump
|
|
CLRDATA_ENUM_MEM_HEAP = 0x1, // generating heap dump
|
|
|
|
/* More bits to be added here later */
|
|
} CLRDataEnumMemoryFlags;
|
|
|
|
/*
|
|
* Memory enumeration interface.
|
|
* This is one of the top-level interfaces creatable by CLRDataCreateInstance.
|
|
*/
|
|
[
|
|
object,
|
|
local,
|
|
uuid(471c35b4-7c2f-4ef0-a945-00f8c38056f1)
|
|
]
|
|
interface ICLRDataEnumMemoryRegions : IUnknown
|
|
{
|
|
/*
|
|
* EnumMemoryRegions enumerates regions of interest as specified
|
|
* by the flags argument by calling the
|
|
* ICLRDataEnumMemoryRegionsCallback::EnumMemoryRegion for every
|
|
* region being enumerated. Attempts to enumerate as many regions
|
|
* as possible, even if the callback returns failures during
|
|
* enumeration.
|
|
*/
|
|
HRESULT EnumMemoryRegions([in] ICLRDataEnumMemoryRegionsCallback *callback,
|
|
[in] ULONG32 miniDumpFlags,
|
|
[in] CLRDataEnumMemoryFlags clrFlags);
|
|
}
|
|
|