mirror of
https://github.com/decompals/wibo.git
synced 2025-10-16 15:15:10 +00:00
More logging & some hacks
This commit is contained in:
parent
cf7ea70fac
commit
04516b246c
@ -144,11 +144,16 @@ void *threadTrampoline(void *param) {
|
|||||||
{
|
{
|
||||||
std::unique_lock lk(data.obj->m);
|
std::unique_lock lk(data.obj->m);
|
||||||
data.obj->tib = threadTib;
|
data.obj->tib = threadTib;
|
||||||
data.obj->cv.wait(lk, [&] { return data.obj->suspendCount == 0; });
|
if (data.obj->suspendCount) {
|
||||||
|
DEBUG_LOG("Thread is suspended at start; waiting...\n");
|
||||||
|
data.obj->cv.wait(lk, [&] { return data.obj->suspendCount == 0; });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wibo::notifyDllThreadAttach();
|
wibo::notifyDllThreadAttach();
|
||||||
|
DEBUG_LOG("Calling thread entry %p with userData %p\n", data.entry, data.userData);
|
||||||
DWORD result = data.entry ? data.entry(data.userData) : 0;
|
DWORD result = data.entry ? data.entry(data.userData) : 0;
|
||||||
|
DEBUG_LOG("Thread exiting with code %u\n", result);
|
||||||
{
|
{
|
||||||
std::lock_guard lk(data.obj->m);
|
std::lock_guard lk(data.obj->m);
|
||||||
data.obj->exitCode = result;
|
data.obj->exitCode = result;
|
||||||
|
@ -43,7 +43,7 @@ void WIN_FUNC Sleep(DWORD dwMilliseconds) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName) {
|
HANDLE WIN_FUNC CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCWSTR lpName) {
|
||||||
DEBUG_LOG("CreateMutexW(%p, %d, %ls)\n", lpMutexAttributes, static_cast<int>(bInitialOwner),
|
DEBUG_LOG("CreateMutexW(%p, %d, %s)\n", lpMutexAttributes, static_cast<int>(bInitialOwner),
|
||||||
wideStringToString(lpName).c_str());
|
wideStringToString(lpName).c_str());
|
||||||
std::u16string name = makeU16String(lpName);
|
std::u16string name = makeU16String(lpName);
|
||||||
const uint32_t grantedAccess = MUTEX_ALL_ACCESS;
|
const uint32_t grantedAccess = MUTEX_ALL_ACCESS;
|
||||||
@ -110,7 +110,7 @@ BOOL WIN_FUNC ReleaseMutex(HANDLE hMutex) {
|
|||||||
|
|
||||||
HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState,
|
HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState,
|
||||||
LPCWSTR lpName) {
|
LPCWSTR lpName) {
|
||||||
DEBUG_LOG("CreateEventW(%p, %d, %d, %ls)\n", lpEventAttributes, static_cast<int>(bManualReset),
|
DEBUG_LOG("CreateEventW(%p, %d, %d, %s)\n", lpEventAttributes, static_cast<int>(bManualReset),
|
||||||
static_cast<int>(bInitialState), wideStringToString(lpName).c_str());
|
static_cast<int>(bInitialState), wideStringToString(lpName).c_str());
|
||||||
std::u16string name = makeU16String(lpName);
|
std::u16string name = makeU16String(lpName);
|
||||||
const uint32_t grantedAccess = EVENT_ALL_ACCESS;
|
const uint32_t grantedAccess = EVENT_ALL_ACCESS;
|
||||||
@ -118,12 +118,9 @@ HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu
|
|||||||
if (lpEventAttributes && lpEventAttributes->bInheritHandle) {
|
if (lpEventAttributes && lpEventAttributes->bInheritHandle) {
|
||||||
handleFlags |= HANDLE_FLAG_INHERIT;
|
handleFlags |= HANDLE_FLAG_INHERIT;
|
||||||
}
|
}
|
||||||
auto [ev, alreadyExists] = wibo::g_namespace.getOrCreate(name, [&]() {
|
auto [ev, created] = wibo::g_namespace.getOrCreate(name, [&]() {
|
||||||
auto e = new EventObject(!!bManualReset);
|
auto e = new EventObject(bManualReset);
|
||||||
if (bInitialState) {
|
e->signaled.store(bInitialState, std::memory_order_relaxed);
|
||||||
std::lock_guard lk(e->m);
|
|
||||||
e->signaled.store(true, std::memory_order_relaxed);
|
|
||||||
}
|
|
||||||
return e;
|
return e;
|
||||||
});
|
});
|
||||||
if (!ev) {
|
if (!ev) {
|
||||||
@ -132,7 +129,8 @@ HANDLE WIN_FUNC CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
HANDLE h = wibo::handles().alloc(std::move(ev), grantedAccess, handleFlags);
|
HANDLE h = wibo::handles().alloc(std::move(ev), grantedAccess, handleFlags);
|
||||||
wibo::lastError = alreadyExists ? ERROR_ALREADY_EXISTS : ERROR_SUCCESS;
|
DEBUG_LOG("-> %p (created=%d)\n", h, created ? 1 : 0);
|
||||||
|
wibo::lastError = created ? ERROR_SUCCESS : ERROR_ALREADY_EXISTS;
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +145,7 @@ HANDLE WIN_FUNC CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManu
|
|||||||
|
|
||||||
HANDLE WIN_FUNC CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount,
|
HANDLE WIN_FUNC CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount,
|
||||||
LPCWSTR lpName) {
|
LPCWSTR lpName) {
|
||||||
DEBUG_LOG("CreateSemaphoreW(%p, %ld, %ld, %ls)\n", lpSemaphoreAttributes, lInitialCount, lMaximumCount,
|
DEBUG_LOG("CreateSemaphoreW(%p, %ld, %ld, %s)\n", lpSemaphoreAttributes, lInitialCount, lMaximumCount,
|
||||||
wideStringToString(lpName).c_str());
|
wideStringToString(lpName).c_str());
|
||||||
auto name = makeU16String(lpName);
|
auto name = makeU16String(lpName);
|
||||||
const uint32_t granted = SEMAPHORE_ALL_ACCESS;
|
const uint32_t granted = SEMAPHORE_ALL_ACCESS;
|
||||||
@ -266,6 +264,8 @@ DWORD WIN_FUNC WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DEBUG_LOG("Waiting on object with type %d\n", static_cast<int>(obj->type));
|
||||||
|
|
||||||
switch (obj->type) {
|
switch (obj->type) {
|
||||||
case ObjectType::Event: {
|
case ObjectType::Event: {
|
||||||
auto ev = std::move(obj).downcast<EventObject>();
|
auto ev = std::move(obj).downcast<EventObject>();
|
||||||
|
@ -854,11 +854,13 @@ ModuleInfo *loadModule(const char *dllName) {
|
|||||||
registerExternalModuleAliases(*reg, requested, files::canonicalPath(path), info);
|
registerExternalModuleAliases(*reg, requested, files::canonicalPath(path), info);
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
reg.lock.unlock();
|
||||||
|
|
||||||
DEBUG_LOG(" loading external module from %s\n", path.c_str());
|
DEBUG_LOG(" loading external module from %s\n", path.c_str());
|
||||||
FILE *file = fopen(path.c_str(), "rb");
|
FILE *file = fopen(path.c_str(), "rb");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
perror("loadModule");
|
perror("loadModule");
|
||||||
|
reg.lock.lock();
|
||||||
diskError = ERROR_MOD_NOT_FOUND;
|
diskError = ERROR_MOD_NOT_FOUND;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -867,6 +869,7 @@ ModuleInfo *loadModule(const char *dllName) {
|
|||||||
if (!executable->loadPE(file, true)) {
|
if (!executable->loadPE(file, true)) {
|
||||||
DEBUG_LOG(" loadPE failed for %s\n", path.c_str());
|
DEBUG_LOG(" loadPE failed for %s\n", path.c_str());
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
reg.lock.lock();
|
||||||
diskError = ERROR_BAD_EXE_FORMAT;
|
diskError = ERROR_BAD_EXE_FORMAT;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@ -881,16 +884,20 @@ ModuleInfo *loadModule(const char *dllName) {
|
|||||||
info->executable = std::move(executable);
|
info->executable = std::move(executable);
|
||||||
info->refCount = 1;
|
info->refCount = 1;
|
||||||
|
|
||||||
|
reg.lock.lock();
|
||||||
ModuleInfo *raw = info.get();
|
ModuleInfo *raw = info.get();
|
||||||
reg->modulesByKey[key] = std::move(info);
|
reg->modulesByKey[key] = std::move(info);
|
||||||
registerExternalModuleAliases(*reg, requested, raw->resolvedPath, raw);
|
registerExternalModuleAliases(*reg, requested, raw->resolvedPath, raw);
|
||||||
|
reg.lock.unlock();
|
||||||
ensureExportsInitialized(*raw);
|
ensureExportsInitialized(*raw);
|
||||||
if (!raw->executable->resolveImports()) {
|
if (!raw->executable->resolveImports()) {
|
||||||
DEBUG_LOG(" resolveImports failed for %s\n", raw->originalName.c_str());
|
DEBUG_LOG(" resolveImports failed for %s\n", raw->originalName.c_str());
|
||||||
|
reg.lock.lock();
|
||||||
reg->modulesByKey.erase(key);
|
reg->modulesByKey.erase(key);
|
||||||
diskError = wibo::lastError;
|
diskError = wibo::lastError;
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
reg.lock.lock();
|
||||||
if (!callDllMain(*raw, DLL_PROCESS_ATTACH, nullptr)) {
|
if (!callDllMain(*raw, DLL_PROCESS_ATTACH, nullptr)) {
|
||||||
DEBUG_LOG(" DllMain failed for %s\n", raw->originalName.c_str());
|
DEBUG_LOG(" DllMain failed for %s\n", raw->originalName.c_str());
|
||||||
runPendingOnExit(*raw);
|
runPendingOnExit(*raw);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user