Browse Source

Add stack frame procedures for `core:sys/windows`

gingerBill 1 year ago
parent
commit
00b1a41540
3 changed files with 44 additions and 0 deletions
  1. 38 0
      core/sys/windows/dbghelp.odin
  2. 2 0
      core/sys/windows/kernel32.odin
  3. 4 0
      core/sys/windows/types.odin

+ 38 - 0
core/sys/windows/dbghelp.odin

@@ -228,6 +228,38 @@ MINIDUMP_TYPE :: enum u32 {
 	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(
@@ -247,4 +279,10 @@ foreign Dbghelp {
 		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 ---
 }

+ 2 - 0
core/sys/windows/kernel32.odin

@@ -460,6 +460,8 @@ foreign kernel32 {
 	PostQueuedCompletionStatus :: proc(CompletionPort: HANDLE, dwNumberOfBytesTransferred: DWORD, dwCompletionKey: c_ulong, lpOverlapped: ^OVERLAPPED) -> BOOL ---
 	// [MS-Docs](https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation)
 	GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL ---
+
+	RtlCaptureStackBackTrace :: proc(FramesToSkip: ULONG, FramesToCapture: ULONG, BackTrace: [^]PVOID, BackTraceHash: PULONG) -> USHORT ---;
 }
 
 DEBUG_PROCESS                    :: 0x00000001

+ 4 - 0
core/sys/windows/types.odin

@@ -93,10 +93,14 @@ LONG32  :: i32
 ULONG64 :: u64
 LONG64  :: i64
 
+DWORD64 :: u64
+PDWORD64 :: ^DWORD64
+
 PDWORD_PTR :: ^DWORD_PTR
 ATOM :: distinct WORD
 
 wstring :: [^]WCHAR
+PWSTR   :: [^]WCHAR
 
 PBYTE :: ^BYTE
 LPBYTE :: ^BYTE