- /* Release lock and let someone else have it */
- ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
- KeReleaseSemaphore(Resource->SharedWaiters, 0, Count, FALSE);
- return;
- }
- else if (IsExclusiveWaiting(Resource))
- {
- /* Give exclusive access */
- Resource->OwnerThreads[0].OwnerThread = 1;
- Resource->OwnerThreads[0].OwnerCount = 1;
- Resource->ActiveCount = 1;
- Resource->NumberOfExclusiveWaiters--;
+ /* Release lock and let someone else have it */
+ ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+ KeReleaseSemaphore(Resource->SharedWaiters, 0, Count, FALSE);
+ return;
+ }
+ else if (IsExclusiveWaiting(Resource))
+ {
+ /* Give exclusive access */
+ Resource->OwnerThreads[0].OwnerThread = 1;
+ Resource->OwnerThreads[0].OwnerCount = 1;
+ Resource->ActiveCount = 1;
+ Resource->NumberOfExclusiveWaiters--;
+
+ /* Release the lock and give it away */
+ ExReleaseResourceLock(&Resource->SpinLock, OldIrql);
+ KeSetEventBoostPriority(Resource->ExclusiveWaiters,
+ (PKTHREAD*)
+ &Resource->OwnerThreads[0].OwnerThread);
+ return;
+ }