This commit is contained in:
snarmph 2026-02-26 13:54:59 +01:00
parent c7291ead23
commit ff748bd3ff
2 changed files with 386 additions and 68 deletions

View file

@ -15,6 +15,10 @@
#endif
#endif
#if COLLA_CMT_LIB
#pragma comment(lib, "Advapi32")
#endif
#ifndef PROCESSOR_ARCHITECTURE_ARM64
#define PROCESSOR_ARCHITECTURE_ARM64 12
#endif
@ -352,6 +356,80 @@ oshandle_t os_win_conin(void) {
return w32_data.hconin;
}
oshandle_t os_win_regopen(arena_t scratch, strview_t name) {
HKEY key = NULL;
str16_t key_name = strv_to_str16(&scratch, name);
LONG result = RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
key_name.buf,
0,
KEY_READ,
&key
);
if (result != ERROR_SUCCESS) {
err("failed to open registry key %v", name);
return os_handle_zero();
}
return (oshandle_t){ .data = (uptr)key };
}
void os_win_regclose(oshandle_t key) {
RegCloseKey((HKEY)key.data);
}
str_t os_win_regread_str(arena_t *arena, oshandle_t key, strview_t value) {
u8 buf[KB(5)] = {0};
DWORD bufsize = sizeof(buf);
arena_t scratch = *arena;
str16_t value_str = strv_to_str16(&scratch, value);
DWORD type = 0;
LONG result = RegQueryValueExW(
(HKEY)key.data,
value_str.buf,
NULL,
&type,
buf,
&bufsize
);
if (result != ERROR_SUCCESS) {
err("failed to read registry key %v", value);
return STR_EMPTY;
}
return str_from_str16(arena, str16_init((char16_t*)buf, 0));
}
i64 os_win_regread_int(arena_t scratch, oshandle_t key, strview_t value) {
DWORD regvalue = 0;
DWORD type = 0;
DWORD bufsize = sizeof(regvalue);
str16_t value_str = strv_to_str16(&scratch, value);
LONG result = RegQueryValueExW(
(HKEY)key.data,
value_str.buf,
NULL,
&type,
(u8*)&regvalue,
&bufsize
);
if (result != ERROR_SUCCESS) {
err("failed to read registry key %v", value);
return 0;
}
return (i64)regvalue;
}
str_t os_win_regkey_str(arena_t *arena, strview_t key, strview_t value) {
oshandle_t hkey = os_win_regopen(*arena, key);
str_t out = os_win_regread_str(arena, hkey, value);
os_win_regclose(hkey);
return out;
}
// == FILE ======================================
#define OS_SMALL_SCRATCH() \
@ -690,6 +768,7 @@ oshandle_t os_run_cmd_async(arena_t scratch, os_cmd_t *cmd, os_cmd_options_t *op
HANDLE hstdout_write = NULL;
HANDLE hstderr_write = NULL;
HANDLE hstdin_read = NULL;
bool quiet = options ? options->quiet : false;
SECURITY_ATTRIBUTES sa_attr = {
.nLength = sizeof(SECURITY_ATTRIBUTES),
@ -777,7 +856,7 @@ oshandle_t os_run_cmd_async(arena_t scratch, os_cmd_t *cmd, os_cmd_options_t *op
options->env->data = NULL;
}
if (!success) {
if (!success && !quiet) {
err("couldn't create process (%v): %v", cmd_str, os_get_error_string(os_get_last_error()));
return os_handle_zero();
}
@ -1357,3 +1436,4 @@ void sk_destroy_event(oshandle_t handle) {
}
#endif