2025-10-02 00:20:28 -06:00
|
|
|
#include "interlockedapi.h"
|
2025-10-05 17:46:16 -06:00
|
|
|
|
2025-10-02 00:20:28 -06:00
|
|
|
#include "common.h"
|
2025-10-05 17:46:16 -06:00
|
|
|
#include "context.h"
|
2025-10-02 00:20:28 -06:00
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
|
|
namespace kernel32 {
|
|
|
|
|
|
2025-10-30 02:23:09 -06:00
|
|
|
LONG WINAPI InterlockedIncrement(LONG volatile *Addend) {
|
2025-10-05 14:32:06 -06:00
|
|
|
HOST_CONTEXT_GUARD();
|
2025-10-02 00:20:28 -06:00
|
|
|
VERBOSE_LOG("InterlockedIncrement(%p)\n", Addend);
|
2025-11-08 01:45:47 -07:00
|
|
|
auto *ptr = const_cast<LONG *>(Addend);
|
|
|
|
|
return __atomic_add_fetch(ptr, 1, __ATOMIC_SEQ_CST);
|
2025-10-02 00:20:28 -06:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 02:23:09 -06:00
|
|
|
LONG WINAPI InterlockedDecrement(LONG volatile *Addend) {
|
2025-10-05 14:32:06 -06:00
|
|
|
HOST_CONTEXT_GUARD();
|
2025-10-02 00:20:28 -06:00
|
|
|
VERBOSE_LOG("InterlockedDecrement(%p)\n", Addend);
|
2025-11-08 01:45:47 -07:00
|
|
|
auto *ptr = const_cast<LONG *>(Addend);
|
|
|
|
|
return __atomic_sub_fetch(ptr, 1, __ATOMIC_SEQ_CST);
|
2025-10-02 00:20:28 -06:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 02:23:09 -06:00
|
|
|
LONG WINAPI InterlockedExchange(LONG volatile *Target, LONG Value) {
|
2025-10-05 14:32:06 -06:00
|
|
|
HOST_CONTEXT_GUARD();
|
2025-10-02 00:20:28 -06:00
|
|
|
VERBOSE_LOG("InterlockedExchange(%p, %ld)\n", Target, static_cast<long>(Value));
|
2025-11-08 01:45:47 -07:00
|
|
|
auto *ptr = const_cast<LONG *>(Target);
|
|
|
|
|
return __atomic_exchange_n(ptr, Value, __ATOMIC_SEQ_CST);
|
2025-10-02 00:20:28 -06:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 02:23:09 -06:00
|
|
|
LONG WINAPI InterlockedCompareExchange(LONG volatile *Destination, LONG Exchange, LONG Comperand) {
|
2025-10-05 14:32:06 -06:00
|
|
|
HOST_CONTEXT_GUARD();
|
2025-10-02 00:20:28 -06:00
|
|
|
VERBOSE_LOG("InterlockedCompareExchange(%p, %ld, %ld)\n", Destination, static_cast<long>(Exchange),
|
|
|
|
|
static_cast<long>(Comperand));
|
2025-10-07 14:12:07 -06:00
|
|
|
|
2025-11-08 01:45:47 -07:00
|
|
|
auto *ptr = const_cast<LONG *>(Destination);
|
2025-10-07 14:12:07 -06:00
|
|
|
LONG expected = Comperand;
|
2025-11-08 01:45:47 -07:00
|
|
|
__atomic_compare_exchange_n(ptr, &expected, Exchange, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
2025-10-07 14:12:07 -06:00
|
|
|
return expected;
|
2025-10-02 00:20:28 -06:00
|
|
|
}
|
|
|
|
|
|
2025-10-30 02:23:09 -06:00
|
|
|
void WINAPI InitializeSListHead(PSLIST_HEADER ListHead) {
|
2025-10-05 14:32:06 -06:00
|
|
|
HOST_CONTEXT_GUARD();
|
2025-10-02 00:20:28 -06:00
|
|
|
DEBUG_LOG("InitializeSListHead(%p)\n", ListHead);
|
|
|
|
|
if (!ListHead) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
std::memset(ListHead, 0, sizeof(*ListHead));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace kernel32
|