MiScrubNodeLargePages

VOID __stdcall MiScrubNodeLargePages(
        VOID *OpaqueParameter,
        _MI_PARTITION *Partition,
        UINT64 PreferredNode,
        _KEVENT *StopEvent){
  __int64 v4; 
  __int64 *v6; 
  _MI_NODE_INFORMATION *v7; 
  unsigned __int64 v8; 
  _MI_NODE_INFORMATION *v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  int v12; 
  unsigned int NextPageColor; 
  int v14; 
  unsigned int *v15; 
  unsigned int v16; 
  _MI_NODE_INFORMATION *v17; 
  int v18; 
  _MMLISTS i; 
  unsigned int j; 
  int k; 
  _QWORD *v22; 
  unsigned int v23; 
  _QWORD *v24; 
  unsigned int v25; 
  NTSTATUS v26; 
  INT64 v27; 
  INT64 v28; 
  UINT64 *NumberOfPages; 
  int v30; 
  unsigned int v31; 
  unsigned int m; 
  int v33; 
  unsigned __int64 v34; 
  unsigned __int64 v35; 
  unsigned __int64 v36; 
  _MI_NODE_INFORMATION *v37; 
  unsigned int *v38; 
  _KEVENT *v39; 
  _MI_COLOR_BASE ColorBase[4]; 
  INT64 v41[16]; 

  v4 = (unsigned int)PreferredNode;
  v39 = (_KEVENT *)OpaqueParameter;
  *(_OWORD *)ColorBase = 0i64;
  memset(v41, 0i64, sizeof(v41));
  v6 = MiLargePageSizes;
  v7 = &Partition->Core.NodeInformation[v4];
  v8 = 0i64;
  v37 = v7;
  v9 = v7;
  v10 = 3i64;
  do
  {
    v11 = v9->FreeLargePages[0].LargePageFreeCount[0] + v9->FreeLargePages[0].LargePageFreeCount[1];
    if( v11 )
      v8 += *v6 * v11;
    v9 = (_MI_NODE_INFORMATION *)((char *)v9 + 1072);
    ++v6;
    --v10;
  }
  while( v10 );
  v35 = v8;
  if( v8 )
  {
    v12 = 0;
    v34 = 0i64;
    v30 = 0;
    MiInitializePageColorBase(0i64, (unsigned int)(v4 + 1), ColorBase);
    NextPageColor = MiGetNextPageColor((INT64)ColorBase);
    if( MiCreateUltraThreadContext((INT64)v41, NextPageColor, (unsigned int)(v14 + 7)) )
    {
      v15 = (unsigned int *)((char *)&stru_140C4DB30 + 400);
      v16 = 0;
      v38 = (unsigned int *)((char *)&stru_140C4DB30 + 400);
      v17 = v7;
      do
      {
        if( v17->FreeLargePages[0].LargePageFreeCount[0] + v17->FreeLargePages[0].LargePageFreeCount[1] )
        {
          v18 = 0;
          v33 = 0;
          v31 = *v15;
          do
          {
            for( i = FreePageList; ; --i )
            {
              if( i == ZeroedPageList && !v12 )
              {
                _InterlockedIncrement(&Partition->Zeroing.BackgroundZeroingDisabled);
                v30 = 1;
              }
              for( j = 0; j < MmNumberOfChannels; ++j )
              {
                for( k = 0; k <= 3; ++k )
                {
                  LODWORD(v28) = k;
                  LODWORD(v27) = i;
                  LODWORD(v22) = MiGetLargePageListHeadBase((unsigned int)v18, (INT64)v7, v16, j, v27, v28);
                  v23 = v31;
                  v24 = v22;
                  v25 = 0;
                  for( m = 0; v25 < v23; m = v25 )
                  {
                    if( (_QWORD *)*v24 != v24 )
                    {
                      LODWORD(NumberOfPages) = k;
                      v36 = v35 - v34;
                      LODWORD(v28) = j;
                      v26 = MiScrubNodeLargePageList(
                              Partition,
                              (unsigned int)v4,
                              v16,
                              (_MI_MEMORY_HIGHLOW)v18,
                              i,
                              v28,
                              NumberOfPages,
                              &v36,
                              v39);
                      v34 += v36;
                      if( v34 >= v35 || !v26 )
                        goto LABEL_29;
                      v18 = v33;
                      v25 = m;
                      v23 = v31;
                    }
                    ++v25;
                    v24 += 3;
                  }
                  v7 = v37;
                }
              }
              v12 = v30;
              if( i == ZeroedPageList )
                break;
            }
            v33 = ++v18;
          }
          while( v18 <= 1 );
          v15 = v38;
        }
        ++v15;
        ++v16;
        v17 = (_MI_NODE_INFORMATION *)((char *)v17 + 1072);
        v38 = v15;
      }
      while( v16 < 3 );
LABEL_29:
      if( v30 == 1 )
        _InterlockedDecrement(&Partition->Zeroing.BackgroundZeroingDisabled);
      MiDeleteUltraThreadContext((INT64)v41);
    }
  }
}

Referenced by:

MiScrubNode