mirror of
https://github.com/decompals/wibo.git
synced 2025-08-20 10:51:32 +00:00
`TlsGetValue` disambiguates 0 and an error by relying on `GetLastError`. Depending on the program state, `GetLastError` could be non-0, even though `TlsGetValue` succeeded. Resolve this by always setting `wibo::lastError`. This matches the behavior described by the documentation. Additionally, when reading resources, later versions of mwcc and mwld call `GetModuleHandleA` with the program path, and then call `LoadStringA` on that handle. Support this behavior by _actually_ loading the PE at the path passed in to `GetModuleHandleA`, instead of assuming it's the current program. (This is especially useful because sjiswrap relies on overriding `GetModuleFileNameA`, so the wrapped program reads its own resources, rather than sjiswrap's.) Other small changes: - Add ms-win-crt `exit` & run atexit funcs - Implements vcruntime `memmove` - Implements kernel32 `GetModuleFileNameA`
36 lines
975 B
C++
36 lines
975 B
C++
#include "common.h"
|
|
|
|
namespace vcruntime {
|
|
|
|
void *WIN_ENTRY memcpy(void *dest, const void *src, size_t count) { return ::memcpy(dest, src, count); }
|
|
|
|
void *WIN_ENTRY memset(void *dest, int ch, size_t count) { return ::memset(dest, ch, count); }
|
|
|
|
int WIN_ENTRY memcmp(const void *buf1, const void *buf2, size_t count) { return ::memcmp(buf1, buf2, count); }
|
|
|
|
void *WIN_ENTRY memmove(void *dest, const void *src, size_t count) { return ::memmove(dest, src, count); }
|
|
|
|
} // namespace vcruntime
|
|
|
|
static void *resolveByName(const char *name) {
|
|
if (strcmp(name, "memcpy") == 0)
|
|
return (void *)vcruntime::memcpy;
|
|
if (strcmp(name, "memset") == 0)
|
|
return (void *)vcruntime::memset;
|
|
if (strcmp(name, "memcmp") == 0)
|
|
return (void *)vcruntime::memcmp;
|
|
if (strcmp(name, "memmove") == 0)
|
|
return (void *)vcruntime::memmove;
|
|
return nullptr;
|
|
}
|
|
|
|
wibo::Module lib_vcruntime = {
|
|
(const char *[]){
|
|
"vcruntime140",
|
|
"vcruntime140.dll",
|
|
nullptr,
|
|
},
|
|
resolveByName,
|
|
nullptr,
|
|
};
|