MiCreateSystemPageTable

NTSTATUS __stdcall MiCreateSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
  __int64 v3; 
  __int64 v5; 
  INT64 v7; 
  _MI_SYSTEM_VA_TYPE v8; 
  __int16 v9; 
  INT64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  int v14; 
  __int64 v15; 
  _MMPTE *PteBase; 
  int v17; 
  void *v18; 
  UINT64 v19; 
  UINT64 PageTableCount; 
  INT64 v21; 

  v3 = *(_QWORD *)(a1 + 168);
  PageTableCount = 0i64;
  v5 = (int)a3;
  LODWORD(v7) = MI_READ_PTE_LOCK_FREE(a2);
  v21 = v7;
  v9 = v7;
  v10 = v7 & 1;
  if( (v7 & 1) != 0 )
  {
    if( (v7 & 0x80) != 0 )
      return 0;
    LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)&v21);
    if( ((v11 >> 12) & 0xFFFFFFFFFi64) != MiState[v5 + 1185] )
    {
      LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)&v21);
      if( ((v12 >> 12) & 0xFFFFFFFFFi64) != MiState[v5 + 1181] && ((v9 & 0x800) != 0 || (v9 & 0x42) != 0) )
        return 0;
    }
  }
  if( (*(_DWORD *)(v3 + 64) & 0x80) != 0 && MiMakeLargePageTable(a1, (INT64 *)a2, (unsigned int)v5) )
    return 0;
  MiGetPageTablePages((_MI_ZERO_PAGE_TABLE_CREATION *)v3, (VOID *)1, (UINT64)&PageTableCount, v8);
  if( v14 < 0 )
  {
    if( v14 == -1073741801
      && (*(_BYTE *)a1 & 2) != 0
      && *(_BYTE *)(a1 + 6) < 2u
      && KeGetCurrentThread()->Priority < 16
      && (*(_DWORD *)(v3 + 64) & 0x400) == 0 )
    {
      return 2;
    }
    else
    {
      *(_DWORD *)(v3 + 264) = v14;
      return 4;
    }
  }
  else
  {
    ++*(_QWORD *)(v3 + 48);
    v15 = (__int64)(PageTableCount - (_QWORD)MmGetPfnDb()) / 48;
    if( (MiFlags & 0x80) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
      MiArePageContentsZero((PVOID)v15);
    PteBase = MmGetPteBase();
    if( v10 )
    {
      if( KeGetCurrentPrcb()->HyperPte )
      {
        v18 = MiMapPageInHyperSpaceWorker(v15, 0i64, 0x80000000ui64);
        KeCopyPage(v18);
        MiUnmapPageInHyperSpaceWorker(v18, 0x11u, 0x80000000ui64);
        PteBase = MmGetPteBase();
      }
      else
      {
        MxCopyPage();
      }
    }
    MiInitializeSystemPageTable((_MMPTE *)v3, (_MMPFN *)(unsigned int)v5);
    v17 = 3;
    if( (_DWORD)v5 == 3 && *(_DWORD *)(v3 + 56) != 2 )
    {
      v19 = a2;
      do
      {
        v19 = (__int64)((v19 << 25) - ((_QWORD)PteBase << 25)) >> 16;
        --v17;
      }
      while( v17 );
      MiReplicatePteChange((_MMPTE *)v19, (_MMPTE *)v19);
    }
    if( (int)v5 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
    {
      if( (int)v5 > 1 )
        MiMakeSystemLeavesNonZero(a1, a2, (unsigned int)v5);
      return 0;
    }
    if( v10 )
      MiFlushTbList((_MI_TB_FLUSH_LIST *)(v3 + 80));
    return 1;
  }
}

Referenced by:

No references.