ExpFindEmptyEntry

_OWNER_ENTRY *__stdcall ExpFindEmptyEntry(_ERESOURCE *Resource, _KLOCK_QUEUE_HANDLE *LockHandle){
  _OWNER_ENTRY *OwnerTable; 
  _OWNER_ENTRY *result; 

  OwnerTable = Resource->OwnerTable;
  if( OwnerTable )
  {
    result = OwnerTable + 1;
    while( result->OwnerThread )
    {
      if( ++result == &OwnerTable[OwnerTable->TableSize] )
        goto LABEL_5;
    }
    KeGetCurrentThread()->SchedulerApc.SpareByte0 = result - OwnerTable;
  }
  else
  {
LABEL_5:
    ExpExpandResourceOwnerTable(Resource, LockHandle);
    return 0i64;
  }
  return result;
}

Referenced by:

ExAcquireSharedWaitForExclusive
ExpAcquireSharedStarveExclusive