+static
+VOID
+NTAPI
+TestOwnerRes(
+ PVOID Context)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PTHREAD_DATA ThreadData = Context;
+ BOOLEAN Ret;
+
+ KeEnterCriticalRegion();
+ Ret = ThreadData->AcquireResource(ThreadData->Res, ThreadData->Wait);
+ if (ThreadData->RetExpected)
+ ok_bool_true(Ret, "AcquireResource returned");
+ else
+ ok_bool_false(Ret, "AcquireResource returned");
+ KeLeaveCriticalRegion();
+
+ ExReleaseResourceForThreadLite(ThreadData->Res, (ULONG_PTR)ThreadData->Res | 3);
+
+ ok_bool_false(KeSetEvent(&ThreadData->OutEvent, 0, TRUE), "KeSetEvent returned");
+ Status = KeWaitForSingleObject(&ThreadData->InEvent, Executive, KernelMode, FALSE, NULL);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+}
+
+static
+VOID
+TestResourceWithOwner(
+ IN PERESOURCE Res)
+{
+ NTSTATUS Status;
+ THREAD_DATA ThreadDataOwner;
+
+ InitThreadDataEx(&ThreadDataOwner, Res, ExAcquireResourceExclusiveLite, TestOwnerRes);
+
+ KeEnterCriticalRegion();
+ ok_bool_true(ExAcquireResourceExclusiveLite(Res, FALSE), "ExAcquireResourceExclusiveLite returned");
+ ExSetResourceOwnerPointer(Res, (PVOID)((ULONG_PTR)Res | 3));
+ KeLeaveCriticalRegion();
+
+ Status = StartThread(&ThreadDataOwner, NULL, FALSE, FALSE);
+ ok_eq_hex(Status, STATUS_SUCCESS);
+
+ FinishThread(&ThreadDataOwner);
+}
+