/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: crash.h Abstract: This module implements support for handling crash dump files. *** Use this file when linking against crashxxx.lib Author: Lou Perazzoli (Loup) 10-Nov-1993 Wesley Witt (wesw) 1-Dec-1993 (additional work) Environment: NT 3.5 Revision History: --*/ #ifndef _CRASHLIB_ #define _CRASHLIB_ #if _MSC_VER > 1000 #pragma once #endif #ifdef __cplusplus #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable:4200) extern "C" { #endif #if 0 typedef struct _MEMORY_BASIC_INFORMATION32 { DWORD BaseAddress; DWORD AllocationBase; DWORD AllocationProtect; DWORD RegionSize; DWORD State; DWORD Protect; DWORD Type; } MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32; typedef struct _MEMORY_BASIC_INFORMATION64 { DWORDLONG BaseAddress; DWORDLONG AllocationBase; DWORD AllocationProtect; DWORD __alignment1; DWORDLONG RegionSize; DWORD State; DWORD Protect; DWORD Type; DWORD __alignment2; } MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64; #endif #define USERMODE_CRASHDUMP_SIGNATURE 'RESU' #define USERMODE_CRASHDUMP_VALID_DUMP32 'PMUD' #define USERMODE_CRASHDUMP_VALID_DUMP64 '46UD' typedef struct _USERMODE_CRASHDUMP_HEADER { DWORD Signature; DWORD ValidDump; DWORD MajorVersion; DWORD MinorVersion; DWORD MachineImageType; DWORD ThreadCount; DWORD ModuleCount; DWORD MemoryRegionCount; DWORD_PTR ThreadOffset; DWORD_PTR ModuleOffset; DWORD_PTR DataOffset; DWORD_PTR MemoryRegionOffset; DWORD_PTR DebugEventOffset; DWORD_PTR ThreadStateOffset; DWORD_PTR VersionInfoOffset; DWORD_PTR Spare1; } USERMODE_CRASHDUMP_HEADER, *PUSERMODE_CRASHDUMP_HEADER; typedef struct _USERMODE_CRASHDUMP_HEADER32 { DWORD Signature; DWORD ValidDump; DWORD MajorVersion; DWORD MinorVersion; DWORD MachineImageType; DWORD ThreadCount; DWORD ModuleCount; DWORD MemoryRegionCount; DWORD ThreadOffset; DWORD ModuleOffset; DWORD DataOffset; DWORD MemoryRegionOffset; DWORD DebugEventOffset; DWORD ThreadStateOffset; DWORD VersionInfoOffset; DWORD Spare1; } USERMODE_CRASHDUMP_HEADER32, *PUSERMODE_CRASHDUMP_HEADER32; typedef struct _USERMODE_CRASHDUMP_HEADER64 { DWORD Signature; DWORD ValidDump; DWORD MajorVersion; DWORD MinorVersion; DWORD MachineImageType; DWORD ThreadCount; DWORD ModuleCount; DWORD MemoryRegionCount; DWORDLONG ThreadOffset; DWORDLONG ModuleOffset; DWORDLONG DataOffset; DWORDLONG MemoryRegionOffset; DWORDLONG DebugEventOffset; DWORDLONG ThreadStateOffset; DWORDLONG VersionInfoOffset; DWORDLONG Spare1; } USERMODE_CRASHDUMP_HEADER64, *PUSERMODE_CRASHDUMP_HEADER64; typedef struct _CRASH_MODULE { DWORD_PTR BaseOfImage; DWORD SizeOfImage; DWORD ImageNameLength; CHAR ImageName[0]; } CRASH_MODULE, *PCRASH_MODULE; typedef struct _CRASH_MODULE32 { DWORD BaseOfImage; DWORD SizeOfImage; DWORD ImageNameLength; CHAR ImageName[0]; } CRASH_MODULE32, *PCRASH_MODULE32; typedef struct _CRASH_MODULE64 { DWORDLONG BaseOfImage; DWORD SizeOfImage; DWORD ImageNameLength; CHAR ImageName[0]; } CRASH_MODULE64, *PCRASH_MODULE64; typedef struct _CRASH_THREAD { DWORD ThreadId; DWORD SuspendCount; DWORD PriorityClass; DWORD Priority; DWORD_PTR Teb; DWORD_PTR Spare0; DWORD_PTR Spare1; DWORD_PTR Spare2; DWORD_PTR Spare3; DWORD_PTR Spare4; DWORD_PTR Spare5; DWORD_PTR Spare6; } CRASH_THREAD, *PCRASH_THREAD; typedef struct _CRASH_THREAD32 { DWORD ThreadId; DWORD SuspendCount; DWORD PriorityClass; DWORD Priority; DWORD Teb; DWORD Spare0; DWORD Spare1; DWORD Spare2; DWORD Spare3; DWORD Spare4; DWORD Spare5; DWORD Spare6; } CRASH_THREAD32, *PCRASH_THREAD32; typedef struct _CRASH_THREAD64 { DWORD ThreadId; DWORD SuspendCount; DWORD PriorityClass; DWORD Priority; DWORDLONG Teb; DWORDLONG Spare0; DWORDLONG Spare1; DWORDLONG Spare2; DWORDLONG Spare3; DWORDLONG Spare4; DWORDLONG Spare5; DWORDLONG Spare6; } CRASH_THREAD64, *PCRASH_THREAD64; typedef struct _CRASHDUMP_VERSION_INFO { BOOL IgnoreGuardPages; // Whether we should ignore GuardPages or not DWORD PointerSize; // 32, 64 bit pointers } CRASHDUMP_VERSION_INFO, *PCRASHDUMP_VERSION_INFO; // // usermode crash dump data types // #define DMP_EXCEPTION 1 // obsolete #define DMP_MEMORY_BASIC_INFORMATION 2 #define DMP_THREAD_CONTEXT 3 #define DMP_MODULE 4 #define DMP_MEMORY_DATA 5 #define DMP_DEBUG_EVENT 6 #define DMP_THREAD_STATE 7 #define DMP_DUMP_FILE_HANDLE 8 // // If a user mode API fails, GetLastError may return one of these error values // #define ERROR_DMP_INITIALIZENOTCALLED _HRESULT_TYPEDEF_(0xEFFF0001) #define ERROR_DMP_NOTUSERMODE _HRESULT_TYPEDEF_(0xEFFF0002) #define ERROR_DMP_HDR_THREADCOUNT _HRESULT_TYPEDEF_(0xEFFF0003) #define ERROR_DMP_HDR_MODULECOUNT _HRESULT_TYPEDEF_(0xEFFF0004) #define ERROR_DMP_HDR_MEMORYREGIONCOUNT _HRESULT_TYPEDEF_(0xEFFF0005) #define ERROR_DMP_HDR_THREADOFFSET _HRESULT_TYPEDEF_(0xEFFF0006) #define ERROR_DMP_HDR_MODULEOFFSET _HRESULT_TYPEDEF_(0xEFFF0007) #define ERROR_DMP_HDR_DATAOFFSET _HRESULT_TYPEDEF_(0xEFFF0008) #define ERROR_DMP_HDR_MEMORYREGIONOFFSET _HRESULT_TYPEDEF_(0xEFFF0009) #define ERROR_DMP_HDR_DEBUGEVENTOFFSET _HRESULT_TYPEDEF_(0xEFFF000A) #define ERROR_DMP_HDR_THREADSTATEOFFSET _HRESULT_TYPEDEF_(0xEFFF000B) #define ERROR_DMP_HDR_VERSIONINFOOFFSET _HRESULT_TYPEDEF_(0xEFFF000C) #define ERROR_DMP_HDR_SPARE1 _HRESULT_TYPEDEF_(0xEFFF000D) #define ERROR_DMP_OLD_VERSION _HRESULT_TYPEDEF_(0xEFFF000E) // // usermode crashdump error values // #define ERROR_DMP_DEBUG_EVENT _HRESULT_TYPEDEF_(0xEFFF000F) #define ERROR_DMP_MEMORY_MAP _HRESULT_TYPEDEF_(0xEFFF0010) #define ERROR_DMP_THREAD_CONTEXT _HRESULT_TYPEDEF_(0xEFFF0011) #define ERROR_DMP_THREAD_STATE _HRESULT_TYPEDEF_(0xEFFF0012) #define ERROR_DMP_MODULE_TABLE _HRESULT_TYPEDEF_(0xEFFF0013) // // usermode crashdump callback function // typedef BOOL (WINAPI *PDMP_CREATE_DUMP_CALLBACK)( DWORD DataType, PVOID* DumpData, LPDWORD DumpDataLength, PVOID UserData ); BOOL WINAPI DmpCreateUserDump( IN LPSTR CrashDumpName, IN PDMP_CREATE_DUMP_CALLBACK DmpCallback, IN PVOID lpv ); BOOL WINAPI DmpCreateUserDumpW( IN LPWSTR CrashDumpName, IN PDMP_CREATE_DUMP_CALLBACK DmpCallback, IN PVOID lpv ); BOOL WINAPI DmpInitialize ( IN LPSTR FileName, OUT PCONTEXT *Context, OUT PEXCEPTION_RECORD *Exception, OUT PVOID *DmpHeader ); VOID WINAPI DmpUnInitialize ( VOID ); DWORD WINAPI DmpReadMemory ( IN ULONG64 BaseAddress, IN PVOID Buffer, IN ULONG Size ); DWORD WINAPI DmpWriteMemory ( IN ULONG64 BaseAddress, IN PVOID Buffer, IN ULONG Size ); DWORD WINAPI DmpReadPhysicalMemory ( IN ULONG64 BaseAddress, IN PVOID Buffer, IN ULONG Size ); DWORD WINAPI DmpWritePhysicalMemory ( IN ULONG64 BaseAddress, IN PVOID Buffer, IN ULONG Size ); DWORD WINAPI DmpReadFileByteOffset ( IN ULONG FileByteOffset, IN PVOID Buffer, IN ULONG Size ); BOOL WINAPI DmpReadControlSpace( IN USHORT Processor, IN ULONG64 TargetBaseAddress, OUT PVOID UserInterfaceBuffer, OUT ULONG TransferCount, OUT PULONG ActualBytesRead ); BOOL WINAPI DmpGetContext( IN ULONG Processor, OUT PVOID Context ); INT WINAPI DmpGetCurrentProcessor( VOID ); BOOL WINAPI DmpGetThread( IN ULONG ThreadIndex, OUT PCRASH_THREAD Thread ); BOOL WINAPI DmpDetectVersionParameters( CRASHDUMP_VERSION_INFO* VersionInfo ); BOOL WINAPI DmpSetVersionParameters( PCRASHDUMP_VERSION_INFO VersionInfo ); BOOL WINAPI DmpValidateDumpFile( BOOL ThoroughCheck ); #ifdef __cplusplus } #if _MSC_VER >= 1200 #pragma warning(pop) #else #pragma warning(default:4200) #endif #endif #endif