RtlExpandHashTable

INT8 __fastcall RtlExpandHashTable(INT64 a1){
  int v1; 
  unsigned int v3; 
  unsigned int v4; 
  __int64 v5; 
  _QWORD *v6; 
  UINT64 v7; 
  _LIST_ENTRY *ChainHead; 
  _LIST_ENTRY *v9; 
  __int64 v10; 
  _LIST_ENTRY *v11; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v13; 
  int v14; 
  _LIST_ENTRY *v15; 
  _LIST_ENTRY *Blink; 
  _LIST_ENTRY *v17; 
  int v18; 
  _LIST_ENTRY *SecondLevelDir; 
  VOID *v21; 
  VOID **PoolWithTag; 
  VOID **v23; 

  v1 = *(_DWORD *)(a1 + 8);
  if( v1 == 8388480 || *(_DWORD *)(a1 + 28) )
    return 0;
  _BitScanReverse(&v3, v1 + 128);
  v4 = (v1 + 128) ^ (1 << v3);
  v5 = v3 - 7;
  if( v1 == 128 )
  {
    v21 = *(VOID **)(a1 + 32);
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x80ui64, 1650545736i64);
    v23 = PoolWithTag;
    if( !PoolWithTag )
      return 0;
    memset(PoolWithTag + 1, 0i64, 0x78u);
    *v23 = v21;
    *(_QWORD *)(a1 + 32) = v23;
  }
  v6 = *(_QWORD **)(a1 + 32);
  if( !v6[v5] )
  {
    SecondLevelDir = RtlpAllocateSecondLevelDir((unsigned int)v5);
    if( SecondLevelDir )
    {
      v6[v5] = SecondLevelDir;
      goto LABEL_5;
    }
    if( *(_DWORD *)(a1 + 8) == 128 )
    {
      *(_QWORD *)(a1 + 32) = *v6;
      ExFreePoolWithTag(v6, 0);
    }
    return 0;
  }
LABEL_5:
  v7 = *(unsigned int *)(a1 + 12);
  ++*(_DWORD *)(a1 + 8);
  ChainHead = RtlpGetChainHead((_RTL_DYNAMIC_HASH_TABLE *)a1, v7);
  ++*(_DWORD *)(a1 + 12);
  v9 = ChainHead;
  v11 = (_LIST_ENTRY *)(v10 + 16i64 * v4);
  v11->Blink = v11;
  v11->Flink = v11;
  Flink = ChainHead->Flink;
  if( ChainHead->Flink != ChainHead )
  {
    v13 = ChainHead;
    do
    {
      v14 = LODWORD(Flink[1].Flink) >> *(_DWORD *)(a1 + 4);
      if( (((2 * *(_DWORD *)(a1 + 16)) | 1) & ((69069 * v14 + 1) & 0xFFFF0000 | ((unsigned int)(1103515245 * v14 + 12345) >> 16))) == *(_DWORD *)(a1 + 8) - 1 )
      {
        v15 = Flink->Flink;
        if( Flink->Flink->Blink != Flink
          || (Blink = Flink->Blink, Blink->Flink != Flink)
          || (Blink->Flink = v15, v15->Blink = Blink, v17 = v11->Blink, v17->Flink != v11) )
        {
          __fastfail(3u);
        }
        Flink->Flink = v11;
        Flink->Blink = v17;
        v17->Flink = Flink;
        v11->Blink = Flink;
      }
      else
      {
        v13 = Flink;
      }
      Flink = v13->Flink;
    }
    while( v13->Flink != v9 );
    if( v11->Flink != v11 )
      ++*(_DWORD *)(a1 + 24);
    if( v9->Flink == v9 )
      --*(_DWORD *)(a1 + 24);
  }
  v18 = *(_DWORD *)(a1 + 16);
  if( *(_DWORD *)(a1 + 12) == v18 + 1 )
  {
    *(_DWORD *)(a1 + 12) = 0;
    *(_DWORD *)(a1 + 16) = (2 * v18) | 1;
  }
  return 1;
}

Referenced by:

No references.