MiRebuildLargePages

VOID __stdcall MiRebuildLargePages(VOID *Context){
  _MI_NODE_INFORMATION *v1; 
  unsigned __int64 TotalPagesEntireNode; 
  unsigned __int64 v3; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  _MI_PARTITION *v6; 
  unsigned int v7; 
  unsigned __int64 v8; 
  unsigned __int64 v9; 
  unsigned int i; 
  __int64 v11; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 *p_LargePageLock; 
  _BYTE *v14; 
  bool v15; 
  unsigned int v16; 
  unsigned __int64 v17; 
  UINT64 j; 
  __int64 v19; 
  __int64 v20; 
  int v21; 
  unsigned __int64 v22; 
  char v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int8 NextPassDelta; 
  _KLOCK_QUEUE_HANDLE LockQueue[4]; 
  unsigned __int64 NodeNumber; 
  unsigned __int8 LargeSubPagesActive; 
  _MI_PARTITION *Partition; 

  NodeNumber = (unsigned __int64)Context >> 53;
  memset(LockQueue, 0, 24);
  Partition = (_MI_PARTITION *)(16 * ((unsigned __int64)Context | 0xFFE0000000000000ui64));
  v1 = &Partition->Core.NodeInformation[(unsigned __int64)Context >> 53];
  TotalPagesEntireNode = v1->TotalPagesEntireNode;
  LargeSubPagesActive = v1->LargePageRebuildTimer.LargeSubPagesActive;
  v3 = TotalPagesEntireNode / 0xC8;
  if( TotalPagesEntireNode / 0xC8 >= (-(__int64)(LargeSubPagesActive != 0) & 0xFFFFFFFFFFFFE100ui64) + 0x2000 )
  {
    LODWORD(v4) = MiNodeLargeFreeZeroPages(v1, 4ui64, StandbyPageList);
    v5 = v4;
    if( v4 < v3 )
    {
      v7 = MmNumberOfChannels;
      v8 = v3 - v4;
      v9 = 0i64;
      for( i = 0; i < v7; ++i )
      {
        LODWORD(v11) = MiNodeFreeZeroPages(v1, i, 0i64);
        v9 += v11;
      }
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      LockQueue[0].LockQueue.Next = 0i64;
      p_LargePageLock = &v1->LargePageLock;
      LockQueue[0].LockQueue.Lock = &v1->LargePageLock;
      KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, &v1->LargePageLock);
      v14 = KeAbPreAcquire(v1, 0i64, 0i64);
      if( v14 )
        v14[26] |= 1u;
      if( v9 >= v8 )
      {
        v6 = Partition;
      }
      else
      {
        v15 = v5 < 0x400;
        v6 = Partition;
        if( v15 )
        {
          v16 = MmNumberOfChannels;
          v17 = 0i64;
          for( j = 0i64; (unsigned int)j < v16; j = (unsigned int)(v21 + 1) )
          {
            MiGetNodeStandbyPageCount(Partition, (unsigned int)NodeNumber, j);
            v17 = v19 + v20;
          }
          if( TotalPagesEntireNode < 0x5000A )
            v22 = 0x8000i64;
          else
            v22 = TotalPagesEntireNode / 0xA;
          p_LargePageLock = &v1->LargePageLock;
          if( v17 > v22 )
            v9 += (v17 - v22) / 0xC8;
        }
        if( v9 < v8 )
        {
          v23 = 8;
LABEL_28:
          v1->LargePageRebuildTimer.NextPassDelta = v23;
          v1->LargePageRebuildTimer.SecondsLeft = v23;
          v1->LargePageRebuildTimer.RebuildActive = 0;
          KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
          __writecr8(CurrentIrql);
          KeAbPostRelease(v1);
          goto LABEL_4;
        }
      }
      v1->LargePageRebuildTimer.LargeSubPagesActive = 0;
      KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
      __writecr8(CurrentIrql);
      LODWORD(v24) = MiRebuildLargePage(v6, (unsigned int)NodeNumber);
      v25 = v24;
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      LockQueue[0].LockQueue.Next = 0i64;
      LockQueue[0].LockQueue.Lock = p_LargePageLock;
      KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, p_LargePageLock);
      if( v25 )
      {
        v23 = 8;
      }
      else
      {
        if( LargeSubPagesActive )
          v1->LargePageRebuildTimer.LargeSubPagesActive = 1;
        NextPassDelta = v1->LargePageRebuildTimer.NextPassDelta;
        if( NextPassDelta >= 0x80u )
          v23 = -1;
        else
          v23 = 2 * NextPassDelta;
      }
      goto LABEL_28;
    }
  }
  v6 = Partition;
LABEL_4:
  PsDereferencePartition((INT64)v6->Core.PartitionObject);
}

Referenced by:

No references.