402{
403
405
408
410
412 Resource->Flag &= ~ResourceOwnedExclusive;
415 Resource->OwnerThreads[1].OwnerCount = 1;
417 return;
418 }
419
422 Resource->OwnerThreads[0].OwnerCount++;
424 return;
425 }
426
428
429 } else {
430
431
433
437 return;
438 }
439
440 if (!(
Resource->NumberOfExclusiveWaiters)) {
441
446
447 return;
448 }
449 }
450
454 }
455
457
459
460
461
465
467
469
471
475
479 ThrdStruct->
Line = 0;
480
482
483 return;
484
485}
#define RESOURCE_SEMAFORE_TAG
Resource semaphore (SharedWaiters)
POWNER_ENTRY DLDpFindCurrentThread(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
PTHREAD_STRUCT DLDAllocFindThread(ULONG ThreadId)
VOID DLDpWaitForResource(IN PERESOURCE Resource, IN DISPATCHER_HEADER *DispatcherObject, IN PTHREAD_STRUCT ThrdStruct)
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID NTAPI KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit)
ERESOURCE_THREAD OwnerThread
ERESOURCE_THREAD ThreadId
PERESOURCE WaitingResource
struct _KSEMAPHORE * PKSEMAPHORE