262 lines
11 KiB
C++
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__
|