From dc2ad0d678c6477746f60d6b128a6e036c46b1f6 Mon Sep 17 00:00:00 2001 From: rjkiv <76180273+rjkiv@users.noreply.github.com> Date: Mon, 4 Aug 2025 10:53:35 -0700 Subject: [PATCH] more cl funcs --- dll/kernel32.cpp | 6 ++++++ dll/msvcrt.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index e030bdd..ec66a7f 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -2174,6 +2174,11 @@ namespace kernel32 { return 1; // EXCEPTION_EXECUTE_HANDLER } + unsigned int WIN_FUNC SetErrorMode(unsigned int mode){ + DEBUG_LOG("SetErrorMode: %d\n", mode); + return 0; + } + struct SINGLE_LIST_ENTRY { SINGLE_LIST_ENTRY *Next; @@ -2481,6 +2486,7 @@ static void *resolveByName(const char *name) { // errhandlingapi.h if (strcmp(name, "SetUnhandledExceptionFilter") == 0) return (void *) kernel32::SetUnhandledExceptionFilter; if (strcmp(name, "UnhandledExceptionFilter") == 0) return (void *) kernel32::UnhandledExceptionFilter; + if (strcmp(name, "SetErrorMode") == 0) return (void*)kernel32::SetErrorMode; // interlockedapi.h if (strcmp(name, "InitializeSListHead") == 0) return (void *) kernel32::InitializeSListHead; diff --git a/dll/msvcrt.cpp b/dll/msvcrt.cpp index fcff1a8..e5edd01 100644 --- a/dll/msvcrt.cpp +++ b/dll/msvcrt.cpp @@ -154,10 +154,48 @@ namespace msvcrt { DEBUG_LOG("Bad wide arg conversion for %d!\n", i); } } + + __winitenv = *wenv; } return 0; } + char WIN_ENTRY *setlocale(int category, const char *locale){ + DEBUG_LOG("STUB: setlocale(%d, %s)\n", category, locale); + return (char*)"C"; + } + + int WIN_ENTRY _wdupenv_s(wchar_t **buffer, size_t *numberOfElements, const wchar_t *varname){ + // just gonna stub all this out for now + // if it turns out we need this, troubleshoot wscspy + + // if(!buffer || !varname) return -1; + // if(numberOfElements) *numberOfElements = 0; + + // size_t varnamelen = wcslen(varname); + + // for(wchar_t** env = __winitenv; env && *env; ++env){ + // wchar_t* cur = *env; + // if(wcsncmp(cur, varname, varnamelen) == 0 && cur[varnamelen] == L'='){ + // wchar_t* value = cur + varnamelen + 1; + // size_t value_len = wcslen(value); + + // *buffer = (wchar_t*)malloc((value_len + 1) * sizeof(wchar_t)); + // if(!*buffer) return -1; + + // wscspy(*buffer, value); // y u no work + // if(numberOfElements) *numberOfElements = value_len + 1; + // return 0; + // } + // } + + return 0; + } + + void WIN_ENTRY free(void* ptr){ + std::free(ptr); + } + } @@ -173,6 +211,9 @@ static void *resolveByName(const char *name) { if (strcmp(name, "_controlfp_s") == 0) return (void *)msvcrt::_controlfp_s; if (strcmp(name, "_onexit") == 0) return (void*)msvcrt::_onexit; if (strcmp(name, "__wgetmainargs") == 0) return (void*)msvcrt::__wgetmainargs; + if (strcmp(name, "setlocale") == 0) return (void*)msvcrt::setlocale; + if (strcmp(name, "_wdupenv_s") == 0) return (void*)msvcrt::_wdupenv_s; + if (strcmp(name, "free") == 0) return (void*)msvcrt::free; return nullptr; }