diff --git a/Source/Windows/WOW64/BTInterface.h b/Source/Windows/WOW64/BTInterface.h index 80d1c8fc5..261a1f750 100644 --- a/Source/Windows/WOW64/BTInterface.h +++ b/Source/Windows/WOW64/BTInterface.h @@ -7,8 +7,9 @@ extern "C" { void STDMETHODCALLTYPE BTCpuProcessInit(); -NTSTATUS STDMETHODCALLTYPE BTCpuThreadInit(); -NTSTATUS STDMETHODCALLTYPE BTCpuThreadTerm(HANDLE Thread); +void STDMETHODCALLTYPE BTCpuProcessTerm(HANDLE Handle, BOOL After, ULONG Status); +void STDMETHODCALLTYPE BTCpuThreadInit(); +void STDMETHODCALLTYPE BTCpuThreadTerm(HANDLE Thread, LONG ExitCode); void STDMETHODCALLTYPE* BTCpuGetBopCode(); void STDMETHODCALLTYPE* __wine_get_unix_opcode(); NTSTATUS STDMETHODCALLTYPE BTCpuGetContext(HANDLE Thread, HANDLE Process, void* Unknown, WOW64_CONTEXT* Context); @@ -17,10 +18,14 @@ void STDMETHODCALLTYPE BTCpuSimulate(); NTSTATUS STDMETHODCALLTYPE BTCpuSuspendLocalThread(HANDLE Thread, ULONG* Count); NTSTATUS STDMETHODCALLTYPE BTCpuResetToConsistentState(EXCEPTION_POINTERS* Ptrs); void STDMETHODCALLTYPE BTCpuFlushInstructionCache2(const void* Address, SIZE_T Size); -void STDMETHODCALLTYPE BTCpuNotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot); -void STDMETHODCALLTYPE BTCpuNotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt); -void STDMETHODCALLTYPE BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType); -void STDMETHODCALLTYPE BTCpuNotifyUnmapViewOfSection(void* Address, ULONG Flags); +void STDMETHODCALLTYPE BTCpuFlushInstructionCacheHeavy(const void* Address, SIZE_T Size); +void STDMETHODCALLTYPE BTCpuNotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot, BOOL After, ULONG Status); +void STDMETHODCALLTYPE BTCpuNotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt, BOOL After, ULONG Status); +void STDMETHODCALLTYPE BTCpuNotifyMemoryDirty(void* Address, SIZE_T Size); +void STDMETHODCALLTYPE BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType, BOOL After, ULONG Status); +NTSTATUS STDMETHODCALLTYPE BTCpuNotifyMapViewOfSection(void* Unk1, void* Address, void* Unk2, SIZE_T Size, ULONG AllocType, ULONG Prot); +void STDMETHODCALLTYPE BTCpuNotifyUnmapViewOfSection(void* Address, BOOL After, ULONG Status); +void STDMETHODCALLTYPE BTCpuNotifyReadFile(HANDLE Handle, void* Address, SIZE_T Size, BOOL After, NTSTATUS Status); BOOLEAN STDMETHODCALLTYPE BTCpuIsProcessorFeaturePresent(UINT Feature); -BOOLEAN STDMETHODCALLTYPE BTCpuUpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info); +void STDMETHODCALLTYPE BTCpuUpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info); } diff --git a/Source/Windows/WOW64/Module.cpp b/Source/Windows/WOW64/Module.cpp index 4780dca9b..459358e93 100644 --- a/Source/Windows/WOW64/Module.cpp +++ b/Source/Windows/WOW64/Module.cpp @@ -462,26 +462,27 @@ void BTCpuProcessInit() { } } -NTSTATUS BTCpuThreadInit() { +void BTCpuProcessTerm(HANDLE Handle, BOOL After, ULONG Status) {} + +void BTCpuThreadInit() { FEX::Windows::InitCRTThread(); auto* Thread = CTX->CreateThread(0, 0); GetTLS().ThreadState() = Thread; std::scoped_lock Lock(ThreadCreationMutex); Threads.emplace(GetCurrentThreadId(), Thread); - return STATUS_SUCCESS; } -NTSTATUS BTCpuThreadTerm(HANDLE Thread) { +void BTCpuThreadTerm(HANDLE Thread, LONG ExitCode) { const auto [Err, TLS] = GetThreadTLS(Thread); if (Err) { - return Err; + return; } { THREAD_BASIC_INFORMATION Info; if (NTSTATUS Err = NtQueryInformationThread(Thread, ThreadBasicInformation, &Info, sizeof(Info), nullptr); Err) { - return Err; + return; } const auto ThreadTID = reinterpret_cast(Info.ClientId.UniqueThread); @@ -491,7 +492,6 @@ NTSTATUS BTCpuThreadTerm(HANDLE Thread) { CTX->DestroyThread(TLS.ThreadState()); FEX::Windows::DeinitCRTThread(); - return STATUS_SUCCESS; } void* BTCpuGetBopCode() { @@ -691,17 +691,36 @@ void BTCpuFlushInstructionCache2(const void* Address, SIZE_T Size) { InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast(Address), static_cast(Size), false); } -void BTCpuNotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot) { +void BTCpuFlushInstructionCacheHeavy(const void* Address, SIZE_T Size) { + std::scoped_lock Lock(ThreadCreationMutex); + InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast(Address), static_cast(Size), false); +} + +void BTCpuNotifyMemoryDirty(void* Address, SIZE_T Size) { + std::scoped_lock Lock(ThreadCreationMutex); + InvalidationTracker->InvalidateAlignedInterval(reinterpret_cast(Address), static_cast(Size), false); +} + +void BTCpuNotifyMemoryAlloc(void* Address, SIZE_T Size, ULONG Type, ULONG Prot, BOOL After, ULONG Status) { + if (!After || Status) { + return; + } std::scoped_lock Lock(ThreadCreationMutex); InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast(Address), static_cast(Size), Prot); } -void BTCpuNotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt) { +void BTCpuNotifyMemoryProtect(void* Address, SIZE_T Size, ULONG NewProt, BOOL After, ULONG Status) { + if (!After || Status) { + return; + } std::scoped_lock Lock(ThreadCreationMutex); InvalidationTracker->HandleMemoryProtectionNotification(reinterpret_cast(Address), static_cast(Size), NewProt); } -void BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType) { +void BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType, BOOL After, ULONG Status) { + if (After) { + return; + } std::scoped_lock Lock(ThreadCreationMutex); if (!Size) { InvalidationTracker->InvalidateContainingSection(reinterpret_cast(Address), true); @@ -710,16 +729,25 @@ void BTCpuNotifyMemoryFree(void* Address, SIZE_T Size, ULONG FreeType) { } } -void BTCpuNotifyUnmapViewOfSection(void* Address, ULONG Flags) { +NTSTATUS BTCpuNotifyMapViewOfSection(void* Unk1, void* Address, void* Unk2, SIZE_T Size, ULONG AllocType, ULONG Prot) { + return STATUS_SUCCESS; +} + +void BTCpuNotifyUnmapViewOfSection(void* Address, BOOL After, ULONG Status) { + if (After) { + return; + } + std::scoped_lock Lock(ThreadCreationMutex); InvalidationTracker->InvalidateContainingSection(reinterpret_cast(Address), true); } +void BTCpuNotifyReadFile(HANDLE Handle, void* Address, SIZE_T Size, BOOL After, NTSTATUS Status) {} + BOOLEAN WINAPI BTCpuIsProcessorFeaturePresent(UINT Feature) { return CPUFeatures->IsFeaturePresent(Feature) ? TRUE : FALSE; } -BOOLEAN BTCpuUpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info) { +void BTCpuUpdateProcessorInformation(SYSTEM_CPU_INFORMATION* Info) { CPUFeatures->UpdateInformation(Info); - return TRUE; } diff --git a/Source/Windows/WOW64/libwow64fex.def b/Source/Windows/WOW64/libwow64fex.def index f78953474..d75f22b71 100644 --- a/Source/Windows/WOW64/libwow64fex.def +++ b/Source/Windows/WOW64/libwow64fex.def @@ -2,19 +2,24 @@ LIBRARY libwow64fex.dll EXPORTS BTCpuFlushInstructionCache2 + BTCpuFlushInstructionCacheHeavy BTCpuGetBopCode BTCpuGetContext BTCpuIsProcessorFeaturePresent BTCpuNotifyMemoryAlloc BTCpuNotifyMemoryProtect + BTCpuNotifyMemoryDirty BTCpuNotifyMemoryFree + BTCpuNotifyMapViewOfSection BTCpuNotifyUnmapViewOfSection + BTCpuNotifyReadFile BTCpuProcessInit BTCpuResetToConsistentState BTCpuSetContext BTCpuSimulate BTCpuSuspendLocalThread BTCpuThreadInit + BTCpuProcessTerm BTCpuThreadTerm BTCpuUpdateProcessorInformation __wine_get_unix_opcode