ExpAllocateHandleTableEntrySlow

UINT8 __stdcall ExpAllocateHandleTableEntrySlow(_HANDLE_TABLE *HandleTable, _HANDLE_TABLE_FREE_LIST *FreeList){
  volatile unsigned __int64 TableCode; 
  _EXHANDLE NextHandleNeedingPool; 
  char v6; 
  unsigned __int64 v7; 
  int v8; 
  __int64 v9; 
  _HANDLE_TABLE_ENTRY *LowLevelTable; 
  _HANDLE_TABLE_ENTRY **v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned __int64 TablePagedPool; 
  _HANDLE_TABLE_ENTRY **v17; 
  _HANDLE_TABLE_ENTRY **v18; 
  _HANDLE_TABLE_ENTRY *NewLowLevel; 

  TableCode = HandleTable->TableCode;
  NewLowLevel = 0i64;
  NextHandleNeedingPool = (_EXHANDLE)HandleTable->NextHandleNeedingPool;
  v6 = TableCode;
  v7 = TableCode & 0xFFFFFFFFFFFFFFFCui64;
  v8 = v6 & 3;
  if( !v8 )
  {
    v12 = ExpAllocateMidLevelTable(HandleTable, &NewLowLevel, (_EXHANDLE)HandleTable->NextHandleNeedingPool);
    if( !v12 )
      return 0;
    v12[1] = *v12;
    *v12 = (_HANDLE_TABLE_ENTRY *)v7;
    _InterlockedExchange64((volatile __int64 *)&HandleTable->TableCode, (unsigned __int64)v12 | 1);
    goto LABEL_9;
  }
  if( v8 != 1 )
  {
    v13 = (unsigned __int32)NextHandleNeedingPool._bf_0 >> 19;
    if( (unsigned int)v13 >= 0x80 )
      return 0;
    v14 = *(_QWORD *)(v7 + 8 * v13);
    v15 = (unsigned int)v13;
    if( v14 )
    {
      LowLevelTable = ExpAllocateLowLevelTable(HandleTable, (_EXHANDLE)HandleTable->NextHandleNeedingPool);
      NewLowLevel = LowLevelTable;
      if( LowLevelTable )
      {
        *(_QWORD *)(v14 + 8 * ((NextHandleNeedingPool.Value >> 10) & 0x1FF)) = LowLevelTable;
        goto LABEL_6;
      }
      return 0;
    }
    v18 = ExpAllocateMidLevelTable(HandleTable, &NewLowLevel, (_EXHANDLE)HandleTable->NextHandleNeedingPool);
    if( !v18 )
      return 0;
    *(_QWORD *)(v7 + 8 * v15) = v18;
LABEL_9:
    LowLevelTable = NewLowLevel;
    goto LABEL_6;
  }
  v9 = (unsigned __int32)NextHandleNeedingPool._bf_0 >> 10;
  if( (unsigned int)v9 >= 0x200 )
  {
    TablePagedPool = (unsigned __int64)ExpAllocateTablePagedPool(HandleTable->QuotaProcess, 0x400ui64);
    if( !TablePagedPool )
      return 0;
    v17 = ExpAllocateMidLevelTable(HandleTable, &NewLowLevel, NextHandleNeedingPool);
    if( !v17 )
    {
      ExpFreeTablePagedPool((ULONG_PTR)HandleTable->QuotaProcess, (VOID *)TablePagedPool, 0x400u);
      return 0;
    }
    *(_QWORD *)TablePagedPool = v7;
    *(_QWORD *)(TablePagedPool + 8) = v17;
    _InterlockedExchange64((volatile __int64 *)&HandleTable->TableCode, TablePagedPool | 2);
    goto LABEL_9;
  }
  LowLevelTable = ExpAllocateLowLevelTable(HandleTable, (_EXHANDLE)(unsigned int)NextHandleNeedingPool._bf_0);
  NewLowLevel = LowLevelTable;
  if( LowLevelTable )
  {
    *(_QWORD *)(v7 + 8 * v9) = LowLevelTable;
LABEL_6:
    ExpInsertLowLevelTableIntoFreeList(HandleTable, LowLevelTable, FreeList, FreeList != 0i64);
    return 1;
  }
  return 0;
}

Referenced by:

ExDupHandleTable
ExpAllocateHandleTableEntry
ObpCreateHandle