123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- // +build windows
- package sys_windows
- foreign import "system:Dbghelp.lib"
- RVA :: DWORD
- MINIDUMP_LOCATION_DESCRIPTOR :: struct {
- DataSize: ULONG32,
- Rva: RVA,
- }
- MINIDUMP_DIRECTORY :: struct {
- StreamType: ULONG32,
- Location: MINIDUMP_LOCATION_DESCRIPTOR,
- }
- MINIDUMP_EXCEPTION_INFORMATION :: struct {
- ThreadId: DWORD,
- ExceptionPointers: ^EXCEPTION_POINTERS,
- ClientPointers: BOOL,
- }
- MINIDUMP_MEMORY_INFO :: struct {
- BaseAddress: ULONG64,
- AllocationBase: ULONG64,
- AllocationProtect: ULONG32,
- __alignment1: ULONG32,
- RegionSize: ULONG64,
- State: ULONG32,
- Protect: ULONG32,
- Type: ULONG32,
- __alignment2: ULONG32,
- }
- MINIDUMP_USER_STREAM :: struct {
- Type: ULONG32,
- BufferSize: ULONG,
- Buffer: PVOID,
- }
- MINIDUMP_USER_STREAM_INFORMATION :: struct {
- UserStreamCount: ULONG,
- UserStreamArray: ^MINIDUMP_USER_STREAM,
- }
- MINIDUMP_CALLBACK_ROUTINE :: #type proc "system" (
- CallbackParam: PVOID,
- CallbackInput: ^MINIDUMP_CALLBACK_INPUT,
- CallbackOutpu: ^MINIDUMP_CALLBACK_OUTPUT,
- ) -> BOOL
- MINIDUMP_CALLBACK_INFORMATION :: struct {
- CallbackRoutine: MINIDUMP_CALLBACK_ROUTINE,
- CallbackParam: PVOID,
- }
- MINIDUMP_CALLBACK_INPUT :: struct {
- ProcessId: ULONG,
- ProcessHandle: HANDLE,
- CallbackType: ULONG,
- using _: struct #raw_union {
- Status: HRESULT,
- Thread: MINIDUMP_THREAD_CALLBACK,
- ThreadEx: MINIDUMP_THREAD_EX_CALLBACK,
- Module: MINIDUMP_MODULE_CALLBACK,
- IncludeThread: MINIDUMP_INCLUDE_THREAD_CALLBACK,
- IncludeModule: MINIDUMP_INCLUDE_MODULE_CALLBACK,
- Io: MINIDUMP_IO_CALLBACK,
- ReadMemoryFailure: MINIDUMP_READ_MEMORY_FAILURE_CALLBACK,
- SecondaryFlags: ULONG,
- VmQuery: MINIDUMP_VM_QUERY_CALLBACK,
- VmPreRead: MINIDUMP_VM_PRE_READ_CALLBACK,
- VmPostRead: MINIDUMP_VM_POST_READ_CALLBACK,
- },
- }
- _MINIDUMP_ARM64_PAD :: ULONG when ODIN_ARCH == .arm64 else struct {}
- MINIDUMP_THREAD_CALLBACK :: struct {
- ThreadId: ULONG,
- ThreadHandle: HANDLE,
- Pad: _MINIDUMP_ARM64_PAD,
- Context: CONTEXT,
- SizeOfContext: ULONG,
- StackBase: ULONG64,
- StackEnd: ULONG64,
- }
- MINIDUMP_THREAD_EX_CALLBACK :: struct {
- ThreadId: ULONG,
- ThreadHandle: HANDLE,
- Pad: _MINIDUMP_ARM64_PAD,
- Context: CONTEXT,
- SizeOfContext: ULONG,
- StackBase: ULONG64,
- StackEnd: ULONG64,
- BackingStoreBase: ULONG64,
- BackingStoreEnd: ULONG64,
- }
- MINIDUMP_INCLUDE_THREAD_CALLBACK :: struct {
- ThreadId: ULONG,
- }
- // NOTE(jakubtomsu): From verrsrc.h
- VS_FIXEDFILEINFO :: struct {
- dwSignature: DWORD, /* e.g. 0xfeef04bd */
- dwStrucVersion: DWORD, /* e.g. 0x00000042 = "0.42" */
- dwFileVersionMS: DWORD, /* e.g. 0x00030075 = "3.75" */
- dwFileVersionLS: DWORD, /* e.g. 0x00000031 = "0.31" */
- dwProductVersionMS: DWORD, /* e.g. 0x00030010 = "3.10" */
- dwProductVersionLS: DWORD, /* e.g. 0x00000031 = "0.31" */
- dwFileFlagsMask: DWORD, /* = 0x3F for version "0.42" */
- dwFileFlags: DWORD, /* e.g. VFF_DEBUG | VFF_PRERELEASE */
- dwFileOS: DWORD, /* e.g. VOS_DOS_WINDOWS16 */
- dwFileType: DWORD, /* e.g. VFT_DRIVER */
- dwFileSubtype: DWORD, /* e.g. VFT2_DRV_KEYBOARD */
- dwFileDateMS: DWORD, /* e.g. 0 */
- dwFileDateLS: DWORD, /* e.g. 0 */
- }
- MINIDUMP_MODULE_CALLBACK :: struct {
- FullPath: ^WCHAR,
- BaseOfImage: ULONG64,
- SizeOfImage: ULONG,
- CheckSum: ULONG,
- TimeDateStamp: ULONG,
- VersionInfo: VS_FIXEDFILEINFO,
- CvRecord: PVOID,
- SizeOfCvRecord: ULONG,
- MiscRecord: PVOID,
- SizeOfMiscRecord: ULONG,
- }
- MINIDUMP_INCLUDE_MODULE_CALLBACK :: struct {
- BaseOfImage: u64,
- }
- MINIDUMP_IO_CALLBACK :: struct {
- Handle: HANDLE,
- Offset: ULONG64,
- Buffer: PVOID,
- BufferBytes: ULONG,
- }
- MINIDUMP_READ_MEMORY_FAILURE_CALLBACK :: struct {
- Offset: ULONG64,
- Bytes: ULONG,
- FailureStatus: HRESULT,
- }
- MINIDUMP_VM_QUERY_CALLBACK :: struct {
- Offset: ULONG64,
- }
- MINIDUMP_VM_PRE_READ_CALLBACK :: struct {
- Offset: ULONG64,
- Buffer: PVOID,
- Size: ULONG,
- }
- MINIDUMP_VM_POST_READ_CALLBACK :: struct {
- Offset: ULONG64,
- Buffer: PVOID,
- Size: ULONG,
- Completed: ULONG,
- Status: HRESULT,
- }
- MINIDUMP_CALLBACK_OUTPUT :: struct {
- using _: struct #raw_union {
- ModuleWriteFlags: ULONG,
- ThreadWriteFlags: ULONG,
- SecondaryFlags: ULONG,
- using _: struct {
- MemoryBase: ULONG64,
- MemorySize: ULONG,
- },
- using _: struct {
- CheckCancel: BOOL,
- Cancel: BOOL,
- },
- Handle: HANDLE,
- using _: struct {
- VmRegion: MINIDUMP_MEMORY_INFO,
- Continue: BOOL,
- },
- using _: struct {
- VmQueryStatus: HRESULT,
- VmQueryResult: MINIDUMP_MEMORY_INFO,
- },
- using _: struct {
- VmReadStatus: HRESULT,
- VmReadBytesCompleted: ULONG,
- },
- Status: HRESULT,
- },
- }
- MINIDUMP_TYPE :: enum u32 {
- Normal = 0x00000000,
- WithDataSegs = 0x00000001,
- WithFullMemory = 0x00000002,
- WithHandleData = 0x00000004,
- FilterMemory = 0x00000008,
- ScanMemory = 0x00000010,
- WithUnloadedModules = 0x00000020,
- WithIndirectlyReferencedMemory = 0x00000040,
- FilterModulePaths = 0x00000080,
- WithProcessThreadData = 0x00000100,
- WithPrivateReadWriteMemory = 0x00000200,
- WithoutOptionalData = 0x00000400,
- WithFullMemoryInfo = 0x00000800,
- WithThreadInfo = 0x00001000,
- WithCodeSegs = 0x00002000,
- WithoutAuxiliaryState = 0x00004000,
- WithFullAuxiliaryState = 0x00008000,
- WithPrivateWriteCopyMemory = 0x00010000,
- IgnoreInaccessibleMemory = 0x00020000,
- WithTokenInformation = 0x00040000,
- WithModuleHeaders = 0x00080000,
- FilterTriage = 0x00100000,
- WithAvxXStateContext = 0x00200000,
- WithIptTrace = 0x00400000,
- ScanInaccessiblePartialPages = 0x00800000,
- FilterWriteCombinedMemory = 0x01000000,
- ValidTypeFlags = 0x01ffffff,
- }
- SYMBOL_INFOW :: struct {
- SizeOfStruct: ULONG,
- TypeIndex: ULONG,
- Reserved: [2]ULONG64,
- Index: ULONG,
- Size: ULONG,
- ModBase: ULONG64,
- Flags: ULONG,
- Value: ULONG64,
- Address: ULONG64,
- Register: ULONG,
- Scope: ULONG,
- Tag: ULONG,
- NameLen: ULONG,
- MaxNameLen: ULONG,
- Name: [1]WCHAR,
- }
- IMAGEHLP_LINE64 :: struct {
- SizeOfStruct: DWORD,
- Key: PVOID,
- LineNumber: DWORD,
- FileName: PWSTR,
- Address: DWORD64,
- }
- PSYMBOL_INFOW :: ^SYMBOL_INFOW
- PIMAGEHLP_LINEW64 :: ^IMAGEHLP_LINE64
- SYMOPT_LOAD_LINES :: 0x00000010
- @(default_calling_convention = "system")
- foreign Dbghelp {
- MiniDumpWriteDump :: proc(
- hProcess: HANDLE,
- ProcessId: DWORD,
- hFile: HANDLE,
- DumpType: MINIDUMP_TYPE,
- ExceptionParam: ^MINIDUMP_EXCEPTION_INFORMATION,
- UserStreamParam: ^MINIDUMP_USER_STREAM_INFORMATION,
- CallbackPara: ^MINIDUMP_CALLBACK_INFORMATION,
- ) -> BOOL ---
-
- MiniDumpReadDumpStream :: proc(
- BaseOfDump: PVOID,
- StreamNumber: ULONG,
- Dir: ^^MINIDUMP_DIRECTORY,
- StreamPointer: ^PVOID,
- StreamSize: ^ULONG,
- ) -> BOOL ---
- SymInitialize :: proc(hProcess: HANDLE, UserSearchPath: PCSTR, fInvadeProcess: BOOL) -> BOOL ---
- SymCleanup :: proc(hProcess: HANDLE) -> BOOL ---
- SymSetOptions :: proc(SymOptions: DWORD) -> DWORD ---
- SymFromAddrW :: proc(hProcess: HANDLE, Address: DWORD64, Displacement: PDWORD64, Symbol: PSYMBOL_INFOW) -> BOOL ---
- SymGetLineFromAddrW64 :: proc(hProcess: HANDLE, dwAddr: DWORD64, pdwDisplacement: PDWORD, Line: PIMAGEHLP_LINEW64) -> BOOL ---
- }
|