MiDeleteSystemPageTable

INT64 __fastcall MiDeleteSystemPageTable(INT64 a1, UINT64 a2, INT64 a3){
  __int64 v3; 
  INT64 v5; 
  int v6; 
  INT64 v8; 
  char v9; 
  int v10; 
  unsigned __int64 v11; 
  _MMPTE *PteBase; 
  char *v13; 
  CHAR v15; 
  UINT64 LeafVa; 
  BOOL v17; 
  unsigned __int64 v18; 
  MMPTE *v19; 
  unsigned __int64 v20; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  INT64 v22; 
  v3 = *(_QWORD *)(a1 + 168);
  memset(&LockHandle, 0, sizeof(LockHandle));
  v5 = *(_QWORD *)(v3 + 16);
  v6 = a3;
  v8 = MI_READ_PTE_LOCK_FREE(a2);
  v9 = v8;
  v22 = v8;
  if( (v8 & 1) != 0 )
  {
    v10 = 0;
    v11 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v22) >> 12) & 0xFFFFFFFFFi64;
    PteBase = MmGetPteBase();
    if( v9 >= 0 )
    {
      v13 = (char *)MmGetPfnDb() + 48 * v11;
      if( v6 <= ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
      {
        v15 = 0;
      }
      else
      {
        if( (*((_QWORD *)v13 + 3) & 0x3FFFFFFFFFFFFFFFi64) != 1
          || *((_WORD *)v13 + 16) != 1
          || RtlCompareMemoryUlong((PVOID)((__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16), 0x1000ui64, 0) != 4096 )
        {
          return 0i64;
        }
        v15 = 1;
      }
      if( v6 >= 1 )
      {
        if( !(unsigned int)MiEvictPageTableLock(*(_QWORD *)(a1 + 24), (volatile UINT64 *)a2, ZeroPte, v15) )
          return 0i64;
        v10 = 1;
      }
      MiAddSystemPageTableToList((_QWORD *)(v3 + 8), (INT64)v13);
      PteBase = MmGetPteBase();
    }
    if( v6 >= 1 && v9 < 0 )
    {
      MiInsertLargeTbFlushEntry(v5, (unsigned int)v6, a2);
    }
    else
    {
      MiInsertTbFlushEntry(v5, (__int64)((a2 << 25) - ((_QWORD)PteBase << 25)) >> 16, 1i64, 0i64);
      if( v6 == 1 )
      {
        LeafVa = MiGetLeafVa(a2);
        MiInsertTbFlushEntry(v5, LeafVa, 512i64, 0i64);
      }
    }
    if( !v10 )
    {
      v17 = MiPteInShadowRange(a2);
      if( v6 == 3 )
      {
        KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
        v18 = ZeroPte;
        if( v17 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
          v18 = ZeroPte | 0x8000000000000000ui64;
        *(_QWORD *)a2 = v18;
        KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
        __writecr8(LockHandle.OldIrql);
        goto LABEL_28;
      }
      v20 = ZeroPte;
      if( v17 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
        v20 = ZeroPte | 0x8000000000000000ui64;
      *(_QWORD *)a2 = v20;
    }
    if( v6 == 3 )
    {
LABEL_28:
      v19 = (_MMPTE *)((char *)MmGetPteBase() + ((MiGetLeafVa(a2) >> 9) & 0x7FFFFFFFF8i64));
      MiReplicatePteChange(v19, v19);
    }
  }
  return 0i64;
}

Referenced by:

No references.