MxCreateFreePfns

void __fastcall MxCreateFreePfns(__int64 a1){
  INT64 v1; 
  UINT64 v2; 
  int v3; 
  int v4; 
  __int64 v5; 
  _MMPFN *PfnDb; 
  INT64 v7; 
  __m128i *v8; 
  __int16 v9; 
  _QWORD *v10; 
  unsigned __int64 v11; 
  INT64 v12; 
  BOOL v13; 
  int v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  unsigned int v18; 
  unsigned int i; 
  unsigned __int64 v20; 
  unsigned __int64 v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  INT64 v25; 
  unsigned __int64 v26; 
  unsigned __int8 v27; 
  int v28; 
  unsigned int v29; 
  unsigned int v30; 
  unsigned __int8 CurrentIrql; 
  unsigned __int64 v32; 
  _MMPFN *v33; 
  __m128i *v34; 
  INT64 v35; 
  INT64 v36; 
  INT64 v37; 
  __m128i *v38; 
  __int64 v39; 
  unsigned int v40; 
  INT64 a1a[2]; 
  __int64 v42; 
  INT64 a2[2]; 
  __int128 v44; 
  __int128 v45; 
  int v46; 
  unsigned __int64 v47; 
  unsigned __int8 v48; 
  BOOL v49; 
  UINT64 SpinCount; 
  v1 = *(_QWORD *)(a1 + 24);
  v2 = *(_QWORD *)(a1 + 32);
  v3 = 0;
  *(_OWORD *)a2 = 0i64;
  v44 = 0i64;
  v45 = 0i64;
  if( !v1 )
  {
    if( !--v2 )
      return;
    v1 = 1i64;
  }
  v4 = *(_DWORD *)(a1 + 16);
  if( v4 == 2 || (v5 = 1i64, v4 == 24) )
    v5 = 0i64;
  v39 = v5;
  PfnDb = MmGetPfnDb();
  v49 = v4 != 24;
  v7 = (INT64)PfnDb + 48 * v1;
  v38 = 0i64;
  v8 = 0i64;
  if( !v2 )
    goto LABEL_48;
  do
  {
    if( v5 )
    {
      v9 = *(_WORD *)(v7 + 32);
      if( v9 == 1 )
      {
        v10 = (_QWORD *)(*(_QWORD *)(v7 + 8) | 0x8000000000000000ui64);
        v11 = ZeroPte;
        v12 = (INT64)PfnDb + 48 * (*(_QWORD *)(v7 + 40) & 0xFFFFFFFFFi64);
        v46 = v3;
        v13 = MiPteInShadowRange((UINT64)v10);
        v3 = 0;
        if( v13 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 )
        {
          v14 = v46;
          if( (ZeroPte & 1) != 0 )
            v11 = ZeroPte | 0x8000000000000000ui64;
        }
        else
        {
          v14 = v46;
        }
        *v10 = v11;
        if( v14 )
          MiWritePteShadow();
        v15 = *(_QWORD *)(v12 + 24) ^ ((*(_QWORD *)(v12 + 24) - 1i64) ^ *(_QWORD *)(v12 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
        *(_QWORD *)(v12 + 24) = v15;
        if( (v15 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
        {
          MiFreeEmptyBootPageTable(v12);
          v3 = 0;
        }
        v5 = v39;
        *(_WORD *)(v7 + 32) = v3;
        *(_QWORD *)(v7 + 24) &= 0xC000000000000000ui64;
      }
      else if( v9 )
      {
        goto LABEL_46;
      }
    }
    if( (v1 & 0x1FF) != 0 || v5 || v2 < 0x200 )
    {
      *(_QWORD *)v7 = v8;
      v8 = (__m128i *)v7;
      v38 = (__m128i *)v7;
LABEL_46:
      ++v1;
      v7 += 48i64;
      --v2;
      goto LABEL_47;
    }
    MiRestrictRangeToNode(v1, v2);
    v47 = v16;
    v17 = v16;
    if( v16 < 0x200 )
    {
      *(_QWORD *)v7 = v8;
      ++v1;
      v8 = (__m128i *)v7;
      v38 = (__m128i *)v7;
      v7 += 48i64;
      --v2;
      goto LABEL_44;
    }
    v18 = ((KeFeatureBits >> 37) & 1) == 0;
    v40 = v18;
    for( i = v18; i <= 1; ++i )
    {
      v20 = MiLargePageSizes[i];
      if( v1 != (v1 & ~(v20 - 1)) || v17 < v20 )
        continue;
      v21 = v17;
      if( i == v18 )
      {
        v24 = v17;
      }
      else
      {
        v22 = MiLargePageSizes[i - 1];
        v23 = v22 - (v1 & (v22 - 1));
        if( v23 <= v17 )
          v21 = v23;
        v24 = v21;
      }
      v25 = v21 - v24 % v20;
      LODWORD(v37) = 0;
      LODWORD(v35) = MiDetermineNewPfnHeatState(0i64) == 0;
      MiInitializeAllResidentPageBasePfns((UINT16 *)&MiSystemPartition, v1, v25, i, 1, v35, v37);
      LODWORD(v36) = 0;
      MiCreateInitialLargeLeafPfns(v1, v25, i, 1, 0, v36);
      if( v25 )
      {
        v26 = v47;
        do
        {
          v27 = MiLockPageInline(v7);
          a1a[1] = v49;
          a1a[0] = v1;
          v42 = v27;
          MiInsertLargePageInNodeList((INT64)a1a);
          v26 -= v20;
          v2 -= v20;
          v1 += v20;
          v7 += 48 * v20;
          v25 -= v20;
        }
        while( v25 );
        v47 = v26;
        v18 = v40;
      }
      v17 = v47;
      if( v47 < 0x200 )
        break;
      i = v18 - 1;
    }
    v8 = v38;
LABEL_44:
    v3 = 0;
LABEL_47:
    v5 = v39;
    PfnDb = MmGetPfnDb();
  }
  while( v2 );
LABEL_48:
  v28 = MiDetermineNewPfnHeatState(0i64);
  v30 = v29 | 0x400;
  if( !v28 )
    v30 = v29;
  MiCreatePfnTemplate(v49, (INT64)a2);
  CurrentIrql = KeGetCurrentIrql();
  v48 = CurrentIrql;
  __writecr8(v32);
  if( v8 )
  {
    v33 = MmGetPfnDb();
    do
    {
      v34 = v8;
      v8 = (__m128i *)v8->m128i_i64[0];
      MiCreateInitialPfns(v34, 1i64, (__m128i *)a2);
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64(&v34[1].m128i_i32[2], 0x3Fui64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( v34[1].m128i_i64[1] < 0 );
      }
      MiInsertPageInFreeOrZeroedList(((char *)v34 - (char *)v33) / 48, v30);
      _InterlockedAnd64(&v34[1].m128i_i64[1], 0x7FFFFFFFFFFFFFFFui64);
    }
    while( v8 );
    CurrentIrql = v48;
  }
  __writecr8(CurrentIrql);
}

Referenced by:

MiCreateFreePfns
MiSwitchToPfns
MxReleaseFreeDescriptor