MmManagePartitionMemoryInformation

INT64 __stdcall MmManagePartitionMemoryInformation(UINT16 **a1, INT64 a2){
  ULONG_PTR *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; 
  __int64 *v21; 
  char *v22; 
  __int64 v23; 
  __int64 v24; 
  _QWORD *v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  _QWORD a4[2]; 
  INT64 result[5]; 
  __int128 v31; 
  __int128 v32; 
  __int128 v33; 
  __int128 v34; 
  __int128 v35; 
  __int128 v36; 
  __int128 v37; 
  __int128 v38; 
  INT64 a3[3]; 
  char v40; 
  v2 = (ULONG_PTR *)*a1;
  a4[0] = 0i64;
  memset((INT64)result, 0i64);
  if( *(_DWORD *)a2 )
    return 3221225485i64;
  v4 = *(_DWORD *)(a2 + 4);
  if( v4 != -1 && v4 >= (unsigned __int16)KeNumberNodes )
    return 3221225485i64;
  if( *(_DWORD *)(a2 + 8) != -1 )
    return 3221225485i64;
  do
  {
    if( v4 == -1 )
    {
      *(_DWORD *)(a2 + 12) = (unsigned __int16)KeNumberNodes;
      *(_QWORD *)(a2 + 16) = v2[896];
      v5 = 0i64;
      *(_QWORD *)(a2 + 24) = v2[933];
      *(_QWORD *)(a2 + 32) = v2[949];
      *(_QWORD *)(a2 + 40) = v2[776];
      if( v2 == &MiSystemPartition )
        v5 = qword_140C4E390;
      *(_QWORD *)(a2 + 224) = v5;
      MiQueryMemoryListInformation(v2, (UINT64 *)result);
      v6 = v32;
      *(_OWORD *)(a2 + 88) = v31;
      v7 = v33;
      *(_OWORD *)(a2 + 104) = v6;
      v8 = v34;
      *(_OWORD *)(a2 + 120) = v7;
      v9 = v35;
      *(_OWORD *)(a2 + 136) = v8;
      v10 = v36;
      *(_OWORD *)(a2 + 152) = v9;
      v11 = v37;
      *(_OWORD *)(a2 + 168) = v10;
      v12 = v38;
      *(_OWORD *)(a2 + 184) = v11;
      *(_OWORD *)(a2 + 200) = v12;
      *(_QWORD *)(a2 + 216) = v2[777];
      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(a2 + 88, 0i64);
      memset(a2 + 152, 0i64);
      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 )
    {
      v21 = (__int64 *)(v2[2] + 4544i64 * v16 + 4176);
      do
      {
        MiGetChannelInformation((_MI_PARTITION *)v2, v16, (INT64)a3, a4);
        v19 = *(_QWORD *)(a2 + 64);
        v18 = *(_QWORD *)(a2 + 72);
        v17 = *(_QWORD *)(a2 + 80);
        if( (unsigned int)(a4[0] / 0x28ui64) )
        {
          v22 = &v40;
          v23 = (unsigned int)(a4[0] / 0x28ui64);
          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 = *v21;
        v21 += 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) = *(unsigned __int16 *)v2;
  return 0i64;
}

Referenced by:

NtManagePartition
VfUtilGetAvailableSystemPages