about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-05-28 23:40:00 +0800
committerGitHub <noreply@github.com>2025-05-28 17:40:00 +0200
commitf1df65d88f05f9712229f6c9323ed20551171286 (patch)
tree584aaf2ff2cd9044f08e9d303acb2f5c507d6289
parent6697c7d2294d3a75ac930f713146327998ba7d32 (diff)
downloadbox64-f1df65d88f05f9712229f6c9323ed20551171286.tar.gz
box64-f1df65d88f05f9712229f6c9323ed20551171286.zip
[WOW64][ENV] Clean up a bit (#2681)
-rw-r--r--src/include/os.h2
-rw-r--r--src/os/os_linux.c6
-rw-r--r--src/os/os_wine.c7
-rw-r--r--src/tools/env.c71
-rw-r--r--wow64/crt.c27
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