aboutsummaryrefslogtreecommitdiff
path: root/core/sys/windows/kernel32.odin
diff options
context:
space:
mode:
authorjason <jkercher@rlcsystems.com>2024-06-19 12:33:13 -0400
committerjason <jkercher@rlcsystems.com>2024-06-19 12:33:13 -0400
commite6d84d18d30517ab6c7e8559c18b4271bbff9d61 (patch)
treeaad03230914fe6541ed6a939864856a16af8c268 /core/sys/windows/kernel32.odin
parenta9b6d282914e2a63292e59a4839995ccdc881f52 (diff)
parent2797dc6452bfd5c20d47271d52647ef40cce74fc (diff)
Merge remote-tracking branch 'origin/master' into more-windows-comm
Diffstat (limited to 'core/sys/windows/kernel32.odin')
-rwxr-xr-xcore/sys/windows/kernel32.odin168
1 files changed, 59 insertions, 109 deletions
diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin
index a0bea7867..85bed0675 100755
--- a/core/sys/windows/kernel32.odin
+++ b/core/sys/windows/kernel32.odin
@@ -78,6 +78,7 @@ foreign kernel32 {
RemoveVectoredContinueHandler :: proc(Handle: LPVOID) -> DWORD ---
RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
+ SetUnhandledExceptionFilter :: proc(lpTopLevelExceptionFilter: LPTOP_LEVEL_EXCEPTION_FILTER) -> LPTOP_LEVEL_EXCEPTION_FILTER ---
CreateHardLinkW :: proc(lpSymlinkFileName: LPCWSTR,
lpTargetFileName: LPCWSTR,
@@ -479,6 +480,8 @@ foreign kernel32 {
GetHandleInformation :: proc(hObject: HANDLE, lpdwFlags: ^DWORD) -> BOOL ---
RtlCaptureStackBackTrace :: proc(FramesToSkip: ULONG, FramesToCapture: ULONG, BackTrace: [^]PVOID, BackTraceHash: PULONG) -> USHORT ---
+
+ GetSystemPowerStatus :: proc(lpSystemPowerStatus: ^SYSTEM_POWER_STATUS) -> BOOL ---
}
DEBUG_PROCESS :: 0x00000001
@@ -1024,31 +1027,9 @@ foreign kernel32 {
HandlerRoutine :: proc "system" (dwCtrlType: DWORD) -> BOOL
PHANDLER_ROUTINE :: HandlerRoutine
+// NOTE(Jeroen, 2024-06-13): As Odin now supports bit_fields, we no longer need
+// a helper procedure. `init_dcb_with_config` and `get_dcb_config` have been removed.
-
-
-DCB_Config :: struct {
- fParity: bool,
- fOutxCtsFlow: bool,
- fOutxDsrFlow: bool,
- fDtrControl: DTR_Control,
- fDsrSensitivity: bool,
- fTXContinueOnXoff: bool,
- fOutX: bool,
- fInX: bool,
- fErrorChar: bool,
- fNull: bool,
- fRtsControl: RTS_Control,
- fAbortOnError: bool,
- BaudRate: DWORD,
- ByteSize: BYTE,
- Parity: Parity,
- StopBits: Stop_Bits,
- XonChar: byte,
- XoffChar: byte,
- ErrorChar: byte,
- EvtChar: byte,
-}
DTR_Control :: enum byte {
Disable = 0,
Enable = 1,
@@ -1073,92 +1054,35 @@ Stop_Bits :: enum byte {
Two = 2,
}
-// A helper procedure to set the values of a DCB structure.
-init_dcb_with_config :: proc "contextless" (dcb: ^DCB, config: DCB_Config) {
- out: u32
-
- // NOTE(tetra, 2022-09-21): On both Clang 14 on Windows, and MSVC, the bits in the bitfield
- // appear to be defined from LSB to MSB order.
- // i.e: `fBinary` (the first bitfield in the C source) is the LSB in the `settings` u32.
-
- out |= u32(1) << 0 // fBinary must always be true on Windows.
-
- out |= u32(config.fParity) << 1
- out |= u32(config.fOutxCtsFlow) << 2
- out |= u32(config.fOutxDsrFlow) << 3
-
- out |= u32(config.fDtrControl) << 4
-
- out |= u32(config.fDsrSensitivity) << 6
- out |= u32(config.fTXContinueOnXoff) << 7
- out |= u32(config.fOutX) << 8
- out |= u32(config.fInX) << 9
- out |= u32(config.fErrorChar) << 10
- out |= u32(config.fNull) << 11
-
- out |= u32(config.fRtsControl) << 12
-
- out |= u32(config.fAbortOnError) << 14
-
- dcb.settings = out
-
- dcb.BaudRate = config.BaudRate
- dcb.ByteSize = config.ByteSize
- dcb.Parity = config.Parity
- dcb.StopBits = config.StopBits
- dcb.XonChar = config.XonChar
- dcb.XoffChar = config.XoffChar
- dcb.ErrorChar = config.ErrorChar
- dcb.EvtChar = config.EvtChar
-
- dcb.DCBlength = size_of(DCB)
-}
-get_dcb_config :: proc "contextless" (dcb: DCB) -> (config: DCB_Config) {
- config.fParity = bool((dcb.settings >> 1) & 0x01)
- config.fOutxCtsFlow = bool((dcb.settings >> 2) & 0x01)
- config.fOutxDsrFlow = bool((dcb.settings >> 3) & 0x01)
-
- config.fDtrControl = DTR_Control((dcb.settings >> 4) & 0x02)
-
- config.fDsrSensitivity = bool((dcb.settings >> 6) & 0x01)
- config.fTXContinueOnXoff = bool((dcb.settings >> 7) & 0x01)
- config.fOutX = bool((dcb.settings >> 8) & 0x01)
- config.fInX = bool((dcb.settings >> 9) & 0x01)
- config.fErrorChar = bool((dcb.settings >> 10) & 0x01)
- config.fNull = bool((dcb.settings >> 11) & 0x01)
-
- config.fRtsControl = RTS_Control((dcb.settings >> 12) & 0x02)
-
- config.fAbortOnError = bool((dcb.settings >> 14) & 0x01)
-
- config.BaudRate = dcb.BaudRate
- config.ByteSize = dcb.ByteSize
- config.Parity = dcb.Parity
- config.StopBits = dcb.StopBits
- config.XonChar = dcb.XonChar
- config.XoffChar = dcb.XoffChar
- config.ErrorChar = dcb.ErrorChar
- config.EvtChar = dcb.EvtChar
-
- return
-}
-
-// NOTE(tetra): See get_dcb_config() and init_dcb_with_config() for help with initializing this.
DCB :: struct {
- DCBlength: DWORD, // NOTE(tetra): Must be set to size_of(DCB).
- BaudRate: DWORD,
- settings: u32, // NOTE(tetra): These are bitfields in the C struct.
- wReserved: WORD,
- XOnLim: WORD,
- XOffLim: WORD,
- ByteSize: BYTE,
- Parity: Parity,
- StopBits: Stop_Bits,
- XonChar: byte,
- XoffChar: byte,
- ErrorChar: byte,
- EofChar: byte,
- EvtChar: byte,
+ DCBlength: DWORD,
+ BaudRate: DWORD,
+ using _: bit_field DWORD {
+ fBinary: bool | 1,
+ fParity: bool | 1,
+ fOutxCtsFlow: bool | 1,
+ fOutxDsrFlow: bool | 1,
+ fDtrControl: DTR_Control | 2,
+ fDsrSensitivity: bool | 1,
+ fTXContinueOnXoff: bool | 1,
+ fOutX: bool | 1,
+ fInX: bool | 1,
+ fErrorChar: bool | 1,
+ fNull: bool | 1,
+ fRtsControl: RTS_Control | 2,
+ fAbortOnError: bool | 1,
+ },
+ wReserved: WORD,
+ XOnLim: WORD,
+ XOffLim: WORD,
+ ByteSize: BYTE,
+ Parity: Parity,
+ StopBits: Stop_Bits,
+ XonChar: byte,
+ XoffChar: byte,
+ ErrorChar: byte,
+ EofChar: byte,
+ EvtChar: byte,
wReserved1: WORD,
}
@@ -1238,6 +1162,30 @@ SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: struct {
DummyUnion: DUMMYUNIONNAME_u,
}
+SYSTEM_POWER_STATUS :: struct {
+ ACLineStatus: AC_Line_Status,
+ BatteryFlag: Battery_Flags,
+ BatteryLifePercent: BYTE,
+ SystemStatusFlag: BYTE,
+ BatteryLifeTime: DWORD,
+ BatteryFullLifeTime: DWORD,
+}
+
+AC_Line_Status :: enum BYTE {
+ Offline = 0,
+ Online = 1,
+ Unknown = 255,
+}
+
+Battery_Flag :: enum BYTE {
+ High = 0,
+ Low = 1,
+ Critical = 2,
+ Charging = 3,
+ No_Battery = 7,
+}
+Battery_Flags :: bit_set[Battery_Flag; BYTE]
+
/* Global Memory Flags */
GMEM_FIXED :: 0x0000
GMEM_MOVEABLE :: 0x0002
@@ -1256,3 +1204,5 @@ GMEM_INVALID_HANDLE :: 0x8000
GHND :: (GMEM_MOVEABLE | GMEM_ZEROINIT)
GPTR :: (GMEM_FIXED | GMEM_ZEROINIT)
+
+LPTOP_LEVEL_EXCEPTION_FILTER :: PVECTORED_EXCEPTION_HANDLER