dbghelp.odin 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // +build windows
  2. package sys_windows
  3. foreign import "system:Dbghelp.lib"
  4. RVA :: DWORD
  5. MINIDUMP_LOCATION_DESCRIPTOR :: struct {
  6. DataSize: ULONG32,
  7. Rva: RVA,
  8. }
  9. MINIDUMP_DIRECTORY :: struct {
  10. StreamType: ULONG32,
  11. Location: MINIDUMP_LOCATION_DESCRIPTOR,
  12. }
  13. MINIDUMP_EXCEPTION_INFORMATION :: struct {
  14. ThreadId: DWORD,
  15. ExceptionPointers: ^EXCEPTION_POINTERS,
  16. ClientPointers: BOOL,
  17. }
  18. MINIDUMP_MEMORY_INFO :: struct {
  19. BaseAddress: ULONG64,
  20. AllocationBase: ULONG64,
  21. AllocationProtect: ULONG32,
  22. __alignment1: ULONG32,
  23. RegionSize: ULONG64,
  24. State: ULONG32,
  25. Protect: ULONG32,
  26. Type: ULONG32,
  27. __alignment2: ULONG32,
  28. }
  29. MINIDUMP_USER_STREAM :: struct {
  30. Type: ULONG32,
  31. BufferSize: ULONG,
  32. Buffer: PVOID,
  33. }
  34. MINIDUMP_USER_STREAM_INFORMATION :: struct {
  35. UserStreamCount: ULONG,
  36. UserStreamArray: ^MINIDUMP_USER_STREAM,
  37. }
  38. MINIDUMP_CALLBACK_ROUTINE :: #type proc "system" (
  39. CallbackParam: PVOID,
  40. CallbackInput: ^MINIDUMP_CALLBACK_INPUT,
  41. CallbackOutpu: ^MINIDUMP_CALLBACK_OUTPUT,
  42. ) -> BOOL
  43. MINIDUMP_CALLBACK_INFORMATION :: struct {
  44. CallbackRoutine: MINIDUMP_CALLBACK_ROUTINE,
  45. CallbackParam: PVOID,
  46. }
  47. MINIDUMP_CALLBACK_INPUT :: struct {
  48. ProcessId: ULONG,
  49. ProcessHandle: HANDLE,
  50. CallbackType: ULONG,
  51. using _: struct #raw_union {
  52. Status: HRESULT,
  53. Thread: MINIDUMP_THREAD_CALLBACK,
  54. ThreadEx: MINIDUMP_THREAD_EX_CALLBACK,
  55. Module: MINIDUMP_MODULE_CALLBACK,
  56. IncludeThread: MINIDUMP_INCLUDE_THREAD_CALLBACK,
  57. IncludeModule: MINIDUMP_INCLUDE_MODULE_CALLBACK,
  58. Io: MINIDUMP_IO_CALLBACK,
  59. ReadMemoryFailure: MINIDUMP_READ_MEMORY_FAILURE_CALLBACK,
  60. SecondaryFlags: ULONG,
  61. VmQuery: MINIDUMP_VM_QUERY_CALLBACK,
  62. VmPreRead: MINIDUMP_VM_PRE_READ_CALLBACK,
  63. VmPostRead: MINIDUMP_VM_POST_READ_CALLBACK,
  64. },
  65. }
  66. _MINIDUMP_ARM64_PAD :: ULONG when ODIN_ARCH == .arm64 else struct {}
  67. MINIDUMP_THREAD_CALLBACK :: struct {
  68. ThreadId: ULONG,
  69. ThreadHandle: HANDLE,
  70. Pad: _MINIDUMP_ARM64_PAD,
  71. Context: CONTEXT,
  72. SizeOfContext: ULONG,
  73. StackBase: ULONG64,
  74. StackEnd: ULONG64,
  75. }
  76. MINIDUMP_THREAD_EX_CALLBACK :: struct {
  77. ThreadId: ULONG,
  78. ThreadHandle: HANDLE,
  79. Pad: _MINIDUMP_ARM64_PAD,
  80. Context: CONTEXT,
  81. SizeOfContext: ULONG,
  82. StackBase: ULONG64,
  83. StackEnd: ULONG64,
  84. BackingStoreBase: ULONG64,
  85. BackingStoreEnd: ULONG64,
  86. }
  87. MINIDUMP_INCLUDE_THREAD_CALLBACK :: struct {
  88. ThreadId: ULONG,
  89. }
  90. // NOTE(jakubtomsu): From verrsrc.h
  91. VS_FIXEDFILEINFO :: struct {
  92. dwSignature: DWORD, /* e.g. 0xfeef04bd */
  93. dwStrucVersion: DWORD, /* e.g. 0x00000042 = "0.42" */
  94. dwFileVersionMS: DWORD, /* e.g. 0x00030075 = "3.75" */
  95. dwFileVersionLS: DWORD, /* e.g. 0x00000031 = "0.31" */
  96. dwProductVersionMS: DWORD, /* e.g. 0x00030010 = "3.10" */
  97. dwProductVersionLS: DWORD, /* e.g. 0x00000031 = "0.31" */
  98. dwFileFlagsMask: DWORD, /* = 0x3F for version "0.42" */
  99. dwFileFlags: DWORD, /* e.g. VFF_DEBUG | VFF_PRERELEASE */
  100. dwFileOS: DWORD, /* e.g. VOS_DOS_WINDOWS16 */
  101. dwFileType: DWORD, /* e.g. VFT_DRIVER */
  102. dwFileSubtype: DWORD, /* e.g. VFT2_DRV_KEYBOARD */
  103. dwFileDateMS: DWORD, /* e.g. 0 */
  104. dwFileDateLS: DWORD, /* e.g. 0 */
  105. }
  106. MINIDUMP_MODULE_CALLBACK :: struct {
  107. FullPath: ^WCHAR,
  108. BaseOfImage: ULONG64,
  109. SizeOfImage: ULONG,
  110. CheckSum: ULONG,
  111. TimeDateStamp: ULONG,
  112. VersionInfo: VS_FIXEDFILEINFO,
  113. CvRecord: PVOID,
  114. SizeOfCvRecord: ULONG,
  115. MiscRecord: PVOID,
  116. SizeOfMiscRecord: ULONG,
  117. }
  118. MINIDUMP_INCLUDE_MODULE_CALLBACK :: struct {
  119. BaseOfImage: u64,
  120. }
  121. MINIDUMP_IO_CALLBACK :: struct {
  122. Handle: HANDLE,
  123. Offset: ULONG64,
  124. Buffer: PVOID,
  125. BufferBytes: ULONG,
  126. }
  127. MINIDUMP_READ_MEMORY_FAILURE_CALLBACK :: struct {
  128. Offset: ULONG64,
  129. Bytes: ULONG,
  130. FailureStatus: HRESULT,
  131. }
  132. MINIDUMP_VM_QUERY_CALLBACK :: struct {
  133. Offset: ULONG64,
  134. }
  135. MINIDUMP_VM_PRE_READ_CALLBACK :: struct {
  136. Offset: ULONG64,
  137. Buffer: PVOID,
  138. Size: ULONG,
  139. }
  140. MINIDUMP_VM_POST_READ_CALLBACK :: struct {
  141. Offset: ULONG64,
  142. Buffer: PVOID,
  143. Size: ULONG,
  144. Completed: ULONG,
  145. Status: HRESULT,
  146. }
  147. MINIDUMP_CALLBACK_OUTPUT :: struct {
  148. using _: struct #raw_union {
  149. ModuleWriteFlags: ULONG,
  150. ThreadWriteFlags: ULONG,
  151. SecondaryFlags: ULONG,
  152. using _: struct {
  153. MemoryBase: ULONG64,
  154. MemorySize: ULONG,
  155. },
  156. using _: struct {
  157. CheckCancel: BOOL,
  158. Cancel: BOOL,
  159. },
  160. Handle: HANDLE,
  161. using _: struct {
  162. VmRegion: MINIDUMP_MEMORY_INFO,
  163. Continue: BOOL,
  164. },
  165. using _: struct {
  166. VmQueryStatus: HRESULT,
  167. VmQueryResult: MINIDUMP_MEMORY_INFO,
  168. },
  169. using _: struct {
  170. VmReadStatus: HRESULT,
  171. VmReadBytesCompleted: ULONG,
  172. },
  173. Status: HRESULT,
  174. },
  175. }
  176. MINIDUMP_TYPE :: enum u32 {
  177. Normal = 0x00000000,
  178. WithDataSegs = 0x00000001,
  179. WithFullMemory = 0x00000002,
  180. WithHandleData = 0x00000004,
  181. FilterMemory = 0x00000008,
  182. ScanMemory = 0x00000010,
  183. WithUnloadedModules = 0x00000020,
  184. WithIndirectlyReferencedMemory = 0x00000040,
  185. FilterModulePaths = 0x00000080,
  186. WithProcessThreadData = 0x00000100,
  187. WithPrivateReadWriteMemory = 0x00000200,
  188. WithoutOptionalData = 0x00000400,
  189. WithFullMemoryInfo = 0x00000800,
  190. WithThreadInfo = 0x00001000,
  191. WithCodeSegs = 0x00002000,
  192. WithoutAuxiliaryState = 0x00004000,
  193. WithFullAuxiliaryState = 0x00008000,
  194. WithPrivateWriteCopyMemory = 0x00010000,
  195. IgnoreInaccessibleMemory = 0x00020000,
  196. WithTokenInformation = 0x00040000,
  197. WithModuleHeaders = 0x00080000,
  198. FilterTriage = 0x00100000,
  199. WithAvxXStateContext = 0x00200000,
  200. WithIptTrace = 0x00400000,
  201. ScanInaccessiblePartialPages = 0x00800000,
  202. FilterWriteCombinedMemory = 0x01000000,
  203. ValidTypeFlags = 0x01ffffff,
  204. }
  205. SYMBOL_INFOW :: struct {
  206. SizeOfStruct: ULONG,
  207. TypeIndex: ULONG,
  208. Reserved: [2]ULONG64,
  209. Index: ULONG,
  210. Size: ULONG,
  211. ModBase: ULONG64,
  212. Flags: ULONG,
  213. Value: ULONG64,
  214. Address: ULONG64,
  215. Register: ULONG,
  216. Scope: ULONG,
  217. Tag: ULONG,
  218. NameLen: ULONG,
  219. MaxNameLen: ULONG,
  220. Name: [1]WCHAR,
  221. }
  222. IMAGEHLP_LINE64 :: struct {
  223. SizeOfStruct: DWORD,
  224. Key: PVOID,
  225. LineNumber: DWORD,
  226. FileName: PWSTR,
  227. Address: DWORD64,
  228. }
  229. PSYMBOL_INFOW :: ^SYMBOL_INFOW
  230. PIMAGEHLP_LINEW64 :: ^IMAGEHLP_LINE64
  231. SYMOPT_LOAD_LINES :: 0x00000010
  232. @(default_calling_convention = "system")
  233. foreign Dbghelp {
  234. MiniDumpWriteDump :: proc(
  235. hProcess: HANDLE,
  236. ProcessId: DWORD,
  237. hFile: HANDLE,
  238. DumpType: MINIDUMP_TYPE,
  239. ExceptionParam: ^MINIDUMP_EXCEPTION_INFORMATION,
  240. UserStreamParam: ^MINIDUMP_USER_STREAM_INFORMATION,
  241. CallbackPara: ^MINIDUMP_CALLBACK_INFORMATION,
  242. ) -> BOOL ---
  243. MiniDumpReadDumpStream :: proc(
  244. BaseOfDump: PVOID,
  245. StreamNumber: ULONG,
  246. Dir: ^^MINIDUMP_DIRECTORY,
  247. StreamPointer: ^PVOID,
  248. StreamSize: ^ULONG,
  249. ) -> BOOL ---
  250. SymInitialize :: proc(hProcess: HANDLE, UserSearchPath: PCSTR, fInvadeProcess: BOOL) -> BOOL ---
  251. SymCleanup :: proc(hProcess: HANDLE) -> BOOL ---
  252. SymSetOptions :: proc(SymOptions: DWORD) -> DWORD ---
  253. SymFromAddrW :: proc(hProcess: HANDLE, Address: DWORD64, Displacement: PDWORD64, Symbol: PSYMBOL_INFOW) -> BOOL ---
  254. SymGetLineFromAddrW64 :: proc(hProcess: HANDLE, dwAddr: DWORD64, pdwDisplacement: PDWORD, Line: PIMAGEHLP_LINEW64) -> BOOL ---
  255. }