diff --git a/Source/Windows/Common/FEXUnixLib.cpp b/Source/Windows/Common/FEXUnixLib.cpp index 318803416..e37807fda 100644 --- a/Source/Windows/Common/FEXUnixLib.cpp +++ b/Source/Windows/Common/FEXUnixLib.cpp @@ -200,4 +200,14 @@ void* MapFile(HANDLE FileHandle, uint64_t MapSize) { return nullptr; } +uint32_t GetPID() { + if (Available()) { + FEXUnixLib_GetPID Args {}; + Call(FEXUnixLibFunctions::GetPID, &Args); + return Args.Result; + } + + return GetCurrentProcessId(); +} + } // namespace FEX::Windows::UnixLib diff --git a/Source/Windows/Common/FEXUnixLib.h b/Source/Windows/Common/FEXUnixLib.h index c8a09bfed..c62a763a8 100644 --- a/Source/Windows/Common/FEXUnixLib.h +++ b/Source/Windows/Common/FEXUnixLib.h @@ -48,4 +48,9 @@ SHMSlotResult AllocateSHMSlots(void* SHMBase, uint32_t MapSize, uint32_t MaxSize void DeleteSHMStatsFile(); void* MapFile(HANDLE FileHandle, uint64_t MapSize); + +// Returns the process pid when unixlib is available. +// Or returns the process ID otherwise. +uint32_t GetPID(); + } // namespace FEX::Windows::UnixLib diff --git a/Source/Windows/UnixLib/FEXUnixLib.cpp b/Source/Windows/UnixLib/FEXUnixLib.cpp index ade82220c..8adef5993 100644 --- a/Source/Windows/UnixLib/FEXUnixLib.cpp +++ b/Source/Windows/UnixLib/FEXUnixLib.cpp @@ -176,6 +176,11 @@ static NTSTATUS FEXUnixLib_MapFileHandler(void* _Args) { return STATUS_SUCCESS; } +static NTSTATUS FEXUnixLib_GetPIDHandler(void* _Args) { + auto Args = reinterpret_cast(_Args); + Args->Result = ::getpid(); + return STATUS_SUCCESS; +} extern "C" const unixlib_entry_t __wine_unix_call_funcs[] = { FEXUnixLib_SetHardwareTSOControlHandler, FEXUnixLib_SetKernelUnalignedAtomicControlHandler, @@ -184,6 +189,7 @@ extern "C" const unixlib_entry_t __wine_unix_call_funcs[] = { FEXUnixLib_GetSHMStatsVMAHandler, FEXUnixLib_DeleteSHMStatsFileHandler, FEXUnixLib_MapFileHandler, + FEXUnixLib_GetPIDHandler, }; static_assert(sizeof(__wine_unix_call_funcs) / sizeof(__wine_unix_call_funcs[0]) == ToUnderlying(FEXUnixLibFunctions::MAX)); diff --git a/Source/Windows/UnixLib/FEXUnixLib.h b/Source/Windows/UnixLib/FEXUnixLib.h index 80ff24cf0..ed7f18ce6 100644 --- a/Source/Windows/UnixLib/FEXUnixLib.h +++ b/Source/Windows/UnixLib/FEXUnixLib.h @@ -11,6 +11,7 @@ enum class FEXUnixLibFunctions : uint32_t { GetSHMStatsVMA, DeleteSHMStatsFile, MapFile, + GetPID, MAX, }; @@ -59,3 +60,8 @@ struct FEXUnixLib_MapFile { void* Result; }; static_assert(sizeof(FEXUnixLib_MapFile) == 24); + +struct FEXUnixLib_GetPID { + uint32_t Result; +}; +static_assert(sizeof(FEXUnixLib_GetPID) == 4);