ExpResizeBigPageTable

UINT64 __stdcall ExpResizeBigPageTable(POOL_TYPE PoolType, VOID **OldTableForCaller){
  _QWORD *v2; 
  __int32 v3; 
  _QWORD *v4; 
  int *v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  VOID *HeapPages; 
  unsigned __int64 v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  _QWORD *v14; 
  unsigned int v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  int v19; 
  __int64 v20; 
  int v21; 
  INT64 v22; 
  unsigned int v23; 
  __int64 v24; 
  int v25; 
  __int64 v26; 
  int v27; 
  UINT64 result; 
  unsigned __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  __int64 v32; 
  int v33; 
  VOID *v34; 
  INT64 v35; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  _QWORD *v37; 

  v37 = v2;
  *v2 = 0i64;
  v3 = PoolType & 0x20;
  if( (PoolType & 0x20) != 0 )
  {
    v4 = *(_QWORD **)(qword_140C4DB20 + 992);
    v5 = (int *)(qword_140C4DB20 + 864);
    v6 = *(_QWORD *)(qword_140C4DB20 + 1000);
    if( !PoolBigPageTableSize )
      return 0i64;
  }
  else
  {
    v4 = (_QWORD *)PoolBigPageTable;
    v5 = &ExpPoolBigEntriesInUse;
    v6 = PoolBigPageTableSize;
  }
  if( v6 )
  {
    v7 = 2 * v6;
    if( 2 * v6 <= v6 || v7 > 0xAAAAAAAAAAAAAAAi64 )
      return 0i64;
    v8 = 48 * v6;
  }
  else
  {
    v7 = 512i64;
    v8 = 12288i64;
  }
  if( v8 >= v8 + 4095 )
    return 0i64;
  v9 = (v8 + 4095) & 0xFFFFFFFFFFFFF000ui64;
  HeapPages = ExAllocateHeapPages();
  v11 = (unsigned __int64)HeapPages;
  if( !HeapPages )
    return 0i64;
  memset(HeapPages, 0i64, v9);
  v12 = (_QWORD *)v11;
  do
  {
    *v12 = 1i64;
    v12 += 3;
  }
  while( v12 != (_QWORD *)(v11 + 24 * v7) );
  v13 = v4;
  v14 = &v4[3 * v6];
  v15 = v7 - 1;
  if( v4 != v14 )
  {
    do
    {
      if( (*v13 & 1) == 0 )
      {
        v29 = v15 & (((40543 * (unsigned __int64)(unsigned int)(*v13 >> 12)) >> 32) ^ (40543 * (unsigned int)(*v13 >> 12)));
        if( (*(_BYTE *)(v11 + 24 * v29) & 1) == 0 )
        {
          do
          {
            v31 = 0i64;
            if( (int)v29 + 1 <= v15 )
              v31 = (unsigned int)(v29 + 1);
            LODWORD(v29) = v31;
          }
          while( (*(_BYTE *)(v11 + 24 * v31) & 1) == 0 );
          LODWORD(v29) = v31;
        }
        v30 = 3i64 * (unsigned int)v29;
        *(_OWORD *)(v11 + 8 * v30) = *(_OWORD *)v13;
        *(_QWORD *)(v11 + 8 * v30 + 16) = v13[2];
      }
      v13 += 3;
    }
    while( v13 != v14 );
  }
  if( v5 != &ExpPoolBigEntriesInUse )
  {
    if( ExpPoolBigEntriesInUse != PoolBigPageTableSize
      || (unsigned int)ExpResizeBigPageTable(NonPagedPoolNx, (VOID **)1) )
    {
      v16 = PoolBigPageTable;
      v15 = PoolBigPageTableSize - 1;
      goto LABEL_16;
    }
    LODWORD(v34) = ExGetHeapFromVA((PVOID)v11);
    RtlpHpFreeHeap(v34, (VOID *)v11, 0i64);
    return 0i64;
  }
  v16 = v11;
LABEL_16:
  v17 = v15 & (((40543 * (unsigned __int64)(unsigned int)(v11 >> 12)) >> 32) ^ (40543 * (unsigned int)(v11 >> 12)));
  if( (*(_QWORD *)(v16 + 24 * v17) & 1) == 0 )
  {
    do
    {
      v32 = 0i64;
      if( (int)v17 + 1 <= v15 )
        v32 = (unsigned int)(v17 + 1);
      LODWORD(v17) = v32;
    }
    while( (*(_QWORD *)(v16 + 24 * v32) & 1) == 0 );
  }
  v18 = 3i64 * (unsigned int)v17;
  strcpy((char *)(v16 + 8 * v18 + 8), "Pool");
  *(_QWORD *)(v16 + 8 * v18) = v11;
  v19 = (unsigned __int8)*(_DWORD *)(v16 + 8 * v18 + 12) | 0x20000;
  *(_QWORD *)(v16 + 8 * v18 + 16) = v9;
  *(_DWORD *)(v16 + 8 * v18 + 12) = v19;
  _InterlockedIncrement(&ExpPoolBigEntriesInUse);
  if( v3 )
  {
    *(_QWORD *)(qword_140C4DB20 + 992) = v11;
    *(_QWORD *)(qword_140C4DB20 + 1000) = v7;
  }
  else
  {
    PoolBigPageTable = v11;
    PoolBigPageTableSize = v7;
  }
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( PoolHitTag == 1819242320 )
    __debugbreak();
  v20 = (unsigned int)*(&PerfGlobalGroupMask + 1);
  LODWORD(v20) = KeGetPcr()->Prcb.Number;
  v21 = PoolTrackTableMask;
  v22 = PoolTrackTableSize;
  v23 = PoolTrackTableMask & 0x40DEDA5;
  v35 = PoolTrackTableSize;
  v24 = *((_QWORD *)&WheapDeferredInternalLogsEventLock + v20 + 372);
  v25 = PoolTrackTableMask & 0x40DEDA5;
  do
  {
    while( 1 )
    {
      v26 = 56i64 * v23;
      v27 = *(_DWORD *)(v26 + v24);
      if( v27 == 1819242320 )
      {
        _InterlockedIncrement64((volatile signed __int64 *)(v26 + v24 + 16));
        _InterlockedExchangeAdd64((volatile signed __int64 *)(v26 + v24 + 8), v9);
        goto LABEL_24;
      }
      if( v27 )
        break;
      v33 = *(_DWORD *)(v26 + *(&WheapDeferredInternalLogsEventLock + 371));
      if( v33 )
      {
        *(_DWORD *)(v26 + v24) = v33;
      }
      else
      {
        if( v23 == v22 - 1 )
          break;
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&ExpTaggedPoolLock, &LockHandle);
        if( !*(_DWORD *)(v26 + *(&WheapDeferredInternalLogsEventLock + 371)) )
        {
          *(_DWORD *)(v26 + *(&WheapDeferredInternalLogsEventLock + 371)) = 1819242320;
          *(_DWORD *)(v26 + v24) = 1819242320;
        }
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        v22 = v35;
      }
    }
    v23 = v21 & (v23 + 1);
  }
  while( v23 != v25 );
  ExpInsertPoolTrackerExpansion(0x6C6F6F50ui64, v9, NonPagedPoolNx);
LABEL_24:
  if( v4 )
    *v4 = 0i64;
  else
    v4 = 0i64;
  result = 1i64;
  *v37 = v4;
  return result;
}

Referenced by:

ExpAddTagForBigPages
ExpResizeBigPageTable