mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 06:38:47 +00:00
Merge remote-tracking branch 'upstream/master' into sys-windows-2
# Conflicts: # core/sys/windows/kernel32.odin # core/sys/windows/types.odin # core/sys/windows/user32.odin # core/sys/windows/winerror.odin
This commit is contained in:
+54
-158
@@ -38,20 +38,36 @@ foreign kernel32 {
|
||||
lpNumberOfCharsWritten: LPDWORD,
|
||||
lpReserved: LPVOID) -> BOOL ---
|
||||
|
||||
PeekConsoleInputW :: proc(hConsoleInput: HANDLE,
|
||||
lpBuffer: ^INPUT_RECORD,
|
||||
nLength: DWORD,
|
||||
lpNumberOfEventsRead: LPDWORD) -> BOOL ---
|
||||
|
||||
ReadConsoleInputW :: proc(hConsoleInput: HANDLE,
|
||||
lpBuffer: ^INPUT_RECORD,
|
||||
nLength: DWORD,
|
||||
lpNumberOfEventsRead: LPDWORD) -> BOOL ---
|
||||
|
||||
// https://learn.microsoft.com/en-us/windows/console/getnumberofconsoleinputevents
|
||||
GetNumberOfConsoleInputEvents :: proc(hConsoleInput: HANDLE, lpcNumberOfEvents: LPDWORD) -> BOOL ---
|
||||
|
||||
GetConsoleMode :: proc(hConsoleHandle: HANDLE,
|
||||
lpMode: LPDWORD) -> BOOL ---
|
||||
SetConsoleMode :: proc(hConsoleHandle: HANDLE,
|
||||
dwMode: DWORD) -> BOOL ---
|
||||
SetConsoleCursorPosition :: proc(hConsoleHandle: HANDLE,
|
||||
dwCursorPosition: COORD) -> BOOL ---
|
||||
dwCursorPosition: COORD) -> BOOL ---
|
||||
SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE,
|
||||
wAttributes: WORD) -> BOOL ---
|
||||
GetConsoleCP :: proc() -> CODEPAGE ---
|
||||
SetConsoleCP :: proc(wCodePageID: CODEPAGE) -> BOOL ---
|
||||
GetConsoleOutputCP :: proc() -> CODEPAGE ---
|
||||
SetConsoleOutputCP :: proc(wCodePageID: CODEPAGE) -> BOOL ---
|
||||
FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL ---
|
||||
|
||||
GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL ---
|
||||
|
||||
|
||||
SetHandleInformation :: proc(hObject: HANDLE,
|
||||
dwMask: DWORD,
|
||||
dwFlags: DWORD) -> BOOL ---
|
||||
@@ -67,6 +83,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,
|
||||
@@ -87,6 +104,12 @@ foreign kernel32 {
|
||||
RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
|
||||
SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL ---
|
||||
SetLastError :: proc(dwErrCode: DWORD) ---
|
||||
GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
||||
SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
||||
ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL ---
|
||||
GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
||||
SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
||||
GetCommPorts :: proc(lpPortNumbers: PULONG, uPortNumbersCount: ULONG, puPortNumbersFound: PULONG) -> ULONG ---
|
||||
GetCommandLineW :: proc() -> LPCWSTR ---
|
||||
GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD ---
|
||||
GetCurrentProcess :: proc() -> HANDLE ---
|
||||
@@ -491,6 +514,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
|
||||
@@ -1036,163 +1061,8 @@ foreign kernel32 {
|
||||
HandlerRoutine :: proc "system" (dwCtrlType: DWORD) -> BOOL
|
||||
PHANDLER_ROUTINE :: HandlerRoutine
|
||||
|
||||
|
||||
|
||||
|
||||
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,
|
||||
Handshake = 2,
|
||||
}
|
||||
RTS_Control :: enum byte {
|
||||
Disable = 0,
|
||||
Enable = 1,
|
||||
Handshake = 2,
|
||||
Toggle = 3,
|
||||
}
|
||||
Parity :: enum byte {
|
||||
None = 0,
|
||||
Odd = 1,
|
||||
Even = 2,
|
||||
Mark = 3,
|
||||
Space = 4,
|
||||
}
|
||||
Stop_Bits :: enum byte {
|
||||
One = 0,
|
||||
One_And_A_Half = 1,
|
||||
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,
|
||||
wReserved1: WORD,
|
||||
}
|
||||
|
||||
@(default_calling_convention="system")
|
||||
foreign kernel32 {
|
||||
GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
||||
SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
||||
}
|
||||
|
||||
COMMTIMEOUTS :: struct {
|
||||
ReadIntervalTimeout: DWORD,
|
||||
ReadTotalTimeoutMultiplier: DWORD,
|
||||
ReadTotalTimeoutConstant: DWORD,
|
||||
WriteTotalTimeoutMultiplier: DWORD,
|
||||
WriteTotalTimeoutConstant: DWORD,
|
||||
}
|
||||
|
||||
@(default_calling_convention="system")
|
||||
foreign kernel32 {
|
||||
GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
||||
SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
||||
}
|
||||
// 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.
|
||||
|
||||
LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID)
|
||||
|
||||
@@ -1250,6 +1120,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
|
||||
@@ -1284,3 +1178,5 @@ LOAD_LIBRARY_FLAGS :: enum DWORD {
|
||||
LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800,
|
||||
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000,
|
||||
}
|
||||
|
||||
LPTOP_LEVEL_EXCEPTION_FILTER :: PVECTORED_EXCEPTION_HANDLER
|
||||
|
||||
@@ -7,13 +7,13 @@ foreign import "system:Ole32.lib"
|
||||
/*
|
||||
typedef enum tagCOINIT
|
||||
{
|
||||
COINIT_APARTMENTTHREADED = 0x2, // Apartment model
|
||||
COINIT_APARTMENTTHREADED = 0x2, // Apartment model
|
||||
|
||||
#if (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM
|
||||
// These constants are only valid on Windows NT 4.0
|
||||
COINIT_MULTITHREADED = COINITBASE_MULTITHREADED,
|
||||
COINIT_DISABLE_OLE1DDE = 0x4, // Don't use DDE for Ole1 support.
|
||||
COINIT_SPEED_OVER_MEMORY = 0x8, // Trade memory for speed.
|
||||
// These constants are only valid on Windows NT 4.0
|
||||
COINIT_MULTITHREADED = COINITBASE_MULTITHREADED,
|
||||
COINIT_DISABLE_OLE1DDE = 0x4, // Don't use DDE for Ole1 support.
|
||||
COINIT_SPEED_OVER_MEMORY = 0x8, // Trade memory for speed.
|
||||
#endif // DCOM
|
||||
} COINIT;
|
||||
*/
|
||||
@@ -26,9 +26,11 @@ COINIT :: enum DWORD {
|
||||
}
|
||||
|
||||
IUnknown :: struct {
|
||||
using Vtbl: ^IUnknownVtbl,
|
||||
using _iunknown_vtable: ^IUnknown_VTable,
|
||||
}
|
||||
IUnknownVtbl :: struct {
|
||||
|
||||
IUnknownVtbl :: IUnknown_VTable
|
||||
IUnknown_VTable :: struct {
|
||||
QueryInterface: proc "system" (This: ^IUnknown, riid: REFIID, ppvObject: ^rawptr) -> HRESULT,
|
||||
AddRef: proc "system" (This: ^IUnknown) -> ULONG,
|
||||
Release: proc "system" (This: ^IUnknown) -> ULONG,
|
||||
|
||||
@@ -5,7 +5,7 @@ foreign import shell32 "system:Shell32.lib"
|
||||
|
||||
@(default_calling_convention="system")
|
||||
foreign shell32 {
|
||||
CommandLineToArgvW :: proc(cmd_list: wstring, num_args: ^c_int) -> ^wstring ---
|
||||
CommandLineToArgvW :: proc(cmd_list: wstring, num_args: ^c_int) -> [^]wstring ---
|
||||
ShellExecuteW :: proc(
|
||||
hwnd: HWND,
|
||||
lpOperation: LPCWSTR,
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
//+build windows
|
||||
package sys_windows
|
||||
|
||||
foreign import kernel32 "system:Kernel32.lib"
|
||||
|
||||
@(default_calling_convention="system")
|
||||
foreign kernel32 {
|
||||
CreateToolhelp32Snapshot :: proc (dwFlags: DWORD, th32ProcessID: DWORD) -> HANDLE ---
|
||||
Process32FirstW :: proc (hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL ---
|
||||
Process32NextW :: proc (hSnapshot: HANDLE, lppe: LPPROCESSENTRY32W) -> BOOL ---
|
||||
Thread32First :: proc (hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL ---
|
||||
Thread32Next :: proc (hSnapshot: HANDLE, lpte: LPTHREADENTRY32) -> BOOL ---
|
||||
Module32FirstW :: proc (hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL ---
|
||||
Module32NextW :: proc (hSnapshot: HANDLE, lpme: LPMODULEENTRY32W) -> BOOL ---
|
||||
Heap32ListFirst :: proc (hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL ---
|
||||
Heap32ListNext :: proc (hSnapshot: HANDLE, lphl: LPHEAPLIST32) -> BOOL ---
|
||||
Heap32First :: proc (lphe: LPHEAPENTRY32, th32ProcessID: DWORD, th32HeapID: ULONG_PTR) -> BOOL ---
|
||||
Heap32Next :: proc (lphe: LPHEAPENTRY32) -> BOOL ---
|
||||
Toolhelp32ReadProcessMemory :: proc (
|
||||
th32ProcessID: DWORD,
|
||||
lpBaseAddress: LPCVOID,
|
||||
lpBuffer: LPVOID,
|
||||
cbRead: SIZE_T,
|
||||
lpNumberOfBytesRead: ^SIZE_T,
|
||||
) -> BOOL ---
|
||||
}
|
||||
|
||||
MAX_MODULE_NAME32 :: 255
|
||||
|
||||
TH32CS_INHERIT :: 0x80000000
|
||||
TH32CS_SNAPHEAPLIST :: 0x00000001
|
||||
TH32CS_SNAPPROCESS :: 0x00000002
|
||||
TH32CS_SNAPTHREAD :: 0x00000004
|
||||
TH32CS_SNAPMODULE :: 0x00000008
|
||||
TH32CS_SNAPMODULE32 :: 0x00000010
|
||||
TH32CS_SNAPALL :: TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE
|
||||
|
||||
PROCESSENTRY32W :: struct {
|
||||
dwSize: DWORD,
|
||||
cntUsage: DWORD,
|
||||
th32ProcessID: DWORD,
|
||||
th32DefaultHeapID: ULONG_PTR,
|
||||
th32ModuleID: DWORD,
|
||||
cntThreads: DWORD,
|
||||
th32ParentProcessID: DWORD,
|
||||
pcPriClassBase: LONG,
|
||||
dwFlags: DWORD,
|
||||
szExeFile: [MAX_PATH]WCHAR,
|
||||
}
|
||||
|
||||
LPPROCESSENTRY32W :: ^PROCESSENTRY32W
|
||||
|
||||
THREADENTRY32 :: struct {
|
||||
dwSize: DWORD,
|
||||
cntUsage: DWORD,
|
||||
th32ThreadID: DWORD,
|
||||
th32OwnerProcessID: DWORD,
|
||||
tpBasePri: LONG,
|
||||
tpDeltaPri: LONG,
|
||||
dwFlags: DWORD,
|
||||
}
|
||||
|
||||
LPTHREADENTRY32 :: ^THREADENTRY32
|
||||
|
||||
MODULEENTRY32W :: struct {
|
||||
dwSize: DWORD,
|
||||
th32ModuleID: DWORD,
|
||||
th32ProcessID: DWORD,
|
||||
GlblcntUsage: DWORD,
|
||||
ProccntUsage: DWORD,
|
||||
modBaseAddr: ^BYTE,
|
||||
modBaseSize: DWORD,
|
||||
hModule: HMODULE,
|
||||
szModule: [MAX_MODULE_NAME32 + 1]WCHAR,
|
||||
szExePath: [MAX_PATH]WCHAR,
|
||||
}
|
||||
|
||||
LPMODULEENTRY32W :: ^MODULEENTRY32W
|
||||
|
||||
HEAPLIST32 :: struct {
|
||||
dwSize: SIZE_T,
|
||||
th32ProcessID: DWORD,
|
||||
th32HeapID: ULONG_PTR,
|
||||
dwFlags: DWORD,
|
||||
}
|
||||
|
||||
LPHEAPLIST32 :: ^HEAPLIST32
|
||||
|
||||
HEAPENTRY32 :: struct {
|
||||
dwSize: SIZE_T,
|
||||
hHandle: HANDLE,
|
||||
dwAddress: ULONG_PTR,
|
||||
dwBlockSize: SIZE_T,
|
||||
dwFlags: DWORD,
|
||||
dwLockCount: DWORD,
|
||||
dwResvd: DWORD,
|
||||
th32ProcessID: DWORD,
|
||||
th32HeapID: ULONG_PTR,
|
||||
}
|
||||
|
||||
LPHEAPENTRY32 :: ^HEAPENTRY32
|
||||
@@ -36,6 +36,7 @@ HBITMAP :: distinct HANDLE
|
||||
HPALETTE :: distinct HANDLE
|
||||
HGLOBAL :: distinct HANDLE
|
||||
HHOOK :: distinct HANDLE
|
||||
HWINEVENTHOOK :: distinct HANDLE
|
||||
HKEY :: distinct HANDLE
|
||||
HDESK :: distinct HANDLE
|
||||
HFONT :: distinct HANDLE
|
||||
@@ -797,6 +798,14 @@ WNDPROC :: #type proc "system" (HWND, UINT, WPARAM, LPARAM) -> LRESULT
|
||||
|
||||
HOOKPROC :: #type proc "system" (code: c_int, wParam: WPARAM, lParam: LPARAM) -> LRESULT
|
||||
|
||||
WINEVENTPROC :: #type proc "system" (
|
||||
hWinEventHook: HWINEVENTHOOK,
|
||||
event: DWORD,
|
||||
hwnd: HWND,
|
||||
idObject, idChild: LONG,
|
||||
idEventThread, dwmsEventTime: DWORD,
|
||||
)
|
||||
|
||||
CWPRETSTRUCT :: struct {
|
||||
lResult: LRESULT,
|
||||
lParam: LPARAM,
|
||||
@@ -2779,6 +2788,22 @@ OSVERSIONINFOEXW :: struct {
|
||||
wReserved: UCHAR,
|
||||
}
|
||||
|
||||
LoadLibraryEx_Flag :: enum DWORD {
|
||||
LOAD_LIBRARY_AS_DATAFILE = 1, // 1 << 1: 0x0002,
|
||||
LOAD_WITH_ALTERED_SEARCH_PATH = 3, // 1 << 3: 0x0008,
|
||||
LOAD_IGNORE_CODE_AUTHZ_LEVEL = 4, // 1 << 4: 0x0010,
|
||||
LOAD_LIBRARY_AS_IMAGE_RESOURCE = 5, // 1 << 5: 0x0020,
|
||||
LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 6, // 1 << 6: 0x0040,
|
||||
LOAD_LIBRARY_REQUIRE_SIGNED_TARGET = 7, // 1 << 7: 0x0080,
|
||||
LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 8, // 1 << 8: 0x0100,
|
||||
LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 9, // 1 << 9: 0x0200,
|
||||
LOAD_LIBRARY_SEARCH_USER_DIRS = 10, // 1 << 10: 0x0400,
|
||||
LOAD_LIBRARY_SEARCH_SYSTEM32 = 11, // 1 << 11: 0x0800,
|
||||
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 12, // 1 << 12: 0x1000,
|
||||
LOAD_LIBRARY_SAFE_CURRENT_DIRS = 13, // 1 << 13: 0x2000,
|
||||
}
|
||||
LoadLibraryEx_Flags :: distinct bit_set[LoadLibraryEx_Flag]
|
||||
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-quota_limits
|
||||
// Used in LogonUserExW
|
||||
PQUOTA_LIMITS :: struct {
|
||||
@@ -4088,6 +4113,70 @@ CONSOLE_CURSOR_INFO :: struct {
|
||||
PCONSOLE_SCREEN_BUFFER_INFO :: ^CONSOLE_SCREEN_BUFFER_INFO
|
||||
PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO
|
||||
|
||||
Event_Type :: enum WORD {
|
||||
KEY_EVENT = 0x0001,
|
||||
MOUSE_EVENT = 0x0002,
|
||||
WINDOW_BUFFER_SIZE_EVENT = 0x0004,
|
||||
MENU_EVENT = 0x0008,
|
||||
FOCUS_EVENT = 0x0010,
|
||||
}
|
||||
|
||||
INPUT_RECORD :: struct {
|
||||
EventType: Event_Type,
|
||||
Event: struct #raw_union {
|
||||
KeyEvent: KEY_EVENT_RECORD,
|
||||
MouseEvent: MOUSE_EVENT_RECORD,
|
||||
WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD,
|
||||
MenuEvent: MENU_EVENT_RECORD,
|
||||
FocusEvent: FOCUS_EVENT_RECORD,
|
||||
},
|
||||
}
|
||||
|
||||
Control_Key_State_Bits :: enum {
|
||||
RIGHT_ALT_PRESSED,
|
||||
LEFT_ALT_PRESSED,
|
||||
RIGHT_CTRL_PRESSED,
|
||||
LEFT_CTRL_PRESSED,
|
||||
SHIFT_PRESSED,
|
||||
NUMLOCK_ON,
|
||||
SCROLLLOCK_ON,
|
||||
CAPSLOCK_ON,
|
||||
ENHANCED_KEY,
|
||||
}
|
||||
Control_Key_State :: bit_set[Control_Key_State_Bits; DWORD]
|
||||
|
||||
KEY_EVENT_RECORD :: struct {
|
||||
bKeyDown: BOOL,
|
||||
wRepeatCount: WORD,
|
||||
wVirtualKeyCode: WORD,
|
||||
wVirtualScanCode: WORD,
|
||||
uChar: struct #raw_union {
|
||||
UnicodeChar: WCHAR,
|
||||
AsciiChar: CHAR,
|
||||
},
|
||||
dwControlKeyState: Control_Key_State,
|
||||
}
|
||||
|
||||
MOUSE_EVENT_RECORD :: struct {
|
||||
dwMousePosition: COORD,
|
||||
dwButtonState: DWORD,
|
||||
dwControlKeyState: DWORD,
|
||||
dwEventFlags: DWORD,
|
||||
}
|
||||
|
||||
WINDOW_BUFFER_SIZE_RECORD :: struct {
|
||||
dwSize: COORD,
|
||||
}
|
||||
|
||||
MENU_EVENT_RECORD :: struct {
|
||||
dwCommandId: UINT,
|
||||
}
|
||||
|
||||
FOCUS_EVENT_RECORD :: struct {
|
||||
bSetFocus: BOOL,
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Networking
|
||||
//
|
||||
@@ -4326,3 +4415,92 @@ SOCKADDR :: struct {
|
||||
ENUMRESNAMEPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lpName: LPWSTR, lParam: LONG_PTR)-> BOOL
|
||||
ENUMRESTYPEPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lParam: LONG_PTR)-> BOOL
|
||||
ENUMRESLANGPROCW :: #type proc (hModule: HMODULE, lpType: LPCWSTR, lpName: LPWSTR, wIDLanguage: LANGID, lParam: LONG_PTR)-> BOOL
|
||||
|
||||
DTR_Control :: enum byte {
|
||||
Disable = 0,
|
||||
Enable = 1,
|
||||
Handshake = 2,
|
||||
}
|
||||
RTS_Control :: enum byte {
|
||||
Disable = 0,
|
||||
Enable = 1,
|
||||
Handshake = 2,
|
||||
Toggle = 3,
|
||||
}
|
||||
Parity :: enum byte {
|
||||
None = 0,
|
||||
Odd = 1,
|
||||
Even = 2,
|
||||
Mark = 3,
|
||||
Space = 4,
|
||||
}
|
||||
Stop_Bits :: enum byte {
|
||||
One = 0,
|
||||
One_And_A_Half = 1,
|
||||
Two = 2,
|
||||
}
|
||||
|
||||
DCB :: struct {
|
||||
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,
|
||||
}
|
||||
|
||||
COMMTIMEOUTS :: struct {
|
||||
ReadIntervalTimeout: DWORD,
|
||||
ReadTotalTimeoutMultiplier: DWORD,
|
||||
ReadTotalTimeoutConstant: DWORD,
|
||||
WriteTotalTimeoutMultiplier: DWORD,
|
||||
WriteTotalTimeoutConstant: DWORD,
|
||||
}
|
||||
|
||||
Com_Stat_Bits :: enum {
|
||||
fCtsHold,
|
||||
fDsrHold,
|
||||
fRlsdHold,
|
||||
fXoffHold,
|
||||
fXoffSent,
|
||||
fEof,
|
||||
fTxim,
|
||||
}
|
||||
COMSTAT :: struct {
|
||||
bits: bit_set[Com_Stat_Bits; DWORD],
|
||||
cbInQue: DWORD,
|
||||
cbOutQue: DWORD,
|
||||
}
|
||||
|
||||
Com_Error_Bits :: enum {
|
||||
RXOVER,
|
||||
OVERRUN,
|
||||
RXPARITY,
|
||||
FRAME,
|
||||
BREAK,
|
||||
}
|
||||
Com_Error :: bit_set[Com_Error_Bits; DWORD]
|
||||
|
||||
|
||||
@@ -17,6 +17,17 @@ foreign user32 {
|
||||
|
||||
GetClassNameW :: proc(hWnd: HWND, lpClassName: LPWSTR, nMaxCount: INT) -> INT ---
|
||||
|
||||
GetParent :: proc(hWnd: HWND) -> HWND ---
|
||||
SetWinEventHook :: proc(
|
||||
eventMin, eventMax: DWORD,
|
||||
hmodWinEventProc: HMODULE,
|
||||
pfnWinEvenProc: WINEVENTPROC,
|
||||
idProcess, idThread: DWORD,
|
||||
dwFlags: WinEventFlags,
|
||||
) -> HWINEVENTHOOK ---
|
||||
|
||||
IsChild :: proc(hWndParent, hWnd: HWND) -> BOOL ---
|
||||
|
||||
RegisterClassW :: proc(lpWndClass: ^WNDCLASSW) -> ATOM ---
|
||||
RegisterClassExW :: proc(^WNDCLASSEXW) -> ATOM ---
|
||||
UnregisterClassW :: proc(lpClassName: LPCWSTR, hInstance: HINSTANCE) -> BOOL ---
|
||||
@@ -703,3 +714,12 @@ DISPLAY_DEVICEW :: struct {
|
||||
DeviceKey: [128]WCHAR,
|
||||
}
|
||||
PDISPLAY_DEVICEW :: ^DISPLAY_DEVICEW
|
||||
|
||||
// OUTOFCONTEXT is the zero value, use {}
|
||||
WinEventFlags :: bit_set[WinEventFlag; DWORD]
|
||||
|
||||
WinEventFlag :: enum DWORD {
|
||||
SKIPOWNTHREAD = 0,
|
||||
SKIPOWNPROCESS = 1,
|
||||
INCONTEXT = 2,
|
||||
}
|
||||
|
||||
@@ -110,8 +110,8 @@ utf8_to_utf16 :: proc(s: string, allocator := context.temp_allocator) -> []u16 {
|
||||
return text[:n]
|
||||
}
|
||||
utf8_to_wstring :: proc(s: string, allocator := context.temp_allocator) -> wstring {
|
||||
if res := utf8_to_utf16(s, allocator); res != nil {
|
||||
return &res[0]
|
||||
if res := utf8_to_utf16(s, allocator); len(res) > 0 {
|
||||
return raw_data(res)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@ SEVERITY :: enum DWORD {
|
||||
}
|
||||
|
||||
// Generic test for success on any status value (non-negative numbers indicate success).
|
||||
SUCCEEDED :: #force_inline proc(#any_int result: int) -> bool { return result >= S_OK }
|
||||
SUCCEEDED :: #force_inline proc "contextless" (#any_int result: int) -> bool { return result >= S_OK }
|
||||
// and the inverse
|
||||
FAILED :: #force_inline proc(#any_int result: int) -> bool { return result < S_OK }
|
||||
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
//+build windows
|
||||
package sys_windows
|
||||
|
||||
foreign import kernel32 "system:Kernel32.lib"
|
||||
|
||||
@(default_calling_convention="system")
|
||||
foreign kernel32 {
|
||||
GetSystemWow64Directory2W :: proc (lpBuffer: LPWSTR, uSize: UINT, ImageFileMachineTyp: WORD) -> UINT ---
|
||||
GetSystemWow64DirectoryW :: proc (lpBuffer: LPWSTR, uSize: UINT) -> UINT ---
|
||||
IsWow64GuestMachineSupported :: proc (WowGuestMachine: USHORT, MachineIsSupported: ^BOOL) -> HRESULT ---
|
||||
IsWow64Process :: proc (hProcess: HANDLE, Wow64Process: PBOOL) -> BOOL ---
|
||||
IsWow64Process2 :: proc (hProcess: HANDLE, pProcessMachine: ^USHORT, pNativeMachine: ^USHORT) -> BOOL ---
|
||||
Wow64EnableWow64FsRedirection :: proc (Wow64FsEnableRedirection: BOOLEAN) -> BOOLEAN ---
|
||||
Wow64DisableWow64FsRedirection :: proc (OldValue: ^PVOID) -> BOOL ---
|
||||
Wow64RevertWow64FsRedirection :: proc (OlValue: PVOID) -> BOOL ---
|
||||
Wow64GetThreadContext :: proc (hThread: HANDLE, lpContext: PWOW64_CONTEXT) -> BOOL ---
|
||||
Wow64SetThreadContext :: proc(hThread: HANDLE, lpContext: ^WOW64_CONTEXT) -> BOOL ---
|
||||
Wow64SetThreadDefaultGuestMachine :: proc(Machine: USHORT) -> USHORT ---
|
||||
Wow64SuspendThread :: proc (hThread: HANDLE) -> DWORD ---
|
||||
}
|
||||
|
||||
WOW64_CONTEXT_i386 :: 0x00010000
|
||||
|
||||
WOW64_CONTEXT_CONTROL :: (WOW64_CONTEXT_i386 | 0x00000001)
|
||||
WOW64_CONTEXT_INTEGER :: (WOW64_CONTEXT_i386 | 0x00000002)
|
||||
WOW64_CONTEXT_SEGMENTS :: (WOW64_CONTEXT_i386 | 0x00000004)
|
||||
|
||||
WOW64_CONTEXT_FLOATING_POINT :: (WOW64_CONTEXT_i386 | 0x00000008)
|
||||
WOW64_CONTEXT_DEBUG_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000010)
|
||||
WOW64_CONTEXT_EXTENDED_REGISTERS :: (WOW64_CONTEXT_i386 | 0x00000020)
|
||||
WOW64_CONTEXT_FULL :: (WOW64_CONTEXT_CONTROL | WOW64_CONTEXT_INTEGER | WOW64_CONTEXT_SEGMENTS)
|
||||
WOW64_CONTEXT_ALL :: (
|
||||
WOW64_CONTEXT_CONTROL |
|
||||
WOW64_CONTEXT_INTEGER |
|
||||
WOW64_CONTEXT_SEGMENTS |
|
||||
WOW64_CONTEXT_FLOATING_POINT |
|
||||
WOW64_CONTEXT_DEBUG_REGISTERS |
|
||||
WOW64_CONTEXT_EXTENDED_REGISTERS)
|
||||
|
||||
WOW64_SIZE_OF_80387_REGISTERS :: 80
|
||||
WOW64_MAXIMUM_SUPPORTED_EXTENSION :: 512
|
||||
|
||||
WOW64_CONTEXT :: struct {
|
||||
ContextFlags: DWORD,
|
||||
Dr0: DWORD,
|
||||
Dr1: DWORD,
|
||||
Dr2: DWORD,
|
||||
Dr3: DWORD,
|
||||
Dr6: DWORD,
|
||||
Dr7: DWORD,
|
||||
FloatSave: WOW64_FLOATING_SAVE_AREA,
|
||||
SegGs: DWORD,
|
||||
SegFs: DWORD,
|
||||
SegEs: DWORD,
|
||||
SegDs: DWORD,
|
||||
Edi: DWORD,
|
||||
Esi: DWORD,
|
||||
Ebx: DWORD,
|
||||
Edx: DWORD,
|
||||
Ecx: DWORD,
|
||||
Eax: DWORD,
|
||||
Ebp: DWORD,
|
||||
Eip: DWORD,
|
||||
SegCs: DWORD,
|
||||
EFlags: DWORD,
|
||||
Esp: DWORD,
|
||||
SegSs: DWORD,
|
||||
ExtendedRegisters: [WOW64_MAXIMUM_SUPPORTED_EXTENSION]BYTE,
|
||||
}
|
||||
|
||||
PWOW64_CONTEXT :: ^WOW64_CONTEXT
|
||||
|
||||
WOW64_FLOATING_SAVE_AREA :: struct {
|
||||
ControlWord: DWORD,
|
||||
StatusWord: DWORD,
|
||||
TagWord: DWORD,
|
||||
ErrorOffset: DWORD,
|
||||
ErrorSelector: DWORD,
|
||||
DataOffset: DWORD,
|
||||
DataSelector: DWORD,
|
||||
RegisterArea: [WOW64_SIZE_OF_80387_REGISTERS]BYTE,
|
||||
Cr0NpxState: DWORD,
|
||||
}
|
||||
|
||||
PWOW64_FLOATING_SAVE_AREA :: ^WOW64_FLOATING_SAVE_AREA
|
||||
Reference in New Issue
Block a user