Windows-Server-2003/sdktools/debuggers/dbg-common/uminiprov.hpp

262 lines
11 KiB
C++

//----------------------------------------------------------------------------
//
// User-mode minidump OS call provider interfaces.
//
// Copyright (C) Microsoft Corporation, 2002.
//
//----------------------------------------------------------------------------
#ifndef __UMINIPROV_HPP__
#define __UMINIPROV_HPP__
class MiniDumpProviderCallbacks
{
public:
virtual HRESULT EnumMemory(ULONG64 Offset, ULONG Size) = 0;
};
class MiniDumpSystemProvider
{
public:
virtual void Release(void) = 0;
virtual HRESULT GetCurrentTimeDate(OUT PULONG TimeDate) = 0;
virtual HRESULT GetCpuType(OUT PULONG Type,
OUT PBOOL BackingStore) = 0;
virtual HRESULT GetCpuInfo(OUT PUSHORT Architecture,
OUT PUSHORT Level,
OUT PUSHORT Revision,
OUT PUCHAR NumberOfProcessors,
OUT union _CPU_INFORMATION* Info) = 0;
virtual void GetContextSizes(OUT PULONG Size,
OUT PULONG RegScanStart,
OUT PULONG RegScanCount) = 0;
virtual void GetPointerSize(OUT PULONG Size) = 0;
virtual void GetPageSize(OUT PULONG Size) = 0;
virtual void GetFunctionTableSizes(OUT PULONG TableSize,
OUT PULONG EntrySize) = 0;
virtual void GetInstructionWindowSize(OUT PULONG Size) = 0;
virtual HRESULT GetOsInfo(OUT PULONG PlatformId,
OUT PULONG Major,
OUT PULONG Minor,
OUT PULONG BuildNumber,
OUT PUSHORT ProductType,
OUT PUSHORT SuiteMask) = 0;
virtual HRESULT GetOsCsdString(OUT PWSTR Buffer,
IN ULONG BufferChars) = 0;
virtual HRESULT OpenMapping(IN PCWSTR FilePath,
OUT PULONG Size,
OUT PWSTR LongPath,
IN ULONG LongPathChars,
OUT PVOID* Mapping) = 0;
virtual void CloseMapping(PVOID Mapping) = 0;
virtual HRESULT GetImageHeaderInfo(IN HANDLE Process,
IN PCWSTR FilePath,
IN ULONG64 ImageBase,
OUT PULONG Size,
OUT PULONG CheckSum,
OUT PULONG TimeDateStamp) = 0;
virtual HRESULT GetImageVersionInfo(IN HANDLE Process,
IN PCWSTR FilePath,
IN ULONG64 ImageBase,
OUT VS_FIXEDFILEINFO* Info) = 0;
virtual HRESULT GetImageDebugRecord(IN HANDLE Process,
IN PCWSTR FilePath,
IN ULONG64 ImageBase,
IN ULONG RecordType,
OUT OPTIONAL PVOID Data,
IN OUT PULONG DataLen) = 0;
virtual HRESULT EnumImageDataSections(IN HANDLE Process,
IN PCWSTR FilePath,
IN ULONG64 ImageBase,
IN MiniDumpProviderCallbacks*
Callback) = 0;
virtual HRESULT OpenThread(IN ULONG DesiredAccess,
IN BOOL InheritHandle,
IN ULONG ThreadId,
OUT PHANDLE Handle) = 0;
virtual void CloseThread(IN HANDLE Handle) = 0;
virtual ULONG GetCurrentThreadId(void) = 0;
virtual ULONG SuspendThread(IN HANDLE Thread) = 0;
virtual ULONG ResumeThread(IN HANDLE Thread) = 0;
virtual HRESULT GetThreadContext(IN HANDLE Thread,
OUT PVOID Context,
IN ULONG ContextSize,
OUT PULONG64 CurrentPc,
OUT PULONG64 CurrentStack,
OUT PULONG64 CurrentStore) = 0;
virtual HRESULT GetTeb(IN HANDLE Thread,
OUT PULONG64 Offset,
OUT PULONG Size) = 0;
virtual HRESULT GetThreadInfo(IN HANDLE Process,
IN HANDLE Thread,
OUT PULONG64 Teb,
OUT PULONG SizeOfTeb,
OUT PULONG64 StackBase,
OUT PULONG64 StackLimit,
OUT PULONG64 StoreBase,
OUT PULONG64 StoreLimit) = 0;
virtual HRESULT GetPeb(IN HANDLE Process,
OUT PULONG64 Offset,
OUT PULONG Size) = 0;
virtual HRESULT GetProcessTimes(IN HANDLE Process,
OUT LPFILETIME Create,
OUT LPFILETIME User,
OUT LPFILETIME Kernel) = 0;
// Returns success if any data is read.
virtual HRESULT ReadVirtual(IN HANDLE Process,
IN ULONG64 Offset,
OUT PVOID Buffer,
IN ULONG Request,
OUT PULONG Done) = 0;
virtual HRESULT ReadAllVirtual(IN HANDLE Process,
IN ULONG64 Offset,
OUT PVOID Buffer,
IN ULONG Request) = 0;
virtual HRESULT QueryVirtual(IN HANDLE Process,
IN ULONG64 Offset,
OUT PULONG64 Base,
OUT PULONG64 Size,
OUT PULONG Protect,
OUT PULONG State,
OUT PULONG Type) = 0;
virtual HRESULT StartProcessEnum(IN HANDLE Process,
IN ULONG ProcessId) = 0;
virtual HRESULT EnumThreads(OUT PULONG ThreadId) = 0;
virtual HRESULT EnumModules(OUT PULONG64 Base,
OUT PWSTR Path,
IN ULONG PathChars) = 0;
virtual HRESULT EnumFunctionTables(OUT PULONG64 MinAddress,
OUT PULONG64 MaxAddress,
OUT PULONG64 BaseAddress,
OUT PULONG EntryCount,
OUT PVOID RawTable,
IN ULONG RawTableSize,
OUT PVOID* RawEntryHandle) = 0;
virtual HRESULT EnumFunctionTableEntries(IN PVOID RawTable,
IN ULONG RawTableSize,
IN PVOID RawEntryHandle,
OUT PVOID RawEntries,
IN ULONG RawEntriesSize) = 0;
virtual HRESULT EnumFunctionTableEntryMemory(IN ULONG64 TableBase,
IN PVOID RawEntries,
IN ULONG Index,
OUT PULONG64 Start,
OUT PULONG Size) = 0;
virtual HRESULT EnumUnloadedModules(OUT PWSTR Path,
IN ULONG PathChars,
OUT PULONG64 BaseOfModule,
OUT PULONG SizeOfModule,
OUT PULONG CheckSum,
OUT PULONG TimeDateStamp) = 0;
virtual void FinishProcessEnum(void) = 0;
virtual HRESULT StartHandleEnum(IN HANDLE Process,
IN ULONG ProcessId,
OUT PULONG Count) = 0;
virtual HRESULT EnumHandles(OUT PULONG64 Handle,
OUT PULONG Attributes,
OUT PULONG GrantedAccess,
OUT PULONG HandleCount,
OUT PULONG PointerCount,
OUT PWSTR TypeName,
IN ULONG TypeNameChars,
OUT PWSTR ObjectName,
IN ULONG ObjectNameChars) = 0;
virtual void FinishHandleEnum(void) = 0;
virtual HRESULT EnumPebMemory(IN HANDLE Process,
IN ULONG64 PebOffset,
IN ULONG PebSize,
IN MiniDumpProviderCallbacks* Callback) = 0;
virtual HRESULT EnumTebMemory(IN HANDLE Process,
IN HANDLE Thread,
IN ULONG64 TebOffset,
IN ULONG TebSize,
IN MiniDumpProviderCallbacks* Callback) = 0;
virtual HRESULT GetCorDataAccess(IN PWSTR AccessDllName,
IN struct ICorDataAccessServices*
Services,
OUT struct ICorDataAccess**
Access) = 0;
virtual void ReleaseCorDataAccess(IN struct ICorDataAccess*
Access) = 0;
};
class MiniDumpOutputProvider
{
public:
virtual void Release(void) = 0;
// S_OK return indicates this provider can stream an
// arbitrary amount of data. Any other return indicates this
// provider requires a size bound.
virtual HRESULT SupportsStreaming(void) = 0;
// MaxSize of zero indicates no size information available.
virtual HRESULT Start(IN ULONG64 MaxSize) = 0;
// Uses Win32 FILE_ defines for How.
virtual HRESULT Seek(IN ULONG How,
IN LONG64 Amount,
OUT OPTIONAL PULONG64 NewOffset) = 0;
// WriteAll must write the entire request to succeed.
virtual HRESULT WriteAll(IN PVOID Buffer,
IN ULONG Request) = 0;
virtual void Finish(void) = 0;
};
class MiniDumpAllocationProvider
{
public:
virtual void Release(void) = 0;
// Allocated memory is always zero-filled.
virtual PVOID Alloc(ULONG Size) = 0;
virtual PVOID Realloc(PVOID Mem, ULONG NewSize) = 0;
virtual void Free(PVOID Mem) = 0;
};
extern "C"
{
HRESULT WINAPI
MiniDumpCreateLiveSystemProvider(OUT MiniDumpSystemProvider** Prov);
HRESULT WINAPI
MiniDumpCreateFileOutputProvider(IN HANDLE FileHandle,
OUT MiniDumpOutputProvider** Prov);
HRESULT WINAPI
MiniDumpCreateLiveAllocationProvider(OUT MiniDumpAllocationProvider** Prov);
HRESULT
WINAPI
MiniDumpProvideDump(
IN HANDLE hProcess,
IN DWORD ProcessId,
IN MiniDumpSystemProvider* SysProv,
IN MiniDumpOutputProvider* OutProv,
IN MiniDumpAllocationProvider* AllocProv,
IN ULONG DumpType,
IN CONST struct _MINIDUMP_EXCEPTION_INFORMATION64* ExceptionParam, OPTIONAL
IN CONST struct _MINIDUMP_USER_STREAM_INFORMATION* UserStreamParam, OPTIONAL
IN CONST struct _MINIDUMP_CALLBACK_INFORMATION* CallbackParam OPTIONAL
);
};
#endif // #ifndef __UMINIPROV_HPP__