MiCreateSystemPageTable

INT64 __fastcall MiCreateSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
  __int64 v3; 
  __int64 v5; 
  INT64 v7; 
  __int16 v8; 
  INT64 v9; 
  int PageTablePages; 
  __int64 v12; 
  _MMPTE *PteBase; 
  int v14; 
  void *v15; 
  void *v16; 
  UINT64 v17; 
  __int64 v18; 
  INT64 v19; 
  v3 = *(_QWORD *)(a1 + 168);
  v18 = 0i64;
  v5 = (int)a3;
  v7 = MI_READ_PTE_LOCK_FREE(a2);
  v19 = v7;
  v8 = v7;
  v9 = v7 & 1;
  if( (v7 & 1) != 0
    && ((v7 & 0x80) != 0
     || (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v19) >> 12) & 0xFFFFFFFFFi64) != *(_QWORD *)&MiState[8 * v5 + 9480]
     && (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v19) >> 12) & 0xFFFFFFFFFi64) != *(_QWORD *)&MiState[8 * v5 + 9448]
     && ((v8 & 0x800) != 0 || (v8 & 0x42) != 0))
    || (*(_DWORD *)(v3 + 64) & 0x80) != 0
    && (unsigned int)MiMakeLargePageTable(a1, (volatile INT64 *)a2, (unsigned int)v5) )
  {
    return 0i64;
  }
  PageTablePages = MiGetPageTablePages(v3, 1ui64, &v18);
  if( PageTablePages < 0 )
  {
    if( PageTablePages == -1073741801
      && (*(_BYTE *)a1 & 2) != 0
      && *(_BYTE *)(a1 + 6) < 2u
      && *((char *)KeGetCurrentThread() + 195) < 16
      && (*(_DWORD *)(v3 + 64) & 0x400) == 0 )
    {
      return 2i64;
    }
    else
    {
      *(_DWORD *)(v3 + 264) = PageTablePages;
      return 4i64;
    }
  }
  else
  {
    ++*(_QWORD *)(v3 + 48);
    v12 = (v18 - (__int64)MmGetPfnDb()) / 48;
    if( (MiFlags & 0x80) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
      MiArePageContentsZero((PVOID)v12);
    PteBase = MmGetPteBase();
    if( v9 )
    {
      if( *((_QWORD *)KeGetCurrentPrcb() + 4160) )
      {
        LODWORD(v15) = MiMapPageInHyperSpaceWorker(v12, 0i64, 0x80000000ui64);
        v16 = v15;
        KeCopyPage(v15);
        MiUnmapPageInHyperSpaceWorker(v16, 0x11u, 0x80000000ui64);
        PteBase = MmGetPteBase();
      }
      else
      {
        MxCopyPage(v12, (PVOID)((__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16));
      }
    }
    MiInitializeSystemPageTable((_MMPTE *)v3, (_MMPFN *)(unsigned int)v5);
    v14 = 3;
    if( (_DWORD)v5 == 3 && *(_DWORD *)(v3 + 56) != 2 )
    {
      v17 = a2;
      do
      {
        v17 = (__int64)((v17 << 25) - ((_QWORD)PteBase << 25)) >> 16;
        --v14;
      }
      while( v14 );
      MiReplicatePteChange((MMPTE *)v17, (MMPTE *)v17);
    }
    if( (int)v5 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
    {
      if( (int)v5 > 1 )
        MiMakeSystemLeavesNonZero(a1, a2, (unsigned int)v5);
      return 0i64;
    }
    if( v9 )
      MiFlushTbList(v3 + 80);
    return 1i64;
  }
}

Referenced by:

No references.