MiComputeNodeMemory

VOID __fastcall MiComputeNodeMemory(_MI_PARTITION *Partition){
  int v1; 
  _MI_PARTITION *v2; 
  unsigned __int64 v3; 
  _PHYSICAL_MEMORY_DESCRIPTOR *v4; 
  unsigned int *v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  unsigned int *v8; 
  unsigned int v9; 
  __int64 v10; 
  unsigned int v11; 
  volatile INT64 *v12; 
  unsigned int *v13; 
  __int64 v14; 
  _QWORD *v15; 
  __int128 *v16; 
  __int64 v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  PHYSICAL_MEMORY_DESCRIPTOR *v20; 
  unsigned int *v21; 
  unsigned __int64 *p_PageCount; 
  __int64 NumberOfRuns; 
  unsigned __int64 v24; 
  _MMPFN *PfnDb; 
  unsigned __int64 v26; 
  _QWORD *v27; 
  __int16 v28; 
  unsigned int v29; 
  int v30; 
  unsigned int v31; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v33; 
  unsigned __int64 v34; 
  __int128 v36[2]; 
  __int64 v37; 
  v2 = Partition;
  v3 = -1i64;
  v30 = v1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0i64;
  v5 = (unsigned int *)*((_QWORD *)Partition + 4);
  v6 = 0i64;
  v28 = *(_WORD *)Partition;
  if( v5 )
  {
    v7 = *v5;
    v31 = *v5;
    v8 = &v5[4 * v7 + 4];
    if( (_DWORD)v7 )
    {
      v3 = *((_QWORD *)v5 + 2);
      v6 = *(_QWORD *)&v5[4 * (unsigned int)(v7 - 1) + 6] + *(_QWORD *)&v5[4 * (unsigned int)(v7 - 1) + 4] - 1i64;
    }
    *((_QWORD *)Partition + 864) = v3;
    *((_QWORD *)Partition + 865) = v6;
  }
  else
  {
    v8 = 0i64;
    v31 = 0;
    if( !v1 )
    {
      v20 = MiReferencePageRuns((_MI_PARTITION *)&MiSystemPartition, 1ui64);
      v1 = v30;
      v4 = v20;
      v8 = (unsigned int *)&v20->Run[v20->NumberOfRuns];
    }
  }
  v9 = 0;
  v10 = *((_QWORD *)v2 + 2);
  if( KeNumberNodes )
  {
    v11 = v31;
    v12 = (volatile INT64 *)(v10 + 4296);
    do
    {
      memset(v36, 0, sizeof(v36));
      if( v1 )
      {
        if( v11 )
        {
          v13 = v8 + 1;
          v14 = v11;
          v15 = v5 + 6;
          do
          {
            if( *(v13 - 1) == v9 )
              *((_QWORD *)v36 + *v13) += *v15;
            v15 += 2;
            v13 += 2;
            --v14;
          }
          while( v14 );
        }
      }
      else if( v4->NumberOfRuns )
      {
        v21 = v8;
        p_PageCount = &v4->Run[0].PageCount;
        NumberOfRuns = v4->NumberOfRuns;
        do
        {
          if( *v21 == v9 )
          {
            v24 = *(p_PageCount - 1);
            PfnDb = MmGetPfnDb();
            v26 = *p_PageCount;
            if( *p_PageCount )
            {
              v29 = v21[1];
              v27 = (_QWORD *)((char *)PfnDb + 48 * v24 + 40);
              do
              {
                v34 = v3;
                v33 = v3;
                if( ((*v27 >> 39) & 0x3FF) == v28 )
                {
                  ++*((_QWORD *)v36 + v29);
                  v3 = v24;
                  if( v33 <= v24 )
                    v3 = v34;
                  if( v6 < v24 )
                    v6 = v24;
                }
                ++v24;
                v27 += 6;
                --v26;
              }
              while( v26 );
            }
          }
          v21 += 2;
          p_PageCount += 2;
          --NumberOfRuns;
        }
        while( NumberOfRuns );
        v11 = v31;
      }
      --*((_WORD *)CurrentThread + 243);
      ExAcquirePushLockExclusiveEx((UINT64)v12, 0i64);
      if( MmNumberOfChannels )
      {
        v16 = v36;
        v17 = 0i64;
        v18 = (unsigned int)MmNumberOfChannels;
        do
        {
          v17 += *(_QWORD *)v16;
          *(_QWORD *)((char *)v16 + (char *)v12 - (char *)&v37 - 120) = *(_QWORD *)v16;
          v16 = (__int128 *)((char *)v16 + 8);
          --v18;
        }
        while( v18 );
      }
      else
      {
        v17 = 0i64;
      }
      *((_QWORD *)v12 - 15) = v17;
      if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v12);
      KeAbPostRelease((PVOID)v12);
      KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
      v12 += 568;
      v1 = v30;
      ++v9;
    }
    while( v9 < (unsigned __int16)KeNumberNodes );
    v2 = Partition;
  }
  *((_QWORD *)v2 + 865) = v6;
  v19 = 0i64;
  if( v3 <= v6 )
    v19 = v3;
  *((_QWORD *)v2 + 864) = v19;
  if( v4 )
    MiDereferencePageRuns(v4);
}

Referenced by:

MiAddPhysicalMemory
MiInitNucleus
MiRemovePhysicalMemory
MiUpdatePartitionMemory