Added support for minidump (read & write).
diff --git a/include/dbghelp.h b/include/dbghelp.h
index 45c64c9..aa7bff3 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -250,7 +250,7 @@
/* DebugHelp */
-#define MINIDUMP_SIGNATURE 0x4D444D50 /* 'PMDM' */
+#define MINIDUMP_SIGNATURE 0x504D444D /* 'MDMP' */
#define MINIDUMP_VERSION (42899)
typedef DWORD RVA;
@@ -258,12 +258,21 @@
typedef enum _MINIDUMP_TYPE
{
- MiniDumpNormal = 0x0000,
- MiniDumpWithDataSegs = 0x0001,
- MiniDumpWithFullMemory = 0x0002,
- MiniDumpWithHandleData = 0x0004,
- MiniDumpFilterMemory = 0x0008,
- MiniDumpScanMemory = 0x0010
+ MiniDumpNormal = 0x0000,
+ MiniDumpWithDataSegs = 0x0001,
+ MiniDumpWithFullMemory = 0x0002,
+ MiniDumpWithHandleData = 0x0004,
+ MiniDumpFilterMemory = 0x0008,
+ MiniDumpScanMemory = 0x0010,
+ MiniDumpWithUnloadedModules = 0x0020,
+ MiniDumpWithIndirectlyReferencedMemory = 0x0040,
+ MiniDumpFilterModulePaths = 0x0080,
+ MiniDumpWithProcessThreadData = 0x0100,
+ MiniDumpWithPrivateReadWriteMemory = 0x0200,
+ MiniDumpWithoutOptionalData = 0x0400,
+ MiniDumpWithFullMemoryInfo = 0x0800,
+ MiniDumpWithThreadInfo = 0x1000,
+ MiniDumpWithCodeSegs = 0x2000
} MINIDUMP_TYPE;
typedef enum _MINIDUMP_CALLBACK_TYPE
@@ -273,6 +282,7 @@
ThreadExCallback,
IncludeThreadCallback,
IncludeModuleCallback,
+ MemoryCallback,
} MINIDUMP_CALLBACK_TYPE;
typedef struct _MINIDUMP_THREAD_CALLBACK
@@ -281,7 +291,7 @@
HANDLE ThreadHandle;
CONTEXT Context;
ULONG SizeOfContext;
- ULONGLONG StackBase;
+ ULONG64 StackBase;
ULONG64 StackEnd;
} MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
@@ -291,10 +301,10 @@
HANDLE ThreadHandle;
CONTEXT Context;
ULONG SizeOfContext;
- ULONGLONG StackBase;
- ULONGLONG StackEnd;
- ULONGLONG BackingStoreBase;
- ULONGLONG BackingStoreEnd;
+ ULONG64 StackBase;
+ ULONG64 StackEnd;
+ ULONG64 BackingStoreBase;
+ ULONG64 BackingStoreEnd;
} MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK
@@ -308,13 +318,15 @@
ThreadWriteStack = 0x0002,
ThreadWriteContext = 0x0004,
ThreadWriteBackingStore = 0x0008,
- ThreadWriteInstructionWindow = 0x0010
+ ThreadWriteInstructionWindow = 0x0010,
+ ThreadWriteThreadData = 0x0020,
+ ThreadWriteThreadInfo = 0x0040
} THREAD_WRITE_FLAGS;
typedef struct _MINIDUMP_MODULE_CALLBACK
{
PWCHAR FullPath;
- ULONGLONG BaseOfImage;
+ ULONG64 BaseOfImage;
ULONG SizeOfImage;
ULONG CheckSum;
ULONG TimeDateStamp;
@@ -336,7 +348,9 @@
ModuleWriteDataSeg = 0x0002,
ModuleWriteMiscRecord = 0x0004,
ModuleWriteCvRecord = 0x0008,
- ModuleReferencedByMemory = 0x0010
+ ModuleReferencedByMemory = 0x0010,
+ ModuleWriteTlsData = 0x0020,
+ ModuleWriteCodeSegs = 0x0040,
} MODULE_WRITE_FLAGS;
typedef struct _MINIDUMP_CALLBACK_INPUT
@@ -351,7 +365,7 @@
MINIDUMP_MODULE_CALLBACK Module;
MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
- } u;
+ } DUMMYUNIONNAME;
} MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
typedef struct _MINIDUMP_CALLBACK_OUTPUT
@@ -360,12 +374,15 @@
{
ULONG ModuleWriteFlags;
ULONG ThreadWriteFlags;
- } u;
+ struct
+ {
+ ULONG64 MemoryBase;
+ ULONG MemorySize;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
} MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
-typedef BOOL (WINAPI* MINIDUMP_CALLBACK_ROUTINE)(PVOID CallbackParam,
- const PMINIDUMP_CALLBACK_INPUT CallbackInput,
- PMINIDUMP_CALLBACK_OUTPUT CallbackOutput);
+typedef BOOL (WINAPI* MINIDUMP_CALLBACK_ROUTINE)(PVOID, const PMINIDUMP_CALLBACK_INPUT, PMINIDUMP_CALLBACK_OUTPUT);
typedef struct _MINIDUMP_CALLBACK_INFORMATION
{
@@ -389,11 +406,11 @@
{
ULONG ExceptionCode;
ULONG ExceptionFlags;
- ULONGLONG ExceptionRecord;
- ULONGLONG ExceptionAddress;
+ ULONG64 ExceptionRecord;
+ ULONG64 ExceptionAddress;
ULONG NumberParameters;
ULONG __unusedAlignment;
- ULONGLONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+ ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} MINIDUMP_EXCEPTION, *PMINIDUMP_EXCEPTION;
typedef struct _MINIDUMP_EXCEPTION_INFORMATION
@@ -422,19 +439,38 @@
{
DWORD Reserved;
DWORD TimeDateStamp;
- } u;
- ULONGLONG Flags;
+ } DUMMYUNIONNAME;
+ ULONG64 Flags;
} MINIDUMP_HEADER, *PMINIDUMP_HEADER;
typedef struct _MINIDUMP_MEMORY_DESCRIPTOR
{
- ULONGLONG StartOfMemoryRange;
+ ULONG64 StartOfMemoryRange;
MINIDUMP_LOCATION_DESCRIPTOR Memory;
} MINIDUMP_MEMORY_DESCRIPTOR, *PMINIDUMP_MEMORY_DESCRIPTOR;
+typedef struct _MINIDUMP_MEMORY_LIST
+{
+ ULONG NumberOfMemoryRanges;
+ MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges[1]; /* FIXME: 0-sized array not supported */
+} MINIDUMP_MEMORY_LIST, *PMINIDUMP_MEMORY_LIST;
+
+#define MINIDUMP_MISC1_PROCESS_ID 0x00000001
+#define MINIDUMP_MISC1_PROCESS_TIMES 0x00000002
+
+typedef struct _MINIDUMP_MISC_INFO
+{
+ ULONG SizeOfInfo;
+ ULONG Flags1;
+ ULONG ProcessId;
+ ULONG ProcessCreateTime;
+ ULONG ProcessUserTime;
+ ULONG ProcessKernelTime;
+} MINIDUMP_MISC_INFO, *PMINIDUMP_MISC_INFO;
+
typedef struct _MINIDUMP_MODULE
{
- ULONGLONG BaseOfImage;
+ ULONG64 BaseOfImage;
ULONG SizeOfImage;
ULONG CheckSum;
ULONG TimeDateStamp;
@@ -442,8 +478,8 @@
VS_FIXEDFILEINFO VersionInfo;
MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
- ULONGLONG Reserved0;
- ULONGLONG Reserved1;
+ ULONG64 Reserved0;
+ ULONG64 Reserved1;
} MINIDUMP_MODULE, *PMINIDUMP_MODULE;
typedef struct _MINIDUMP_MODULE_LIST
@@ -452,6 +488,76 @@
MINIDUMP_MODULE Modules[1]; /* FIXME: 0-sized array not supported */
} MINIDUMP_MODULE_LIST, *PMINIDUMP_MODULE_LIST;
+typedef struct _MINIDUMP_STRING
+{
+ ULONG Length;
+ WCHAR Buffer[1]; /* FIXME: O-sized array not supported */
+} MINIDUMP_STRING, *PMINIDUMP_STRING;
+
+typedef struct _MINIDUMP_SYSTEM_INFO
+{
+ USHORT ProcessorArchitecture;
+ USHORT ProcessorLevel;
+ USHORT ProcessorRevision;
+ union
+ {
+ USHORT Reserved0;
+ struct
+ {
+ UCHAR NumberOfProcessors;
+ UCHAR ProductType;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+
+ ULONG MajorVersion;
+ ULONG MinorVersion;
+ ULONG BuildNumber;
+ ULONG PlatformId;
+
+ RVA CSDVersionRva;
+ union
+ {
+ ULONG Reserved1;
+ struct
+ {
+ USHORT SuiteMask;
+ USHORT Reserved2;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME1;
+ union _CPU_INFORMATION
+ {
+ struct
+ {
+ ULONG VendorId[3];
+ ULONG VersionInformation;
+ ULONG FeatureInformation;
+ ULONG AMDExtendedCpuFeatures;
+ } X86CpuInfo;
+ struct
+ {
+ ULONG64 ProcessorFeatures[2];
+ } OtherCpuInfo;
+ } Cpu;
+
+} MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO;
+
+typedef struct _MINIDUMP_THREAD
+{
+ ULONG ThreadId;
+ ULONG SuspendCount;
+ ULONG PriorityClass;
+ ULONG Priority;
+ ULONG64 Teb;
+ MINIDUMP_MEMORY_DESCRIPTOR Stack;
+ MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
+} MINIDUMP_THREAD, *PMINIDUMP_THREAD;
+
+typedef struct _MINIDUMP_THREAD_LIST
+{
+ ULONG NumberOfThreads;
+ MINIDUMP_THREAD Threads[1]; /* FIXME: no support of 0 sized array */
+} MINIDUMP_THREAD_LIST, *PMINIDUMP_THREAD_LIST;
+
typedef struct _MINIDUMP_USER_STREAM
{
ULONG Type;
@@ -481,61 +587,20 @@
CommentStreamW = 11,
HandleDataStream = 12,
FunctionTableStream = 13,
+ UnloadedModuleListStream = 14,
+ MiscInfoStream = 15,
+ MemoryInfoListStream = 16,
+ ThreadInfoListStream = 17,
LastReservedStream = 0xffff
} MINIDUMP_STREAM_TYPE;
-typedef struct _MINIDUMP_SYSTEM_INFO
-{
- USHORT ProcessorArchitecture;
- USHORT ProcessorLevel;
- USHORT ProcessorRevision;
- USHORT Reserved0;
-
- ULONG MajorVersion;
- ULONG MinorVersion;
- ULONG BuildNumber;
- ULONG PlatformId;
-
- RVA CSDVersionRva;
- ULONG Reserved1;
- union _CPU_INFORMATION
- {
- struct
- {
- ULONG VendorId[3];
- ULONG VersionInformation;
- ULONG FeatureInformation;
- ULONG AMDExtendedCpuFeatures;
- } X86CpuInfo;
- struct
- {
- ULONGLONG ProcessorFeatures[2];
- } OtherCpuInfo;
- } Cpu;
-
-} MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO;
-
-typedef struct _MINIDUMP_THREAD
-{
- ULONG ThreadId;
- ULONG SuspendCount;
- ULONG PriorityClass;
- ULONG Priority;
- ULONGLONG Teb;
- MINIDUMP_MEMORY_DESCRIPTOR Stack;
- MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
-} MINIDUMP_THREAD, *PMINIDUMP_THREAD;
-
-typedef struct _MINIDUMP_THREAD_LIST
-{
- ULONG NumberOfThreads;
- MINIDUMP_THREAD Threads[1]; /* FIXME: no support of 0 sized array */
-} MINIDUMP_THREAD_LIST, *PMINIDUMP_THREAD_LIST;
-
-BOOL WINAPI MiniDumpWriteDump(HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,const PMINIDUMP_EXCEPTION_INFORMATION,
- const PMINIDUMP_USER_STREAM_INFORMATION,const PMINIDUMP_CALLBACK_INFORMATION);
-BOOL WINAPI MiniDumpReadDumpStream(PVOID,ULONG,PMINIDUMP_DIRECTORY*,PVOID*,ULONG*);
+BOOL WINAPI MiniDumpWriteDump(HANDLE, DWORD, HANDLE, MINIDUMP_TYPE,
+ const PMINIDUMP_EXCEPTION_INFORMATION,
+ const PMINIDUMP_USER_STREAM_INFORMATION,
+ const PMINIDUMP_CALLBACK_INFORMATION);
+BOOL WINAPI MiniDumpReadDumpStream(PVOID, ULONG, PMINIDUMP_DIRECTORY*, PVOID*,
+ ULONG*);
/*************************