MiDeletePagablePteRange

NTSTATUS __stdcall MiDeletePagablePteRange(_EPROCESS *Process, VOID *Va){
  UINT64 v2; 
  _SLIST_ENTRY *v3; 
  unsigned __int64 v4; 
  int v5; 
  UINT64 v7; 
  UINT8 v8; 
  UINT8 CurrentIrql; 
  char v10; 
  int v11; 
  __int64 v12; 
  int v13; 
  int v14; 
  __int16 v15; 
  int v16; 
  char v17; 
  char v18; 
  __int64 v19; 
  _ETHREAD *CurrentThread; 
  __int16 v21; 
  unsigned __int8 v22; 
  unsigned __int64 *v23; 
  UINT8 v24; 
  _MMSUPPORT_SHARED *SharedVm; 
  _MMSUPPORT_SHARED *v26; 
  NTSTATUS v27; 
  _MMPTE *PteBase; 
  UINT64 v29; 
  char *i; 
  __int64 v31; 
  __int64 v32; 
  bool v33; 
  char v34; 
  NTSTATUS result; 
  int v36; 
  _MMPFN *v37; 
  __int64 v38; 
  INT64 v39; 
  UINT8 v40; 
  int v41; 
  unsigned __int64 v42; 
  _SLIST_ENTRY *ListEntry; 
  _KLOCK_QUEUE_HANDLE LockQueue; 
  UINT64 v45; 
  unsigned __int64 v46; 
  unsigned __int64 v47; 
  __int64 v48; 
  INT64 v49[2]; 
  _KTBFLUSH_TYPE *v50; 
  _EPROCESS *v51; 
  UINT64 v52; 
  __int64 v53; 
  __int128 v54; 
  __int128 v55; 
  __int128 v56; 
  __int128 v57; 
  __int128 v58; 
  __int128 v59; 
  __int64 v60; 
  NTSTATUS(__stdcall *v61)(INT64, UINT64, INT64); 
  NTSTATUS(__stdcall *v62)(INT64 *); 
  __int128 *v63; 
  __int128 v64[6]; 
  __int128 v65; 
  INT64 v66[2]; 
  __int128 v67; 
  __int64 v68; 
  _KTBFLUSH_TYPE v69; 
  __int16 v70; 
  __int16 v71; 
  __int64 v72; 
  __int64 v73; 
  __int64 v74; 
  __int128 v75; 
  __int128 v76; 
  __int128 v77; 
  __int128 v78; 
  __int128 v79; 
  __int128 v80; 
  __int128 v81; 
  __int128 v82; 
  __int128 v83; 
  __int64 v84; 
  char v85; 
  char v86; 
  int v87; 
  _QWORD *v88; 

  v5 = v87;
  ListEntry = v3;
  v71 = 0;
  v7 = (UINT64)v3;
  v84 = 0i64;
  v8 = (unsigned __int8)Va;
  v40 = (unsigned __int8)Va;
  v86 = 4 * (v85 & 7);
  v42 = v4;
  LOBYTE(v2) = 0;
  v75 = 0i64;
  v76 = 0i64;
  v77 = 0i64;
  v78 = 0i64;
  v79 = 0i64;
  v80 = 0i64;
  v81 = 0i64;
  v82 = 0i64;
  v83 = 0i64;
  memset(&LockQueue, 0, sizeof(LockQueue));
  while( 1 )
  {
    v41 = v2;
    CurrentIrql = v8;
    v68 = 2i64;
    v10 = 0;
    v60 = 0i64;
    v65 = 0i64;
    v64[1] = (unsigned __int64)v88;
    v64[0] = 0i64;
    DWORD2(v65) = v5;
    memset(&v64[2], 0, 64);
    *(_OWORD *)v66 = 0i64;
    v67 = 0i64;
    *(_OWORD *)v49 = 0i64;
    v54 = 0i64;
    v55 = 0i64;
    v56 = 0i64;
    v57 = 0i64;
    v58 = 0i64;
    v59 = 0i64;
    v69 = MiTbFlushType((_MMSUPPORT_INSTANCE *)Process);
    v50 = &v69;
    v70 = 0;
    v73 = 0i64;
    v74 = 0i64;
    v72 = 20i64;
    BYTE2(v49[0]) = v86 | _mm_cvtsi128_si32(_mm_srli_si128((__m128i)0i64, 2)) & 0xE3;
    v63 = v64;
    v15 = 39;
    LOWORD(v49[0]) = 39;
    if( v16 )
    {
      v15 = 1059;
      LOWORD(v49[0]) = 1059;
    }
    if( v11 )
    {
      v15 |= 0x800u;
      LOWORD(v49[0]) = v15;
    }
    v17 = BYTE5(v49[0]);
    v52 = v7;
    if( v14 )
      v17 = 63;
    v53 = v12;
    BYTE5(v49[0]) = v17;
    v18 = 0;
    v51 = Process;
    v61 = MiDeleteVa;
    v62 = MiDeleteVaTail;
    if( v13 )
    {
      v19 = *(_QWORD *)(v88[4] + 32i64);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.SpecialApcDisable;
      ExAcquireAutoExpandPushLockExclusive((_EX_PUSH_LOCK_AUTO_EXPAND *)(v19 + 56), 0i64);
      v15 = v49[0];
    }
    if( v40 != 17 )
    {
      v18 = 1;
      v21 = v15 & 0xFFFD;
      LOWORD(v49[0]) = v21;
      goto LABEL_22;
    }
    if( (v49[0] & 4) == 0 )
    {
      SharedVm = MiGetSharedVm((_MMSUPPORT_INSTANCE *)Process);
      v24 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
      SharedVm->GoodCitizenWaiting = 0;
LABEL_20:
      LODWORD(v2) = v41;
      CurrentIrql = v24;
      goto LABEL_21;
    }
    v22 = Process->Pcb.Affinity.Bitmap[12] & 7;
    if( v22 < 6u )
    {
      v23 = (unsigned __int64 *)((char *)&stru_140C4DB30 + 6544);
      if( v22 != 2 )
        v23 = &Process->Pcb.Affinity.Bitmap[13];
      v24 = ExAcquireSpinLockShared((INT64 *)v23);
      if( *((_DWORD *)v23 + 1) )
        _InterlockedExchange((volatile __int32 *)v23 + 1, 0);
      goto LABEL_20;
    }
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
LABEL_21:
    v21 = v49[0];
LABEL_22:
    BYTE6(v49[0]) = CurrentIrql;
    if( (v87 & 0x100) != 0 )
    {
      if( (v87 & 0x200) == 0 )
        v21 = v21 & 0xEFFB | 0x1000;
      LOWORD(v49[0]) = v21 & 0xFFFD;
      v26 = MiGetSharedVm((_MMSUPPORT_INSTANCE *)Process);
      LockQueue.LockQueue.Next = 0i64;
      LockQueue.LockQueue.Lock = &v26->WorkingSetCoreLock;
      KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &v26->WorkingSetCoreLock);
    }
    if( (v87 & 0x80) == 0 )
      goto LABEL_37;
    if( (_BYTE)v2 )
      goto LABEL_37;
    if( ((v42 ^ v7) & 0xFFFFFFE00000i64) != 0 )
      goto LABEL_37;
    v27 = MiFastLockLeafPageTable((INT64)Process, v7);
    if( !v27 )
      goto LABEL_37;
    PteBase = MmGetPteBase();
    v2 = (UINT64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64);
    v45 = v2;
    v46 = (unsigned __int64)PteBase + ((v2 >> 9) & 0x7FFFFFFFF8i64);
    v47 = (unsigned __int64)PteBase + ((v46 >> 9) & 0x7FFFFFFFF8i64);
    v48 = (__int64)PteBase + ((v47 >> 9) & 0x7FFFFFFFF8i64);
    v29 = *(&v45 + v27);
    if( v27 == 1 )
    {
      for( i = (char *)PteBase + ((v42 >> 9) & 0x7FFFFFFFF8i64); v2 <= (unsigned __int64)i; v2 += 8 * v31 )
      {
        MiDeleteVa((INT64)v49, v2, 0i64);
        v31 = (unsigned int)BYTE3(v49[0]) + 1;
        BYTE3(v49[0]) = 0;
      }
      MiDeleteVaTail(v49);
      LODWORD(v32) = MiGetUsedPtesHandle(ListEntry);
      v33 = (*(_DWORD *)(v32 + 16) & 0x3FF0000) == 0;
      v34 = v41;
      if( v33 )
        v34 = 1;
      v10 = 1;
      LOBYTE(v41) = v34;
    }
    MiUnlockPageTableInternal((INT64)Process, v29);
    if( !v10 )
LABEL_37:
      result = MiWalkPageTables((INT64)v49);
    if( (v87 & 0x100) != 0 )
    {
      result = (unsigned int)KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
      if( (v87 & 0x200) == 0 )
        LOWORD(v49[0]) |= 4u;
    }
    if( !v18 )
    {
      if( (v49[0] & 4) != 0 )
      {
        if( (Process->Pcb.Affinity.Bitmap[12] & 7) < 6 )
        {
          v36 = Process->Pcb.Affinity.Bitmap[12];
          if( (v36 & 0x8000000) != 0 || (v36 & 0x4000000) != 0 || (v36 & 0x10000000) != 0 )
          {
            MiPreUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)Process, CurrentIrql);
            LOBYTE(v36) = Process->Pcb.Affinity.Bitmap[12];
          }
          v2 = (UINT64)&stru_140C4DB30 + 6544;
          if( (v36 & 7) != 2 )
            v2 = (UINT64)&Process->Pcb.Affinity.Bitmap[13];
          MiCheckProcessShadow();
          _InterlockedAnd((volatile signed __int32 *)v2, 0xBFFFFFFF);
          _InterlockedDecrement((volatile signed __int32 *)v2);
        }
        result = CurrentIrql;
        __writecr8(CurrentIrql);
      }
      else
      {
        MiUnlockWorkingSetExclusive((_MMSUPPORT_INSTANCE *)Process, CurrentIrql);
      }
    }
    v37 = (_MMPFN *)v88[5];
    if( (__int64)v37 < 0 )
    {
      MiFreeLargePages(v37);
      v88[1] = v38;
      result = 0;
      v88[5] = 0i64;
    }
    v39 = v88[4];
    if( v39 && v66[0] )
      MiFreePhysicalPageChain(v39, v66[0], 1i64);
    if( (v87 & 0x10) != 0 )
    {
      v2 = (UINT64)KeGetCurrentThread();
      ExReleaseAutoExpandPushLockExclusive(*(_QWORD *)(v88[4] + 32i64) + 56, 0);
      KiLeaveGuardedRegionUnsafe(v2);
    }
    if( (_BYTE)v41 != 1 )
      return result;
    v7 = (UINT64)ListEntry;
    LOBYTE(v2) = 2;
    v8 = v40;
    v5 = v87;
  }
}

Referenced by:

MiDeleteSessionAddressSpace
MiDeleteSessionPdes
MiDeleteVad
MiDeleteVadBitmap
MiDeleteVirtualAddresses