diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-05-28 23:40:00 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-28 17:40:00 +0200 |
| commit | f1df65d88f05f9712229f6c9323ed20551171286 (patch) | |
| tree | 584aaf2ff2cd9044f08e9d303acb2f5c507d6289 | |
| parent | 6697c7d2294d3a75ac930f713146327998ba7d32 (diff) | |
| download | box64-f1df65d88f05f9712229f6c9323ed20551171286.tar.gz box64-f1df65d88f05f9712229f6c9323ed20551171286.zip | |
[WOW64][ENV] Clean up a bit (#2681)
| -rw-r--r-- | src/include/os.h | 2 | ||||
| -rw-r--r-- | src/os/os_linux.c | 6 | ||||
| -rw-r--r-- | src/os/os_wine.c | 7 | ||||
| -rw-r--r-- | src/tools/env.c | 71 | ||||
| -rw-r--r-- | wow64/crt.c | 27 |
5 files changed, 49 insertions, 64 deletions
diff --git a/src/include/os.h b/src/include/os.h index 03c075e7..f17a9a37 100644 --- a/src/include/os.h +++ b/src/include/os.h @@ -99,4 +99,6 @@ extern int isnanf(float); void PrintfFtrace(int prefix, const char* fmt, ...); +void* GetEnv(const char* name); + #endif //__OS_H_ diff --git a/src/os/os_linux.c b/src/os/os_linux.c index a8258db6..570ce2ad 100644 --- a/src/os/os_linux.c +++ b/src/os/os_linux.c @@ -7,6 +7,7 @@ #include <dlfcn.h> #include <string.h> #include <stdarg.h> +#include <stdlib.h> #include "os.h" #include "signals.h" @@ -202,3 +203,8 @@ void PrintfFtrace(int prefix, const char* fmt, ...) fflush(ftrace); va_end(args); } + +void* GetEnv(const char* name) +{ + return getenv(name); +} \ No newline at end of file diff --git a/src/os/os_wine.c b/src/os/os_wine.c index 1e61772a..937371c7 100644 --- a/src/os/os_wine.c +++ b/src/os/os_wine.c @@ -218,3 +218,10 @@ void PrintfFtrace(int prefix, const char* fmt, ...) va_end(args); __wine_dbg_output(p); } + +void* GetEnv(const char* name) +{ + static char buf[1024] = { 0 }; + int len = GetEnvironmentVariableA(name, buf, sizeof(buf)); + return len ? buf : NULL; +} \ No newline at end of file diff --git a/src/tools/env.c b/src/tools/env.c index 3d79fda0..7db6f015 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -5,12 +5,11 @@ #ifndef _WIN32 #include <sys/mman.h> #include <sys/stat.h> -#else -#include <winternl.h> #endif #include <fcntl.h> #include <string.h> +#include "os.h" #include "env.h" #include "khash.h" #include "debug.h" @@ -517,11 +516,10 @@ void LoadEnvVariables() #undef ADDRESS #undef STRING -#ifndef _WIN32 char* p; - // load env vars from getenv() + // load env vars from GetEnv() #define INTEGER(NAME, name, default, min, max) \ - p = getenv(#NAME); \ + p = GetEnv(#NAME); \ if (p) { \ box64env.name = atoi(p); \ if (box64env.name < min || box64env.name > max) { \ @@ -532,21 +530,21 @@ void LoadEnvVariables() } \ } #define INTEGER64(NAME, name, default) \ - p = getenv(#NAME); \ + p = GetEnv(#NAME); \ if (p) { \ box64env.name = atoll(p); \ box64env.is_##name##_overridden = 1; \ box64env.is_any_overridden = 1; \ } #define BOOLEAN(NAME, name, default) \ - p = getenv(#NAME); \ + p = GetEnv(#NAME); \ if (p) { \ box64env.name = p[0] != '0'; \ box64env.is_##name##_overridden = 1; \ box64env.is_any_overridden = 1; \ } #define ADDRESS(NAME, name) \ - p = getenv(#NAME); \ + p = GetEnv(#NAME); \ if (p) { \ char* endptr; \ box64env.name = (uintptr_t)strtoll(p, &endptr, 0); \ @@ -554,7 +552,7 @@ void LoadEnvVariables() box64env.is_any_overridden = 1; \ } #define STRING(NAME, name) \ - p = getenv(#NAME); \ + p = GetEnv(#NAME); \ if (p) { \ box64env.name = strdup(p); \ box64env.is_##name##_overridden = 1; \ @@ -566,61 +564,6 @@ void LoadEnvVariables() #undef BOOLEAN #undef ADDRESS #undef STRING -#else /* _WIN32 */ - char buffer[1024]; - DWORD len; - // load env vars from getenv() -#define INTEGER(NAME, name, default, min, max) \ - len = GetEnvironmentVariableA(#NAME, buffer, sizeof(buffer)); \ - if (len) { \ - box64env.name = atoi(buffer); \ - if (box64env.name < min || box64env.name > max) { \ - box64env.name = default; \ - } else { \ - box64env.is_##name##_overridden = 1; \ - box64env.is_any_overridden = 1; \ - } \ - } -#define INTEGER64(NAME, name, default) \ - len = GetEnvironmentVariableA(#NAME, buffer, sizeof(buffer)); \ - if (len) { \ - ULONG tmp; /* FIXME: only positive 32-bit */ \ - RtlCharToInteger(buffer, 10, &tmp); \ - box64env.name = tmp; \ - box64env.is_##name##_overridden = 1; \ - box64env.is_any_overridden = 1; \ - } -#define BOOLEAN(NAME, name, default) \ - len = GetEnvironmentVariableA(#NAME, buffer, sizeof(buffer)); \ - if (len) { \ - box64env.name = buffer[0] != '0'; \ - box64env.is_##name##_overridden = 1; \ - box64env.is_any_overridden = 1; \ - } -#define ADDRESS(NAME, name) \ - len = GetEnvironmentVariableA(#NAME, buffer, sizeof(buffer)); \ - if (len) { \ - ULONG tmp; /* FIXME: only positive 32-bit */ \ - RtlCharToInteger(buffer, 10, &tmp); \ - box64env.name = (uintptr_t)tmp; \ - box64env.is_##name##_overridden = 1; \ - box64env.is_any_overridden = 1; \ - } -#define STRING(NAME, name) \ - len = GetEnvironmentVariableA(#NAME, buffer, sizeof(buffer)); \ - if (len) { \ - box64env.name = (char*)RtlAllocateHeap(GetProcessHeap(), 0, len + 1); \ - if (box64env.name) strcpy(box64env.name, buffer); \ - box64env.is_##name##_overridden = 1; \ - box64env.is_any_overridden = 1; \ - } - ENVSUPER() -#undef INTEGER -#undef INTEGER64 -#undef BOOLEAN -#undef ADDRESS -#undef STRING -#endif /* _WIN32 */ applyCustomRules(); } diff --git a/wow64/crt.c b/wow64/crt.c index 4e15239d..e7ee9b42 100644 --- a/wow64/crt.c +++ b/wow64/crt.c @@ -98,4 +98,31 @@ int snprintf(char* restrict s, size_t n, const char* restrict fmt, ...) int result = _vsnprintf(s, n, fmt, args); va_end(args); return result; +} + +char* strdup(const char* s) +{ + char* buf = (char*)RtlAllocateHeap(GetProcessHeap(), 0, strlen(s) + 1); + if (buf) strcpy(buf, s); + return buf; +} + +long long atoll(const char* str) +{ + ULONG tmp; + RtlCharToInteger(str, 10, &tmp); + return (LONGLONG)tmp; +} + +long long strtoll(const char* restrict str, char** restrict str_end, int base) +{ + // FIXME: it kinda work, but not identical to the C version. + ULONG tmp; + if (base == 0) { + NTSTATUS status = RtlCharToInteger(str, 10, &tmp); + if (status != STATUS_SUCCESS) RtlCharToInteger(str, 16, &tmp); + } else { + RtlCharToInteger(str, base, &tmp); + } + return (LONGLONG)tmp; } \ No newline at end of file |