ExpExpandResourceOwnerTable

VOID __stdcall ExpExpandResourceOwnerTable(_ERESOURCE *Resource, _KLOCK_QUEUE_HANDLE *LockHandle){
  _OWNER_ENTRY *OwnerTable; 
  unsigned int TableSize; 
  unsigned __int64 v6; 
  unsigned int v7; 
  VOID **PoolWithTag; 
  _OWNER_ENTRY *v9; 

  OwnerTable = Resource->OwnerTable;
  if( OwnerTable )
  {
    TableSize = OwnerTable->TableSize;
    v7 = TableSize + 4;
    if( TableSize + 4 < TableSize )
      return;
    v6 = 16i64 * v7;
    if( v6 > 0xFFFFFFFF )
      return;
  }
  else
  {
    TableSize = 0;
    LODWORD(v6) = 48;
    v7 = 3;
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
  __writecr8(LockHandle->OldIrql);
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)v6, 1632920914i64);
  v9 = (_OWNER_ENTRY *)PoolWithTag;
  if( PoolWithTag )
  {
    memset(&PoolWithTag[2 * TableSize], 0i64, 16 * (v7 - TableSize));
    KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
    if( OwnerTable == Resource->OwnerTable && (!OwnerTable || TableSize == OwnerTable->_bf_0) )
    {
      memmove(v9, OwnerTable, 16 * TableSize);
      v9->_bf_0 = v7;
      Resource->OwnerTable = v9;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
      __writecr8(LockHandle->OldIrql);
      if( OwnerTable )
        ExFreePoolWithTag(OwnerTable, 0);
      if( !TableSize )
        LOBYTE(TableSize) = 1;
    }
    else
    {
      KeReleaseInStackQueuedSpinLockFromDpcLevel(LockHandle);
      __writecr8(LockHandle->OldIrql);
      ExFreePoolWithTag(v9, 0);
    }
  }
  else
  {
    KeDelayExecutionThread(0, 0, &ExShortTime);
  }
  KeGetCurrentThread()->SchedulerApc.SpareByte0 = TableSize;
  KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
}

Referenced by:

ExpAcquireResourceSharedLite
ExpFindCurrentThread
ExpFindEmptyEntry