MmManagePartitionMemoryInformation

NTSTATUS __stdcall MmManagePartitionMemoryInformation(UINT16 **a1, INT64 a2){
  _MI_PARTITION *v2; 
  unsigned int v4; 
  __int64 v5; 
  __int128 v6; 
  __int128 v7; 
  __int128 v8; 
  __int128 v9; 
  __int128 v10; 
  __int128 v11; 
  __int128 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  unsigned __int64 *p_TotalPagesEntireNode; 
  char *v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  _QWORD *v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  unsigned __int64 v29; 
  unsigned __int64 v30[22]; 
  char v31[24]; 
  char v32; 

  v2 = (_MI_PARTITION *)*a1;
  v29 = 0i64;
  memset(v30, 0i64, sizeof(v30));
  if( *(_DWORD *)a2 )
    return -1073741811;
  v4 = *(_DWORD *)(a2 + 4);
  if( v4 != -1 && v4 >= (unsigned __int16)KeNumberNodes )
    return -1073741811;
  if( *(_DWORD *)(a2 + 8) != -1 )
    return -1073741811;
  do
  {
    if( v4 == -1 )
    {
      *(_DWORD *)(a2 + 12) = (unsigned __int16)KeNumberNodes;
      *(_QWORD *)(a2 + 16) = v2->Vp.ResidentAvailablePages;
      v5 = 0i64;
      *(_QWORD *)(a2 + 24) = v2->Vp.TotalCommittedPages;
      *(_QWORD *)(a2 + 32) = v2->Vp.TotalCommitLimit;
      *(_QWORD *)(a2 + 40) = v2->Commit.PeakCommitment;
      if( v2 == &Irp )
        v5 = *(&stru_140C4DB30 + 268);
      *(_QWORD *)(a2 + 224) = v5;
      MiQueryMemoryListInformation(v2, v30);
      v6 = *(_OWORD *)&v30[7];
      *(_OWORD *)(a2 + 88) = *(_OWORD *)&v30[5];
      v7 = *(_OWORD *)&v30[9];
      *(_OWORD *)(a2 + 104) = v6;
      v8 = *(_OWORD *)&v30[11];
      *(_OWORD *)(a2 + 120) = v7;
      v9 = *(_OWORD *)&v30[13];
      *(_OWORD *)(a2 + 136) = v8;
      v10 = *(_OWORD *)&v30[15];
      *(_OWORD *)(a2 + 152) = v9;
      v11 = *(_OWORD *)&v30[17];
      *(_OWORD *)(a2 + 168) = v10;
      v12 = *(_OWORD *)&v30[19];
      *(_OWORD *)(a2 + 184) = v11;
      *(_OWORD *)(a2 + 200) = v12;
      *(_QWORD *)(a2 + 216) = v2->Commit.TotalCommitLimitMaximum;
      v13 = *(_QWORD *)(a2 + 32);
      if( v13 > *(_QWORD *)(a2 + 216) )
        *(_QWORD *)(a2 + 216) = v13;
      v14 = *(_QWORD *)(a2 + 24);
      if( *(_QWORD *)(a2 + 40) < v14 )
        *(_QWORD *)(a2 + 40) = v14;
      if( v14 > v13 )
        *(_QWORD *)(a2 + 24) = v13;
      v15 = (unsigned __int16)KeNumberNodes;
      v16 = 0;
    }
    else
    {
      *(_DWORD *)(a2 + 12) = 0;
      *(_QWORD *)(a2 + 16) = 0i64;
      *(_QWORD *)(a2 + 24) = 0i64;
      *(_QWORD *)(a2 + 32) = 0i64;
      *(_QWORD *)(a2 + 40) = 0i64;
      *(_QWORD *)(a2 + 216) = 0i64;
      *(_QWORD *)(a2 + 224) = 0i64;
      memset((VOID *)(a2 + 88), 0i64, 0x40u);
      memset((VOID *)(a2 + 152), 0i64, 0x40u);
      v16 = *(_DWORD *)(a2 + 4);
      v15 = v16 + 1;
    }
    v17 = 0i64;
    *(_QWORD *)(a2 + 64) = 0i64;
    v18 = 0i64;
    *(_QWORD *)(a2 + 72) = 0i64;
    v19 = 0i64;
    *(_QWORD *)(a2 + 80) = 0i64;
    v20 = 0i64;
    *(_QWORD *)(a2 + 48) = 0i64;
    if( v16 < v15 )
    {
      p_TotalPagesEntireNode = &v2->Core.NodeInformation[v16].TotalPagesEntireNode;
      do
      {
        MiGetChannelInformation(v2, v16, (__int64)v31, &v29);
        v19 = *(_QWORD *)(a2 + 64);
        v18 = *(_QWORD *)(a2 + 72);
        v17 = *(_QWORD *)(a2 + 80);
        if( (unsigned int)(v29 / 0x28) )
        {
          v22 = &v32;
          v23 = (unsigned int)(v29 / 0x28);
          do
          {
            v19 += *((_QWORD *)v22 - 1);
            v18 += *(_QWORD *)v22;
            v17 += *((_QWORD *)v22 + 1);
            v22 += 40;
            --v23;
          }
          while( v23 );
        }
        *(_QWORD *)(a2 + 64) = v19;
        ++v16;
        *(_QWORD *)(a2 + 72) = v18;
        *(_QWORD *)(a2 + 80) = v17;
        v24 = *p_TotalPagesEntireNode;
        p_TotalPagesEntireNode += 568;
        v20 = *(_QWORD *)(a2 + 48) + v24;
        *(_QWORD *)(a2 + 48) = v20;
      }
      while( v16 < v15 );
    }
    v4 = *(_DWORD *)(a2 + 4);
    if( v4 == -1 )
    {
      *(_QWORD *)(a2 + 80) = 0i64;
      v17 = 0i64;
      v25 = (_QWORD *)(a2 + 88);
      v26 = 8i64;
      do
      {
        v17 += *v25++;
        *(_QWORD *)(a2 + 80) = v17;
        --v26;
      }
      while( v26 );
      v18 = *(_QWORD *)(a2 + 72);
      v19 = *(_QWORD *)(a2 + 64);
      v20 = *(_QWORD *)(a2 + 48);
    }
    v27 = v17 + v19 + v18;
    *(_QWORD *)(a2 + 56) = v27;
  }
  while( v27 > v20 );
  *(_DWORD *)(a2 + 232) = v2->Core.PartitionId;
  return 0;
}

Referenced by:

NtManagePartition
VfNotifyDifPlugins
VfUtilGetAvailableSystemPages