#![allow(non_snake_case, non_camel_case_types)]
pub const EXCEPTION_MAXIMUM_PARAMETERS: usize = 15;
pub const MINIDUMP_SIGNATURE: u32 = 0x504D_444D;
pub const DUMP_FLAGS: u64 = 0x001F_FFFF;
pub const ARCH_X64: u16 = 9;
pub const ARCH_X86: u16 = 0;
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_HEADER {
pub Signature: u32,
pub Version: u32,
pub NumberOfStreams: u32,
pub StreamDirectoryRva: u32,
pub CheckSum: u32,
pub Reserved: u32,
pub TimeDateStamp: u32,
pub Flags: u64,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
#[derive(Debug)]
pub struct MINIDUMP_DIRECTORY {
pub StreamType: u32,
pub Location: MINIDUMP_LOCATION_DESCRIPTOR,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_EXCEPTION_STREAM {
pub ThreadId: u32,
pub alignment: u32,
pub ExceptionRecord: MINIDUMP_EXCEPTION,
pub ThreadContext: MINIDUMP_LOCATION_DESCRIPTOR,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_EXCEPTION {
pub ExceptionCode: u32,
pub ExceptionFlags: u32,
pub ExceptionRecord: u64,
pub ExceptionAddress: u64,
pub NumberParameters: u32,
pub unusedAlignment: u32,
pub ExceptionInformation: [u64; EXCEPTION_MAXIMUM_PARAMETERS],
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MEMORY_INFO_LIST {
pub SizeOfHeader: u32,
pub SizeOfEntry: u32,
pub NumberOfEntries: u64,
#[br(count = NumberOfEntries)]
pub Entries: Vec<MINIDUMP_MEMORY_INFO>,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MEMORY_INFO {
pub BaseAddress: u64,
pub AllocationBase: u64,
pub AllocationProtect: u32,
pub alignment1: u32,
pub RegionSize: u64,
pub State: u32,
pub Protect: u32,
pub Type: u32,
pub alignment2: u32,
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MEMORY64_LIST {
pub NumberOfMemoryRanges: u64,
pub BaseRva: u64,
#[br(count = NumberOfMemoryRanges)]
pub Ranges: Vec<MINIDUMP_MEMORY_DESCRIPTOR64>,
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MEMORY_DESCRIPTOR64 {
pub StartOfMemoryRange: u64,
pub DataSize: u64,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_SYSTEM_INFO {
pub ProcessorArchitecture: u16,
pub ProcessorLevel: u16,
pub ProcessorRevision: u16,
pub NumberOfProcessors: u8,
pub ProductType: u8,
pub MajorVersion: u32,
pub MinorVersion: u32,
pub BuildNumber: u32,
pub PlatformId: u32,
pub CSDVersionRva: u32,
pub SuiteMask: u16,
pub Reserved2: u16,
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MODULE_LIST {
pub NumberOfModules: u32,
#[br(count = NumberOfModules)]
pub Modules: Vec<MINIDUMP_MODULE>,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MODULE {
pub BaseOfImage: u64,
pub SizeOfImage: u32,
pub CheckSum: u32,
pub TimeDateStamp: u32,
pub ModuleNameRva: u32,
pub VersionInfo: VS_FIXEDFILEINFO,
pub CvRecord: MINIDUMP_LOCATION_DESCRIPTOR,
pub MiscRecord: MINIDUMP_LOCATION_DESCRIPTOR,
pub Reserved0: u64,
pub Reserved1: u64,
}
#[repr(transparent)]
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct VS_FIXEDFILEINFO_FILE_FLAGS(pub u32);
#[repr(transparent)]
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct VS_FIXEDFILEINFO_FILE_OS(pub u32);
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct VS_FIXEDFILEINFO {
pub dwSignature: u32,
pub dwStrucVersion: u32,
pub dwFileVersionMS: u32,
pub dwFileVersionLS: u32,
pub dwProductVersionMS: u32,
pub dwProductVersionLS: u32,
pub dwFileFlagsMask: u32,
pub dwFileFlags: VS_FIXEDFILEINFO_FILE_FLAGS,
pub dwFileOS: VS_FIXEDFILEINFO_FILE_OS,
pub dwFileType: u32,
pub dwFileSubtype: u32,
pub dwFileDateMS: u32,
pub dwFileDateLS: u32,
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_THREAD_LIST {
pub NumberOfThreads: u32,
#[br(count = NumberOfThreads)]
pub Threads: Vec<MINIDUMP_THREAD>,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_THREAD {
pub ThreadId: u32,
pub SuspendCount: u32,
pub PriorityClass: u32,
pub Priority: u32,
pub Teb: u64,
pub Stack: MINIDUMP_MEMORY_DESCRIPTOR,
pub ThreadContext: MINIDUMP_LOCATION_DESCRIPTOR,
}
#[derive(Copy, Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_MEMORY_DESCRIPTOR {
pub StartOfMemoryRange: u64,
pub Memory: MINIDUMP_LOCATION_DESCRIPTOR,
}
#[derive(Copy, Clone, Debug)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_LOCATION_DESCRIPTOR {
pub DataSize: u32,
pub RVA: u32,
}
#[derive(Debug, Clone, Copy, binrw::NamedArgs)]
pub struct HandleArgs {
pub size_of_descriptor: u32,
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_HANDLE_DATA_STREAM {
pub SizeOfHeader: u32,
pub SizeOfDescriptor: u32,
pub NumberOfDescriptors: u32,
pub Reserved: u32,
#[br(
count = NumberOfDescriptors,
args { inner: (SizeOfDescriptor,) }
)]
pub Handles: Vec<MINIDUMP_HANDLE_DESCRIPTOR>,
}
#[derive(Clone)]
#[binrw::binrw]
#[brw(little, import(size_of_descriptor: u32))]
#[allow(clippy::manual_non_exhaustive)]
pub struct MINIDUMP_HANDLE_DESCRIPTOR {
pub Handle: u64,
pub TypeNameRva: u32,
pub ObjectNameRva: u32,
pub Attributes: u32,
pub GrantedAccess: u32,
pub HandleCount: u32,
pub PointerCount: u32,
#[br(pad_after = (size_of_descriptor - size_of::<Self>() as u32) as usize)]
_padding: (),
}
#[binrw::binrw]
#[brw(little)]
pub struct MINIDUMP_STRING {
pub Length: u32,
#[br(count = Length / 2)]
pub Buffer: Vec<u16>,
}
#[allow(dead_code)]
#[repr(u32)]
pub enum MINIDUMP_STREAM_TYPE {
UnusedStream = 0,
ReservedStream0 = 1,
ReservedStream1 = 2,
ThreadListStream = 3,
ModuleListStream = 4,
MemoryListStream = 5,
ExceptionStream = 6,
SystemInfoStream = 7,
ThreadExListStream = 8,
Memory64ListStream = 9,
CommentStreamA = 10,
CommentStreamW = 11,
HandleDataStream = 12,
FunctionTableStream = 13,
UnloadedModuleListStream = 14,
MiscInfoStream = 15,
MemoryInfoListStream = 16,
ThreadInfoListStream = 17,
HandleOperationListStream = 18,
TokenStream = 19,
JavaScriptDataStream = 20,
SystemMemoryInfoStream = 21,
ProcessVmCountersStream = 22,
IptTraceStream = 23,
ThreadNamesStream = 24,
ceStreamNull = 0x8000,
ceStreamSystemInfo = 0x8001,
ceStreamException = 0x8002,
ceStreamModuleList = 0x8003,
ceStreamProcessList = 0x8004,
ceStreamThreadList = 0x8005,
ceStreamThreadContextList = 0x8006,
ceStreamThreadCallStackList = 0x8007,
ceStreamMemoryVirtualList = 0x8008,
ceStreamMemoryPhysicalList = 0x8009,
ceStreamBucketParameters = 0x800A,
ceStreamProcessModuleMap = 0x800B,
ceStreamDiagnosisList = 0x800C,
LastReservedStream = 0xffff,
}
impl TryFrom<u32> for MINIDUMP_STREAM_TYPE {
type Error = &'static str;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
0 => Ok(MINIDUMP_STREAM_TYPE::UnusedStream),
1 => Ok(MINIDUMP_STREAM_TYPE::ReservedStream0),
2 => Ok(MINIDUMP_STREAM_TYPE::ReservedStream1),
3 => Ok(MINIDUMP_STREAM_TYPE::ThreadListStream),
4 => Ok(MINIDUMP_STREAM_TYPE::ModuleListStream),
5 => Ok(MINIDUMP_STREAM_TYPE::MemoryListStream),
6 => Ok(MINIDUMP_STREAM_TYPE::ExceptionStream),
7 => Ok(MINIDUMP_STREAM_TYPE::SystemInfoStream),
8 => Ok(MINIDUMP_STREAM_TYPE::ThreadExListStream),
9 => Ok(MINIDUMP_STREAM_TYPE::Memory64ListStream),
10 => Ok(MINIDUMP_STREAM_TYPE::CommentStreamA),
11 => Ok(MINIDUMP_STREAM_TYPE::CommentStreamW),
12 => Ok(MINIDUMP_STREAM_TYPE::HandleDataStream),
13 => Ok(MINIDUMP_STREAM_TYPE::FunctionTableStream),
14 => Ok(MINIDUMP_STREAM_TYPE::UnloadedModuleListStream),
15 => Ok(MINIDUMP_STREAM_TYPE::MiscInfoStream),
16 => Ok(MINIDUMP_STREAM_TYPE::MemoryInfoListStream),
17 => Ok(MINIDUMP_STREAM_TYPE::ThreadInfoListStream),
18 => Ok(MINIDUMP_STREAM_TYPE::HandleOperationListStream),
19 => Ok(MINIDUMP_STREAM_TYPE::TokenStream),
20 => Ok(MINIDUMP_STREAM_TYPE::JavaScriptDataStream),
21 => Ok(MINIDUMP_STREAM_TYPE::SystemMemoryInfoStream),
22 => Ok(MINIDUMP_STREAM_TYPE::ProcessVmCountersStream),
23 => Ok(MINIDUMP_STREAM_TYPE::IptTraceStream),
24 => Ok(MINIDUMP_STREAM_TYPE::ThreadNamesStream),
0x8000 => Ok(MINIDUMP_STREAM_TYPE::ceStreamNull),
0x8001 => Ok(MINIDUMP_STREAM_TYPE::ceStreamSystemInfo),
0x8002 => Ok(MINIDUMP_STREAM_TYPE::ceStreamException),
0x8003 => Ok(MINIDUMP_STREAM_TYPE::ceStreamModuleList),
0x8004 => Ok(MINIDUMP_STREAM_TYPE::ceStreamProcessList),
0x8005 => Ok(MINIDUMP_STREAM_TYPE::ceStreamThreadList),
0x8006 => Ok(MINIDUMP_STREAM_TYPE::ceStreamThreadContextList),
0x8007 => Ok(MINIDUMP_STREAM_TYPE::ceStreamThreadCallStackList),
0x8008 => Ok(MINIDUMP_STREAM_TYPE::ceStreamMemoryVirtualList),
0x8009 => Ok(MINIDUMP_STREAM_TYPE::ceStreamMemoryPhysicalList),
0x800A => Ok(MINIDUMP_STREAM_TYPE::ceStreamBucketParameters),
0x800B => Ok(MINIDUMP_STREAM_TYPE::ceStreamProcessModuleMap),
0x800C => Ok(MINIDUMP_STREAM_TYPE::ceStreamDiagnosisList),
0xffff => Ok(MINIDUMP_STREAM_TYPE::LastReservedStream),
_ => Err("Invalid value for MINIDUMP_STREAM_TYPE"),
}
}
}
#[derive(Debug)]
#[repr(C, align(16))]
pub struct CONTEXT_X64 {
pub P1Home: u64,
pub P2Home: u64,
pub P3Home: u64,
pub P4Home: u64,
pub P5Home: u64,
pub P6Home: u64,
pub ContextFlags: u32,
pub MxCsr: u32,
pub SegCs: u16,
pub SegDs: u16,
pub SegEs: u16,
pub SegFs: u16,
pub SegGs: u16,
pub SegSs: u16,
pub EFlags: u32,
pub Dr0: u64,
pub Dr1: u64,
pub Dr2: u64,
pub Dr3: u64,
pub Dr6: u64,
pub Dr7: u64,
pub Rax: u64,
pub Rcx: u64,
pub Rdx: u64,
pub Rbx: u64,
pub Rsp: u64,
pub Rbp: u64,
pub Rsi: u64,
pub Rdi: u64,
pub R8: u64,
pub R9: u64,
pub R10: u64,
pub R11: u64,
pub R12: u64,
pub R13: u64,
pub R14: u64,
pub R15: u64,
pub Rip: u64,
pub Header: [u128; 2],
pub Legacy: [u128; 8],
pub Xmm0: u128,
pub Xmm1: u128,
pub Xmm2: u128,
pub Xmm3: u128,
pub Xmm4: u128,
pub Xmm5: u128,
pub Xmm6: u128,
pub Xmm7: u128,
pub Xmm8: u128,
pub Xmm9: u128,
pub Xmm10: u128,
pub Xmm11: u128,
pub Xmm12: u128,
pub Xmm13: u128,
pub Xmm14: u128,
pub Xmm15: u128,
pub Padding: [u8; 0x60],
pub VectorRegister: [u128; 26],
pub VectorControl: u64,
pub DebugControl: u64,
pub LastBranchToRip: u64,
pub LastBranchFromRip: u64,
pub LastExceptionToRip: u64,
pub LastExceptionFromRip: u64,
}
#[derive(Debug)]
#[repr(C)]
pub struct CONTEXT_X86 {
pub ContextFlags: u32,
pub Dr0: u32,
pub Dr1: u32,
pub Dr2: u32,
pub Dr3: u32,
pub Dr6: u32,
pub Dr7: u32,
pub ControlWord: u32,
pub StatusWord: u32,
pub TagWord: u32,
pub ErrorOffset: u32,
pub ErrorSelector: u32,
pub DataOffset: u32,
pub DataSelector: u32,
pub RegisterArea: [u8; 80],
pub Spare0: u32,
pub SegGs: u32,
pub SegFs: u32,
pub SegEs: u32,
pub SegDs: u32,
pub Edi: u32,
pub Esi: u32,
pub Ebx: u32,
pub Edx: u32,
pub Ecx: u32,
pub Eax: u32,
pub Ebp: u32,
pub Eip: u32,
pub SegCs: u32,
pub EFlags: u32,
pub Esp: u32,
pub SegSs: u32,
pub ExtendedRegisters: [u8; 512],
}