16 *pExEnterCriticalRegionAndAcquireFastMutexUnsafe)(
23 *pExReleaseFastMutexUnsafeAndLeaveCriticalRegion)(
31 #define CheckMutex(Mutex, ExpectedCount, ExpectedOwner, \ 32 ExpectedContention, ExpectedOldIrql, \ 35 ok_eq_long((Mutex)->Count, ExpectedCount); \ 36 ok_eq_pointer((Mutex)->Owner, ExpectedOwner); \ 37 ok_eq_ulong((Mutex)->Contention, ExpectedContention); \ 38 ok_eq_ulong((Mutex)->OldIrql, (ULONG)ExpectedOldIrql); \ 39 ok_bool_false(KeAreApcsDisabled(), "KeAreApcsDisabled returned"); \ 40 ok_irql(ExpectedIrql); \ 51 ok_irql(OriginalIrql);
62 if (!
skip(pExiAcquireFastMutex &&
63 pExiReleaseFastMutex &&
64 pExiTryToAcquireFastMutex,
"No fastcall fast mutex functions\n"))
66 pExiAcquireFastMutex(
Mutex);
70 pExiReleaseFastMutex(
Mutex);
81 if (!
skip(pExEnterCriticalRegionAndAcquireFastMutexUnsafe &&
82 pExReleaseFastMutexUnsafeAndLeaveCriticalRegion,
83 "Shortcut functions not available"))
85 pExEnterCriticalRegionAndAcquireFastMutexUnsafe(
Mutex);
87 pExReleaseFastMutexUnsafeAndLeaveCriticalRegion(
Mutex);
106 Mutex->OldIrql = 0x55555555LU;
122 Mutex->OldIrql = OriginalIrql;
133 ok_irql(OriginalIrql);
static VOID TestFastMutexConcurrent(PFAST_MUTEX Mutex)
static NTSTATUS StartThread(PTHREAD_DATA ThreadData, PLARGE_INTEGER Timeout, KIRQL Irql, BOOLEAN Try, BOOLEAN RetExpected)
BOOLEAN(FASTCALL * PMUTEX_TRY_FUNCTION)(PFAST_MUTEX)
#define KeRaiseIrql(irql, oldIrql)
#define KeLowerIrql(oldIrql)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define OBJ_KERNEL_HANDLE
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
VOID FASTCALL ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex)
static VOID FinishThread(PTHREAD_DATA ThreadData)
#define ok_bool_false(value, desc)
BOOLEAN KmtIsCheckedBuild
#define ok_bool_true(value, desc)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static VOID(FASTCALL *pExEnterCriticalRegionAndAcquireFastMutexUnsafe)(_Inout_ PFAST_MUTEX FastMutex)
VOID KmtSetIrql(IN KIRQL NewIrql)
#define ok_eq_bool(value, expected)
struct THREAD_DATA * PTHREAD_DATA
VOID FASTCALL ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex)
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
#define ObDereferenceObject
BOOLEAN FASTCALL ExTryToAcquireFastMutex(IN PFAST_MUTEX FastMutex)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
PVOID KmtGetSystemRoutineAddress(IN PCWSTR RoutineName)
PMUTEX_TRY_FUNCTION TryAcquire
POBJECT_TYPE PsThreadType
BOOLEAN NTAPI KeAreApcsDisabled(VOID)
static VOID InitThreadData(PTHREAD_DATA ThreadData, PFAST_MUTEX Mutex, PMUTEX_FUNCTION Acquire, PMUTEX_TRY_FUNCTION TryAcquire, PMUTEX_FUNCTION Release)
#define KeInitializeEvent(pEvt, foo, foo2)
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
static BOOLEAN(FASTCALL *pExiTryToAcquireFastMutex)(IN OUT PFAST_MUTEX FastMutex)
static VOID NTAPI AcquireMutexThread(PVOID Parameter)
#define InitializeObjectAttributes(p, n, a, r, s)
#define CheckMutex(Mutex, ExpectedCount, ExpectedOwner, ExpectedContention, ExpectedOldIrql, ExpectedIrql)
#define ok_eq_hex(value, expected)
#define KeGetCurrentThread
VOID NTAPI KeClearEvent(IN PKEVENT Event)
VOID(FASTCALL * PMUTEX_FUNCTION)(PFAST_MUTEX)
static VOID TestFastMutex(PFAST_MUTEX Mutex, KIRQL OriginalIrql)
#define ok_eq_long(value, expected)
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes