diff --git a/dll/kernel32/handleapi.cpp b/dll/kernel32/handleapi.cpp index 75cf7de..1ec5895 100644 --- a/dll/kernel32/handleapi.cpp +++ b/dll/kernel32/handleapi.cpp @@ -18,6 +18,7 @@ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, H (void)dwDesiredAccess; (void)dwOptions; if (!lpTargetHandle) { + DEBUG_LOG("-> ERROR_INVALID_PARAMETER\n"); setLastError(ERROR_INVALID_PARAMETER); return FALSE; } @@ -53,9 +54,11 @@ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle, HANDLE hSourceHandle, H } if (!handles.duplicateTo(hSourceHandle, handles, *lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions)) { + DEBUG_LOG("-> ERROR_INVALID_HANDLE\n"); setLastError(ERROR_INVALID_HANDLE); return FALSE; } + DEBUG_LOG("-> %p\n", *lpTargetHandle); return TRUE; } diff --git a/dll/kernel32/processenv.cpp b/dll/kernel32/processenv.cpp index add02d9..8083a0e 100644 --- a/dll/kernel32/processenv.cpp +++ b/dll/kernel32/processenv.cpp @@ -74,8 +74,9 @@ GUEST_PTR WINAPI GetCommandLineW() { HANDLE WINAPI GetStdHandle(DWORD nStdHandle) { HOST_CONTEXT_GUARD(); - DEBUG_LOG("GetStdHandle(%d)\n", nStdHandle); - return files::getStdHandle(nStdHandle); + HANDLE handle = files::getStdHandle(nStdHandle); + DEBUG_LOG("GetStdHandle(%d) -> %p\n", nStdHandle, handle); + return handle; } BOOL WINAPI SetStdHandle(DWORD nStdHandle, HANDLE hHandle) { @@ -163,7 +164,7 @@ BOOL WINAPI FreeEnvironmentStringsA(LPCH penv) { setLastError(ERROR_INVALID_PARAMETER); return FALSE; } - free(penv); + wibo::heap::guestFree(penv); return TRUE; } @@ -174,7 +175,7 @@ BOOL WINAPI FreeEnvironmentStringsW(LPWCH penv) { setLastError(ERROR_INVALID_PARAMETER); return FALSE; } - free(penv); + wibo::heap::guestFree(penv); return TRUE; } diff --git a/dll/kernel32/winbase.cpp b/dll/kernel32/winbase.cpp index 4cb5db5..d26793f 100644 --- a/dll/kernel32/winbase.cpp +++ b/dll/kernel32/winbase.cpp @@ -812,7 +812,7 @@ HGLOBAL WINAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes) { } bool zero = (uFlags & GMEM_ZEROINIT) != 0; void *ret = doAlloc(static_cast(dwBytes), zero); - DEBUG_LOG("-> %p\n", ret); + VERBOSE_LOG("-> %p\n", ret); return toGuestPtr(ret); } @@ -820,10 +820,10 @@ HGLOBAL WINAPI GlobalFree(HGLOBAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("GlobalFree(%p)\n", hMem); if (doFree(reinterpret_cast(hMem))) { - DEBUG_LOG("-> success\n"); + VERBOSE_LOG("-> success\n"); return NO_HANDLE; } else { - DEBUG_LOG("-> failure\n"); + VERBOSE_LOG("-> failure\n"); return hMem; } } @@ -837,7 +837,7 @@ HGLOBAL WINAPI GlobalReAlloc(HGLOBAL hMem, SIZE_T dwBytes, UINT uFlags) { } bool zero = (uFlags & GMEM_ZEROINIT) != 0; void *ret = doRealloc(reinterpret_cast(hMem), static_cast(dwBytes), zero); - DEBUG_LOG("-> %p\n", ret); + VERBOSE_LOG("-> %p\n", ret); return toGuestPtr(ret); } @@ -853,7 +853,7 @@ HLOCAL WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes) { VERBOSE_LOG("LocalAlloc(%x, %zu)\n", uFlags, static_cast(uBytes)); bool zero = (uFlags & LMEM_ZEROINIT) != 0; if ((uFlags & LMEM_MOVEABLE) != 0) { - DEBUG_LOG(" ignoring LMEM_MOVEABLE\n"); + VERBOSE_LOG(" ignoring LMEM_MOVEABLE\n"); } void *result = doAlloc(static_cast(uBytes), zero); if (!result) { @@ -862,7 +862,7 @@ HLOCAL WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes) { } // Legacy Windows applications (pre-NX and DEP) may expect executable memory from LocalAlloc. tryMarkExecutable(result); - DEBUG_LOG(" -> %p\n", result); + VERBOSE_LOG(" -> %p\n", result); return toGuestPtr(result); } @@ -870,10 +870,10 @@ HLOCAL WINAPI LocalFree(HLOCAL hMem) { HOST_CONTEXT_GUARD(); VERBOSE_LOG("LocalFree(%p)\n", hMem); if (doFree(reinterpret_cast(hMem))) { - DEBUG_LOG("-> success\n"); + VERBOSE_LOG("-> success\n"); return NO_HANDLE; } else { - DEBUG_LOG("-> failure\n"); + VERBOSE_LOG("-> failure\n"); return hMem; } } @@ -883,7 +883,7 @@ HLOCAL WINAPI LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags) { VERBOSE_LOG("LocalReAlloc(%p, %zu, %x)\n", hMem, static_cast(uBytes), uFlags); bool zero = (uFlags & LMEM_ZEROINIT) != 0; if ((uFlags & LMEM_MOVEABLE) != 0) { - DEBUG_LOG(" ignoring LMEM_MOVEABLE\n"); + VERBOSE_LOG(" ignoring LMEM_MOVEABLE\n"); } void *result = doRealloc(reinterpret_cast(hMem), static_cast(uBytes), zero); if (!result && uBytes != 0) { @@ -892,7 +892,7 @@ HLOCAL WINAPI LocalReAlloc(HLOCAL hMem, SIZE_T uBytes, UINT uFlags) { } // Legacy Windows applications (pre-NX and DEP) may expect executable memory from LocalReAlloc. tryMarkExecutable(result); - DEBUG_LOG(" -> %p\n", result); + VERBOSE_LOG(" -> %p\n", result); return toGuestPtr(result); } @@ -904,7 +904,7 @@ HLOCAL WINAPI LocalHandle(LPCVOID pMem) { LPVOID WINAPI LocalLock(HLOCAL hMem) { HOST_CONTEXT_GUARD(); - VERBOSE_LOG("LocalLock(%p)\n", hMem); + VERBOSE_LOG("STUB: LocalLock(%p)\n", hMem); return reinterpret_cast(hMem); } @@ -923,7 +923,7 @@ SIZE_T WINAPI LocalSize(HLOCAL hMem) { UINT WINAPI LocalFlags(HLOCAL hMem) { HOST_CONTEXT_GUARD(); - VERBOSE_LOG("LocalFlags(%p)\n", hMem); + VERBOSE_LOG("STUB: LocalFlags(%p)\n", hMem); (void)hMem; return 0; } diff --git a/dll/rpcrt4.cpp b/dll/rpcrt4.cpp index 13a429c..b147aea 100644 --- a/dll/rpcrt4.cpp +++ b/dll/rpcrt4.cpp @@ -222,7 +222,7 @@ RPC_STATUS WINAPI RpcStringFreeW(GUEST_PTR *string) { if (it != g_stringBindings.end()) { g_stringBindings.erase(it); } - std::free(reinterpret_cast(value)); + wibo::heap::guestFree(reinterpret_cast(value)); *string = GUEST_NULL; return RPC_S_OK; } diff --git a/src/main.cpp b/src/main.cpp index e8a3259..0ba4d62 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -65,7 +65,7 @@ void wibo::destroyTib(TEB *tibPtr) { return; } tls::cleanupTib(tibPtr); - std::free(tibPtr); + wibo::heap::guestFree(tibPtr); } void wibo::initializeTibStackInfo(TEB *tibPtr) { diff --git a/src/tls.cpp b/src/tls.cpp index 67246f3..67fd2b8 100644 --- a/src/tls.cpp +++ b/src/tls.cpp @@ -117,7 +117,7 @@ bool ensureGlobalExpansionCapacityLocked(size_t required) { auto *newArr = allocateTlsArray(target); if (!newArr) { for (auto &entry : pending) { - std::free(entry.newArr); + wibo::heap::guestFree(entry.newArr); } return false; } @@ -131,7 +131,7 @@ bool ensureGlobalExpansionCapacityLocked(size_t required) { } for (auto &entry : pending) { if (entry.oldArr) { - std::free(entry.oldArr); + wibo::heap::guestFree(entry.oldArr); } } g_expansionCapacity = target; @@ -193,7 +193,7 @@ bool ensureModuleArrayCapacityLocked(size_t required) { auto *newArray = allocateTlsArray(target); if (!newArray) { for (auto &entry : pending) { - std::free(entry.newArray); + wibo::heap::guestFree(entry.newArray); } return false; } @@ -261,16 +261,16 @@ void cleanupTib(TEB *tib) { } std::lock_guard lock(g_tlsMutex); if (auto *arr = getExpansionArray(tib)) { - std::free(arr); + wibo::heap::guestFree(arr); setExpansionArray(tib, nullptr); } if (auto *arr = getModuleArray(tib)) { g_moduleArrays.erase(tib); - std::free(arr); + wibo::heap::guestFree(arr); } if (auto garbageIt = g_moduleGarbage.find(tib); garbageIt != g_moduleGarbage.end()) { for (auto *oldArray : garbageIt->second) { - std::free(oldArray); + wibo::heap::guestFree(oldArray); } g_moduleGarbage.erase(garbageIt); }