MiCreateFreePfns

VOID __fastcall MiCreateFreePfns(_MEMORY_ALLOCATION_DESCRIPTOR *CheckMd){
  _TYPE_OF_MEMORY MemoryType; 
  __int64 v3; 
  unsigned __int64 BasePage; 
  unsigned __int64 PageCount; 
  __int64 *v6; 
  __int64 *v7; 
  _MEMORY_ALLOCATION_DESCRIPTOR *v8; 
  _LIST_ENTRY ListEntry; 
  unsigned int v10; 
  unsigned __int64 v11; 
  __int128 v12; 
  unsigned __int64 v13; 
  __int64 *v14; 
  INT64 *v15; 
  unsigned __int64 v16; 
  INT64 v17; 
  INT64 v18; 
  _LIST_ENTRY v19; 
  __int128 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  _LIST_ENTRY v23; 
  _OWORD v24[2]; 
  __int64 v25; 
  __int64 Base[64]; 
  memset((INT64)Base, 0i64);
  MemoryType = CheckMd->MemoryType;
  v3 = 0i64;
  BasePage = CheckMd->BasePage;
  PageCount = CheckMd->PageCount;
  if( (MemoryType & 0x40000000) != 0 )
  {
    v6 = qword_140D5AD60;
    CheckMd->MemoryType = MemoryType & 0xBFFFFFFF;
  }
  else
  {
    v6 = MxBootFreeDescriptor;
  }
  v7 = &v6[5 * (unsigned __int16)KeNumberNodes];
  if( v6 >= v7 )
    goto LABEL_10;
  do
  {
    if( v6[1] && *v6 >= BasePage && *v6 < PageCount + BasePage )
    {
      Base[v3] = (__int64)v6;
      v3 = (unsigned int)(v3 + 1);
    }
    v6 += 5;
  }
  while( v6 < v7 );
  if( (_DWORD)v3 )
  {
    qsort((WCHAR *)Base, (unsigned int)v3, (const WCHAR *)8, MxDescriptorSort);
    ListEntry = CheckMd->ListEntry;
    v10 = 0;
    v21 = CheckMd->PageCount;
    v11 = v21;
    v12 = *(_OWORD *)&CheckMd->MemoryType;
    v23 = ListEntry;
    v19 = ListEntry;
    v20 = v12;
    v13 = *((_QWORD *)&v12 + 1);
    v14 = Base;
    while( 1 )
    {
      v15 = (INT64 *)*v14;
      v16 = *(_QWORD *)*v14;
      if( v16 > v13 )
      {
        v22 = v16 - v13;
        v25 = v16 - v13;
        v24[0] = ListEntry;
        v24[1] = v12;
        MxCreateFreePfns((__int64)v24);
        v11 -= v22;
        v13 = *v15;
      }
      v17 = v15[1];
      v18 = (unsigned int)CheckMd->MemoryType;
      v11 -= v17;
      v13 += v17;
      v21 = v11;
      *((_QWORD *)&v20 + 1) = v13;
      MxReleaseFreeDescriptor(v15, v18);
      if( !v11 )
        break;
      ++v10;
      ++v14;
      if( v10 >= (unsigned int)v3 )
      {
        v8 = (_MEMORY_ALLOCATION_DESCRIPTOR *)&v19;
        goto LABEL_11;
      }
      v12 = v20;
      ListEntry = v23;
    }
  }
  else
  {
LABEL_10:
    v8 = CheckMd;
LABEL_11:
    MxCreateFreePfns((__int64)v8);
  }
}

Referenced by:

MiSwitchToPfns