MiSwitchToPfns

VOID __fastcall MiSwitchToPfns(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  ULONG_PTR v2; 
  char *v3; 
  char *v4; 
  _MMPFN *PfnDb; 
  unsigned __int64 v6; 
  __int64 v7; 
  int v8; 
  unsigned __int64 v9; 
  __int64 v10; 
  __m128i *v11; 
  _MMPFN *v12; 
  unsigned __int128 v13; 
  __int64 v14; 
  INT64 v15; 
  INT64 v16; 
  UINT64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  char v20; 
  _QWORD *v21; 
  __int128 v22; 
  __int128 v23; 
  INT64 v24; 
  char *v25; 
  char *v26; 
  v24 = 0i64;
  v22 = 0i64;
  v23 = 0i64;
  v2 = MmPfnDatabase + 48 * qword_140C525C0;
  if( !qword_140C525C0 && !*(_WORD *)(v2 + 32) )
  {
    v18 = (unsigned __int8)MiLockPageInline(MmPfnDatabase + 48 * qword_140C525C0);
    *(_QWORD *)(v2 + 40) &= 0xFFFFFFF000000000ui64;
    v19 = *(_QWORD *)(v2 + 24);
    *(_QWORD *)(v2 + 8) = MmGetPteBase();
    *(_WORD *)(v2 + 32) = 0;
    v20 = *(_BYTE *)(v2 + 34) & 0xFD;
    *(_QWORD *)(v2 + 24) = v19 & 0xC000000000000000ui64 | 1;
    *(_BYTE *)(v2 + 34) = v20 | 5;
    *(_BYTE *)(v2 + 34) = *(_BYTE *)(v2 + 34) & 0x3F | 0x40;
    *(_QWORD *)(v2 + 40) |= 0x4000000000000ui64;
    _InterlockedAnd64((volatile signed __int64 *)(v2 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v18);
  }
  v3 = (char *)LoaderBlock + 32;
  v4 = (char *)*((_QWORD *)LoaderBlock + 4);
  v25 = (char *)LoaderBlock + 32;
  v26 = v4;
  if( v4 != (char *)LoaderBlock + 32 )
  {
    PfnDb = MmGetPfnDb();
    do
    {
      v6 = *((int *)v4 + 4);
      v7 = *((_QWORD *)v4 + 4);
      if( (v6 & 0x80000000) != 0i64 )
      {
        *((_DWORD *)v4 + 4) = v6 & 0x7FFFFFFF;
        goto LABEL_26;
      }
      if( (v6 & 0x40000000) != 0
        || (unsigned int)v6 <= 0x18 && (v8 = 16777524, _bittest(&v8, v6))
        || (_DWORD)v6 == 29 && (MiFlags & 0x2000) == 0 )
      {
        MiCreateFreePfns((_MEMORY_ALLOCATION_DESCRIPTOR *)v4);
        goto LABEL_26;
      }
      v9 = *((_QWORD *)v4 + 3);
      if( !v9 )
      {
        if( !--v7 )
          goto LABEL_26;
        v9 = 1i64;
      }
      if( (unsigned int)v6 <= 0x22 )
      {
        v10 = 0x5C0800040i64;
        if( _bittest64(&v10, v6) )
          goto LABEL_25;
      }
      if( (_DWORD)v6 == 3 )
      {
LABEL_48:
        if( v9 <= HighestPhysicalPage && v9 + v7 > HighestPhysicalPage + 1 )
          *((_QWORD *)v4 + 4) = HighestPhysicalPage - v9 + 1;
        goto LABEL_26;
      }
      if( (_DWORD)v6 == 22 || (unsigned int)(v6 - 38) <= 2 )
        goto LABEL_25;
      v11 = (__m128i *)((char *)PfnDb + 48 * v9);
      if( !v7 )
        goto LABEL_24;
      v12 = MmGetPfnDb();
      do
      {
        v13 = RtlCompareMemoryUlong(v11, 48 * v7, 0) * (unsigned __int128)0xAAAAAAAAAAAAAAABui64;
        if( !(*((_QWORD *)&v13 + 1) >> 5) )
        {
          if( (_DWORD)v6 != 29 && (_DWORD)v6 != 36 )
            goto LABEL_21;
          v21 = (_QWORD *)v11->m128i_i64[1];
          if( (_DWORD)v6 == 29 )
          {
            if( v21 )
            {
              *v21 = 0i64;
              v11->m128i_i64[1] = 0i64;
              v21 = 0i64;
              goto LABEL_45;
            }
LABEL_47:
            MiInitializeUnusablePfns(v11, 1i64, 0, 0x80ui64, 0i64, 0i64, 0);
          }
          else
          {
LABEL_45:
            if( !v21 )
              goto LABEL_47;
            MiMarkPfnVerified((UINT64)v11, 0);
          }
LABEL_21:
          --v7;
          v14 = 48i64;
          goto LABEL_22;
        }
        v9 = ((char *)v11 - (char *)v12) / 48;
        MiRestrictRangeToNode(v9, *((_QWORD *)&v13 + 1) >> 5);
        v16 = v15;
        if( (((_DWORD)v6 - 9) & 0xFFFFFFFD) != 0 )
        {
          if( (_DWORD)v6 == 29 || (v17 = 64i64, (_DWORD)v6 == 36) )
            v17 = 128i64;
          MiInitializeUnusablePfns(v11, v15, 0, v17, 0i64, 0i64, 0);
        }
        else
        {
          LODWORD(v23) = 2;
          *((_QWORD *)&v23 + 1) = ((char *)v11 - (char *)v12) / 48;
          v24 = v15;
          MxCreateFreePfns((__int64)&v22);
        }
        v7 -= v16;
        v14 = 48 * v16;
LABEL_22:
        v11 = (__m128i *)((char *)v11 + v14);
      }
      while( v7 );
      v4 = v26;
      PfnDb = MmGetPfnDb();
LABEL_24:
      v3 = v25;
LABEL_25:
      if( (_DWORD)v6 == 3 )
        goto LABEL_48;
LABEL_26:
      v4 = *(char **)v4;
      v26 = v4;
    }
    while( v4 != v3 );
  }
  KeFlushTb(3i64, 2u);
  MiFlags |= 0x8000000u;
}

Referenced by:

MiInitNucleus