[*] NT: Further reduce Win32 link-time requirements cont (1948dd0c)

This commit is contained in:
Reece Wilson 2023-07-24 12:48:42 +01:00
parent 1948dd0c1a
commit d45dc977d8
10 changed files with 183 additions and 27 deletions

View File

@ -30,6 +30,7 @@ namespace Aurora
ADD_LOAD_LIB(BCrypt);
ADD_LOAD_LIB(Theme);
ADD_LOAD_LIB(Shell);
ADD_LOAD_LIB(PSAPILegacy);
#define ADD_GET_PROC(name, proc) \
if (h ## name) \
@ -51,6 +52,20 @@ namespace Aurora
} \
}
#define ADD_GET_PROC_BI2(name, name2, proc, proc2) \
p ## proc2 = nullptr; \
if (h ## name) \
{ \
p ## proc2 = AuReinterpretCast<decltype(p ## proc2)>(GetProcAddress(h ## name, #proc)); \
} \
if (!p ## proc2) \
{ \
if (h ## name2) \
{ \
p ## proc2 = AuReinterpretCast<decltype(p ## proc2)>(GetProcAddress(h ## name2, #proc2)); \
} \
}
#define ADD_GET_PROC_INTERNAL_MAP(name, proc, symbol) \
if (h ## name) \
{ \
@ -86,6 +101,15 @@ namespace Aurora
ADD_GET_PROC(Kernel32, FindFirstStreamW)
ADD_GET_PROC(Kernel32, FindNextStreamW)
ADD_GET_PROC(Kernel32, FindClose)
ADD_GET_PROC(Kernel32, CancelIoEx)
ADD_GET_PROC(Kernel32, CancelSynchronousIo)
ADD_GET_PROC(Kernel32, SetFileInformationByHandle)
ADD_GET_PROC(Kernel32, GetLocaleInfoEx)
ADD_GET_PROC(Kernel32, LCIDToLocaleName)
ADD_GET_PROC(Kernel32, GetLocaleInfoW)
ADD_GET_PROC(Kernel32, GetThreadId)
ADD_GET_PROC_BI2(Kernel32, PSAPILegacy, K32GetProcessMemoryInfo, GetProcessMemoryInfo)
ADD_GET_PROC(Sync, WaitOnAddress)
ADD_GET_PROC(Sync, WakeByAddressSingle)
@ -116,6 +140,17 @@ namespace Aurora
pVirtualAlloc2 = VirtualAlloc2FromApp;
pMapViewOfFile3 = MapViewOfFile3FromApp;
pCancelIoEx = CancelIoEx;
pCancelSynchronousIo = CancelSynchronousIo;
pGetLocaleInfoEx = GetLocaleInfoEx;
pLCIDToLocaleName = LCIDToLocaleName;
pSetFileInformationByHandle = SetFileInformationByHandle;
pFindClose = FindClose;
pGetSystemCpuSetInformation = GetSystemCpuSetInformation;
pGetLogicalProcessorInformation = GetLogicalProcessorInformation;

View File

@ -7,6 +7,8 @@
***/
#pragma once
struct _PROCESS_MEMORY_COUNTERS;
namespace Aurora
{
void InitNTAddresses();
@ -20,6 +22,7 @@ namespace Aurora
static const wchar_t *kBCryptDllName { L"bcrypt.dll" };
static const wchar_t *kThemeDllName { L"UxTheme.dll" };
static const wchar_t *kShellDllName { L"Shell32.dll" };
static const wchar_t *kPSAPILegacyDllName { L"psapi.dll" };
struct WIN32_MEMORY_RANGE_ENTRY2
{
@ -277,6 +280,53 @@ namespace Aurora
HANDLE hFindFile
);
inline BOOL(__stdcall *pCancelIoEx)(
HANDLE hFile,
LPOVERLAPPED lpOverlapped
);
inline BOOL(__stdcall *pCancelSynchronousIo)(
HANDLE hThread
);
inline BOOL(__stdcall *pGetProcessMemoryInfo)(
HANDLE Process,
::_PROCESS_MEMORY_COUNTERS *ppsmemCounters,
DWORD cb
);
inline BOOL(__stdcall *pSetFileInformationByHandle)(
HANDLE hFile,
FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
LPVOID lpFileInformation,
DWORD dwBufferSize
);
inline int(__stdcall *pGetLocaleInfoEx)(
LPCWSTR lpLocaleName,
LCTYPE LCType,
LPWSTR lpLCData,
int cchData
);
inline int(__stdcall *pLCIDToLocaleName)(
LCID Locale,
LPWSTR lpName,
int cchName,
DWORD dwFlags
);
inline int(__stdcall *pGetLocaleInfoW)(
LCID Locale,
LCTYPE LCType,
LPWSTR lpLCData,
int cchData
);
inline DWORD(__stdcall *pGetThreadId)(
HANDLE hThread
);
inline HRESULT(__stdcall *pSHGetKnownFolderPath)(
const GUID & rfid,
DWORD dwFlags,

View File

@ -525,9 +525,10 @@ namespace Aurora::Console::ConsoleStd
void SignalKillNT()
{
if (IS_STREAM_HANDLE_VALID(gWin32Thread))
if (IS_STREAM_HANDLE_VALID(gWin32Thread) &&
pCancelSynchronousIo)
{
CancelSynchronousIo(gWin32Thread);
pCancelSynchronousIo(gWin32Thread);
}
if (IS_STREAM_HANDLE_VALID(gTerminateConsole))

View File

@ -37,7 +37,9 @@ namespace Aurora::HWInfo
#if defined(AURORA_IS_MODERNNT_DERIVED)
PROCESS_MEMORY_COUNTERS pm;
if (GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast<PPROCESS_MEMORY_COUNTERS>(&pm), sizeof(PROCESS_MEMORY_COUNTERS)))
if (pGetProcessMemoryInfo(GetCurrentProcess(),
reinterpret_cast<PPROCESS_MEMORY_COUNTERS>(&pm),
sizeof(PROCESS_MEMORY_COUNTERS)))
{
return RamStat {pm.WorkingSetSize, max};
}
@ -114,15 +116,22 @@ namespace Aurora::HWInfo
PROCESS_MEMORY_COUNTERS_EX pmc;
PROCESS_MEMORY_COUNTERS pm;
if (GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast<PPROCESS_MEMORY_COUNTERS>(&pmc), sizeof(PROCESS_MEMORY_COUNTERS_EX)))
if (pGetProcessMemoryInfo)
{
if (pGetProcessMemoryInfo(GetCurrentProcess(),
reinterpret_cast<PPROCESS_MEMORY_COUNTERS>(&pmc),
sizeof(PROCESS_MEMORY_COUNTERS_EX)))
{
return RamStat { pmc.PrivateUsage, max };
}
if (GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast<PPROCESS_MEMORY_COUNTERS>(&pm), sizeof(PROCESS_MEMORY_COUNTERS)))
if (pGetProcessMemoryInfo(GetCurrentProcess(),
reinterpret_cast<PPROCESS_MEMORY_COUNTERS>(&pm),
sizeof(PROCESS_MEMORY_COUNTERS)))
{
return RamStat { pm.WorkingSetSize, max };
}
}
return RamStat {};
#else

View File

@ -491,7 +491,14 @@ namespace Aurora::IO::FS
{
this->isIrredeemable_ = true;
this->bHasFailed = true;
::CancelIoEx(this->pHandle_->handle, &this->overlap);
if (pCancelIoEx)
{
pCancelIoEx(this->pHandle_->handle, &this->overlap);
}
else
{
::CancelIo(this->pHandle_->handle);
}
::SetEvent(this->event);
this->dwOsErrorCode = ERROR_ABANDONED_WAIT_0;
}

View File

@ -188,7 +188,7 @@ namespace Aurora::IO::FS
{
FILE_DISPOSITION_INFO rm {};
rm.DeleteFile = true;
if (!SetFileInformationByHandle(this->handle_, _FILE_INFO_BY_HANDLE_CLASS::FileDispositionInfo, &rm, sizeof(rm)))
if (!(pSetFileInformationByHandle && pSetFileInformationByHandle(this->handle_, _FILE_INFO_BY_HANDLE_CLASS::FileDispositionInfo, &rm, sizeof(rm))))
{
SysPushErrorIO("Couldn't delete temporary file {}", this->path_);
}

View File

@ -438,7 +438,14 @@ namespace Aurora::IO::FS
void NTWatchObject::Cancel()
{
CancelIoEx(this->hFileHandle, &this->ntOverlapped);
if (pCancelIoEx)
{
pCancelIoEx(this->hFileHandle, &this->ntOverlapped);
}
else
{
::CancelIo(this->hFileHandle);
}
AuWin32CloseHandle(this->hFileHandle);
}

View File

@ -392,7 +392,14 @@ namespace Aurora::IO::Net
{
this->bIsIrredeemable = true;
this->bHasFailed = true;
::CancelIoEx((HANDLE)this->GetSocket(), &this->overlap);
if (pCancelIoEx)
{
pCancelIoEx((HANDLE)this->GetSocket(), &this->overlap);
}
else
{
::CancelIo((HANDLE)this->GetSocket());
}
this->dwOsErrorCode = ERROR_ABANDONED_WAIT_0;
}
else

View File

@ -94,19 +94,43 @@ namespace Aurora::Locale
int ret;
wchar_t name[LOCALE_NAME_MAX_LENGTH] = { 0 };
ret = LCIDToLocaleName(LOCALE_USER_DEFAULT, name, LOCALE_NAME_MAX_LENGTH, LOCALE_ALLOW_NEUTRAL_NAMES);
if (pLCIDToLocaleName)
{
ret = pLCIDToLocaleName(LOCALE_USER_DEFAULT, name, LOCALE_NAME_MAX_LENGTH, LOCALE_ALLOW_NEUTRAL_NAMES);
SysAssert(ret, "Couldn't acquire win32 locale information");
}
{
wchar_t language[LOCALE_NAME_MAX_LENGTH] = { 0 };
ret = GetLocaleInfoEx(name, LOCALE_SISO639LANGNAME, language, LOCALE_NAME_MAX_LENGTH);
if (pGetLocaleInfoEx)
{
ret = pGetLocaleInfoEx(name, LOCALE_SISO639LANGNAME, language, LOCALE_NAME_MAX_LENGTH);
SysAssert(ret, "Couldn't acquire win32 provided ISO 639 map of {}", ConvertFromWChar(name));
}
else if (pGetLocaleInfoW)
{
ret = pGetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, language, LOCALE_NAME_MAX_LENGTH);
SysAssert(ret, "Couldn't acquire win32 provided ISO 639 map of {}", ConvertFromWChar(name));
}
gLanguageCode = ConvertFromWChar(language);
}
{
wchar_t country[LOCALE_NAME_MAX_LENGTH] = { 0 };
ret = GetLocaleInfoEx(name, LOCALE_SISO3166CTRYNAME, country, LOCALE_NAME_MAX_LENGTH);
if (pGetLocaleInfoEx)
{
ret = pGetLocaleInfoEx(name, LOCALE_SISO3166CTRYNAME, country, LOCALE_NAME_MAX_LENGTH);
SysAssert(ret, "Couldn't acquire win32 provided ISO 3166 map of {}", ConvertFromWChar(name));
}
else if (pGetLocaleInfoW)
{
ret = pGetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, country, LOCALE_NAME_MAX_LENGTH);
SysAssert(ret, "Couldn't acquire win32 provided ISO 3166 map of {}", ConvertFromWChar(name));
}
gCountryCode = ConvertFromWChar(country);
gLanguageCode = ConvertFromWChar(language);
}
SetCodesetCommonGuessWin32();
}

View File

@ -646,7 +646,19 @@ namespace Aurora::Threading::Threads
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = this->name_.c_str();
info.dwThreadID = ::GetThreadId(this->handle_);
if (pGetThreadId)
{
info.dwThreadID = pGetThreadId(this->handle_);
}
else if (this->unixThreadId_ == GetCurrentThreadId())
{
info.dwThreadID = this->unixThreadId_;
}
else
{
return;
}
info.dwFlags = 0;
auto raise = AuStaticCast<void(__cdecl *)(THREADNAME_INFO &)>([](THREADNAME_INFO &info)
@ -712,6 +724,10 @@ namespace Aurora::Threading::Threads
this->unixThreadId_ = 0; // !!!!
#endif
#if defined(AURORA_PLATFORM_WIN32)
this->unixThreadId_ = GetCurrentThreadId();
#endif
if (this->tls_)
{
SetThreadKey(this->tls_);