[*] Fix AuProcess deadlock and parity issue between some unix loaders and Windows
[*] Slight UWP progress in AuProcessMap.NT.cpp (not really)
This commit is contained in:
parent
85cf7d7a4c
commit
6122525ed3
@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
namespace Aurora::Process
|
namespace Aurora::Process
|
||||||
{
|
{
|
||||||
static AuFutexMutex gSpinLock;
|
static AuCriticalSection gSpinLock;
|
||||||
static AuList<AuString> gClassPath;
|
static AuList<AuString> gClassPath;
|
||||||
static AuHashMap<AuString, void *> gModuleHandles;
|
static AuHashMap<AuString, void *> gModuleHandles;
|
||||||
static const bool kIsMainSigned = false;
|
static const bool kIsMainSigned = false;
|
||||||
@ -634,16 +634,75 @@ namespace Aurora::Process
|
|||||||
|
|
||||||
AUKN_SYM AuMach GetProcAddressEx(void *pHandle, const AuString &symbol)
|
AUKN_SYM AuMach GetProcAddressEx(void *pHandle, const AuString &symbol)
|
||||||
{
|
{
|
||||||
|
AuMach ret {};
|
||||||
|
|
||||||
#if defined(AURORA_IS_MODERNNT_DERIVED)
|
#if defined(AURORA_IS_MODERNNT_DERIVED)
|
||||||
if (!pGetProcAddress)
|
if (!pGetProcAddress)
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ret = reinterpret_cast<AuMach>(pGetProcAddress(reinterpret_cast<HMODULE>(pHandle), symbol.c_str()));
|
if (pHandle)
|
||||||
|
{
|
||||||
|
ret = reinterpret_cast<AuMach>(pGetProcAddress(reinterpret_cast<HMODULE>(pHandle), symbol.c_str()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(AURORA_PLATFORM_WIN32)
|
||||||
|
ret = reinterpret_cast<AuMach>(pGetProcAddress(::GetModuleHandleW(nullptr), symbol.c_str()));
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
HMODULE hHandle;
|
||||||
|
if (GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||||
|
reinterpret_cast<LPCWSTR>(&GetProcAddressEx), &hHandle))
|
||||||
|
{
|
||||||
|
ret = reinterpret_cast<AuMach>(pGetProcAddress(hHandle, symbol.c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
AU_LOCK_GUARD(gSpinLock);
|
||||||
|
|
||||||
|
for (const auto &[string, hHandle] : gModuleHandles)
|
||||||
|
{
|
||||||
|
ret = reinterpret_cast<AuMach>(pGetProcAddress(reinterpret_cast<HMODULE>(hHandle), symbol.c_str()));
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
auto ret = reinterpret_cast<AuMach>(dlsym(pHandle, symbol.c_str()));
|
if (pHandle)
|
||||||
|
{
|
||||||
|
ret = reinterpret_cast<AuMach>(dlsym(pHandle, symbol.c_str()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(RTLD_DEFAULT)
|
||||||
|
ret = reinterpret_cast<AuMach>(dlsym(RTLD_DEFAULT, symbol.c_str()));
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
AU_LOCK_GUARD(gSpinLock);
|
||||||
|
|
||||||
|
for (const auto &[string, hHandle] : gModuleHandles)
|
||||||
|
{
|
||||||
|
ret = reinterpret_cast<AuMach>(dlsym(hHandle, symbol.c_str()));
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -663,14 +722,24 @@ namespace Aurora::Process
|
|||||||
|
|
||||||
AUKN_SYM AuMach GetProcAddress(const AuString &mod, const AuString &symbol)
|
AUKN_SYM AuMach GetProcAddress(const AuString &mod, const AuString &symbol)
|
||||||
{
|
{
|
||||||
auto ret = GetProcAddressEx(GetProcHandle(mod), symbol);
|
if (mod.empty())
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
{
|
{
|
||||||
SysPushErrorGen("Couldn't resolve symbol in module {} of mangled name '{}'", mod, symbol);
|
return GetProcAddressEx(nullptr, symbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
if (auto pHandle = GetProcHandle(mod))
|
||||||
|
{
|
||||||
|
auto ret = GetProcAddressEx(pHandle, symbol);
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
SysPushErrorGen("Couldn't resolve symbol in module {} of mangled name '{}'", mod, symbol);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
AUKN_SYM void Exit(AuUInt32 exitcode)
|
AUKN_SYM void Exit(AuUInt32 exitcode)
|
||||||
|
@ -216,14 +216,20 @@ namespace Aurora::Process
|
|||||||
|
|
||||||
bool MakeAwarePtr(AuUInt pointer)
|
bool MakeAwarePtr(AuUInt pointer)
|
||||||
{
|
{
|
||||||
HMODULE handle;
|
#if defined(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)
|
||||||
if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast<LPCWSTR>(pointer), &handle))
|
HMODULE hHandle;
|
||||||
|
if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||||
|
reinterpret_cast<LPCWSTR>(pointer),
|
||||||
|
&hHandle))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
MakeAware(handle);
|
MakeAware(hHandle);
|
||||||
return true;
|
return true;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
AuOptional<Section> LookupArbitrarySection(AuUInt address)
|
AuOptional<Section> LookupArbitrarySection(AuUInt address)
|
||||||
|
Loading…
Reference in New Issue
Block a user