MiDeleteSystemPageTable

NTSTATUS __stdcall MiDeleteSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
  __int64 v3; 
  _MI_TB_FLUSH_LIST *v5; 
  int v6; 
  INT64 v8; 
  char v9; 
  int v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  _MMPTE *PteBase; 
  _MMPFN *v14; 
  CHAR v16; 
  VOID *v17; 
  __int64 v18; 
  int v19; 
  int v20; 
  unsigned __int64 Long; 
  unsigned __int64 v22; 
  _MMPTE *v23; 
  unsigned __int64 v24; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  INT64 v26; 

  v3 = *(_QWORD *)(a1 + 168);
  memset(&LockHandle, 0, sizeof(LockHandle));
  v5 = *(_MI_TB_FLUSH_LIST **)(v3 + 16);
  v6 = a3;
  LODWORD(v8) = MI_READ_PTE_LOCK_FREE(a2);
  v9 = v8;
  v26 = v8;
  if( (v8 & 1) != 0 )
  {
    v10 = 0;
    LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)&v26);
    v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
    PteBase = MmGetPteBase();
    if( v9 >= 0 )
    {
      v14 = &MmGetPfnDb()[v12];
      if( v6 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
      {
        v16 = 0;
      }
      else
      {
        if( (v14->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 1 )
          return 0;
        if( v14->u3.ReferenceCount != 1 )
          return 0;
        LODWORD(v18) = RtlCompareMemoryUlong(
                         (VOID *)((__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16),
                         4096,
                         0i64);
        if( v18 != 4096 )
          return 0;
        v16 = 1;
      }
      if( v6 >= 1 )
      {
        if( !MiEvictPageTableLock(*(_QWORD *)(a1 + 24), (UINT64 *)a2, ZeroPte.u.Hard._bf_0, v16) )
          return 0;
        v10 = 1;
      }
      MiAddSystemPageTableToList((_QWORD *)(v3 + 8), (__int64)v14);
      PteBase = MmGetPteBase();
    }
    if( v6 >= 1 && v9 < 0 )
    {
      MiInsertLargeTbFlushEntry(v5, (unsigned int)v6, a2);
    }
    else
    {
      MiInsertTbFlushEntry(v5, (VOID *)((__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16), 1ui64, 0i64);
      if( v6 == 1 )
      {
        LODWORD(v17) = MiGetLeafVa(a2);
        MiInsertTbFlushEntry(v5, v17, 0x200ui64, 0i64);
      }
    }
    if( !v10 )
    {
      LOBYTE(v19) = MiPteInShadowRange(a2);
      v20 = v19;
      if( v6 == 3 )
      {
        KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 522, &LockHandle);
        Long = ZeroPte.u.Long;
        if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
          Long = ZeroPte.u.Long | 0x8000000000000000ui64;
        *(_QWORD *)a2 = Long;
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        goto LABEL_28;
      }
      v24 = ZeroPte.u.Long;
      if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
        v24 = ZeroPte.u.Long | 0x8000000000000000ui64;
      *(_QWORD *)a2 = v24;
    }
    if( v6 == 3 )
    {
LABEL_28:
      LODWORD(v22) = MiGetLeafVa(a2);
      v23 = (_MMPTE *)((char *)MmGetPteBase() + ((v22 >> 9) & 0x7FFFFFFFF8i64));
      MiReplicatePteChange(v23, v23);
    }
  }
  return 0;
}

Referenced by:

No references.