ExpExpandResourceOwnerTable

VOID __stdcall ExpExpandResourceOwnerTable(ERESOURCE *Resource, KLOCK_QUEUE_HANDLE *LockHandle){
  _OWNER_ENTRY *OwnerTable; 
  unsigned int TableSize; 
  unsigned __int64 v6; 
  unsigned int v7; 
  UINT8 *PoolWithTag; 
  UINT8 *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 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)v6, 0x61546552ui64);
  v9 = PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)&PoolWithTag[16 * TableSize], 0i64);
    KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
    if( OwnerTable == Resource->OwnerTable && (!OwnerTable || TableSize == OwnerTable->TableSize) )
    {
      memmove(v9, (UINT8 *)OwnerTable, 16i64 * TableSize);
      *((_DWORD *)v9 + 2) = v7;
      Resource->OwnerTable = (_OWNER_ENTRY *)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);
  }
  *((_BYTE *)KeGetCurrentThread() + 649) = TableSize;
  KeAcquireInStackQueuedSpinLock(&Resource->SpinLock, LockHandle);
}

Referenced by:

ExpAcquireResourceSharedLite
ExpFindCurrentThread
ExpFindEmptyEntry