From 410c66ce5c1eb97cd5d1153df554940b2511b6ac Mon Sep 17 00:00:00 2001 From: PatrickvL Date: Fri, 9 Feb 2018 17:51:34 +0100 Subject: [PATCH] Kernel : Implemented ExInterlockedAddLargeStatistic and ExInterlockedCompareExchange64 (this one also needed a signature fix : Lock-argument isn't present on Xbox) --- import/OpenXDK/include/xboxkrnl/ex.h | 3 +-- src/CxbxKrnl/EmuKrnlEx.cpp | 15 +++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/import/OpenXDK/include/xboxkrnl/ex.h b/import/OpenXDK/include/xboxkrnl/ex.h index 450c2199d..2be00ad40 100644 --- a/import/OpenXDK/include/xboxkrnl/ex.h +++ b/import/OpenXDK/include/xboxkrnl/ex.h @@ -89,8 +89,7 @@ XBSYSAPI EXPORTNUM(21) LONGLONG FASTCALL ExInterlockedCompareExchange64 ( IN OUT PLONGLONG Destination, IN PLONGLONG Exchange, - IN PLONGLONG Comparand, - IN PKSPIN_LOCK Lock + IN PLONGLONG Comparand ); XBSYSAPI EXPORTNUM(22) OBJECT_TYPE ExMutantObjectType; diff --git a/src/CxbxKrnl/EmuKrnlEx.cpp b/src/CxbxKrnl/EmuKrnlEx.cpp index b8e7fed0c..aa16c7330 100644 --- a/src/CxbxKrnl/EmuKrnlEx.cpp +++ b/src/CxbxKrnl/EmuKrnlEx.cpp @@ -59,6 +59,7 @@ namespace NtDll #include "Emu.h" // For EmuWarning() #include "EmuKrnl.h" // For InsertHeadList, InsertTailList, RemoveHeadList +#include // for std::atomic #pragma warning(disable:4005) // Ignore redefined status values #include // For STATUS_BUFFER_TOO_SMALL #pragma warning(default:4005) @@ -235,7 +236,8 @@ XBSYSAPI EXPORTNUM(20) xboxkrnl::VOID FASTCALL xboxkrnl::ExInterlockedAddLargeSt LOG_FUNC_ARG(Increment) LOG_FUNC_END; - LOG_UNIMPLEMENTED(); + auto &Target = std::atomic(Addend->QuadPart); + Target.fetch_add(Increment); } // ****************************************************************** @@ -246,20 +248,21 @@ XBSYSAPI EXPORTNUM(21) xboxkrnl::LONGLONG FASTCALL xboxkrnl::ExInterlockedCompar ( IN OUT PLONGLONG Destination, IN PLONGLONG Exchange, - IN PLONGLONG Comparand, - IN PKSPIN_LOCK Lock + IN PLONGLONG Comparand ) { LOG_FUNC_BEGIN LOG_FUNC_ARG_OUT(Destination) LOG_FUNC_ARG(Exchange) LOG_FUNC_ARG(Comparand) - LOG_FUNC_ARG(Lock) LOG_FUNC_END; - LOG_UNIMPLEMENTED(); + auto &Target = std::atomic(*Destination); - RETURN(0); + LONGLONG Result = *Comparand; + Target.compare_exchange_strong(Result, *Exchange); + + RETURN(Result); } // ******************************************************************