diff --git a/core/os/os2/process.odin b/core/os/os2/process.odin index 1555d555b..897f7705f 100644 --- a/core/os/os2/process.odin +++ b/core/os/os2/process.odin @@ -111,12 +111,25 @@ process_list :: proc(allocator: runtime.Allocator) -> ([]int, Error) { return _process_list(allocator) } - +/* + Handle to a process. +*/ Process :: struct { - pid: int, - handle: uintptr, - is_done: b32, - signal_mutex: sync.RW_Mutex, + handle: _Process_Handle, +} + +/* + Obtain a process handle. +*/ +process_open :: proc(pid: int) -> (Process, Error) { + return _process_open(pid) +} + +/* + Close a process handle +*/ +process_close :: proc(process: Process) -> (Error) { + return _process_close(process) } diff --git a/core/os/os2/process_windows.odin b/core/os/os2/process_windows.odin index 6e4bd4cac..8de8c8347 100644 --- a/core/os/os2/process_windows.odin +++ b/core/os/os2/process_windows.odin @@ -4,6 +4,8 @@ package os2 import "core:sys/windows" import "base:runtime" +_Process_Handle :: windows.HANDLE + _exit :: proc "contextless" (code: int) -> ! { windows.ExitProcess(u32(code)) } @@ -60,3 +62,19 @@ _process_list :: proc(allocator: runtime.Allocator) -> ([]int, Error) { } return pid_list[:], nil } + +_process_open :: proc(pid: int) -> (Process, Error) { + handle := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, cast(u32) pid) + if handle == windows.INVALID_HANDLE_VALUE { + return {}, _get_platform_error() + } + return Process { + handle = handle, + }, nil +} + +_process_close :: proc(process: Process) -> (Error) { + if !windows.CloseHandle(process.handle) { + return _get_platform_error() + } +}