MiDeleteVa

NTSTATUS __stdcall MiDeleteVa(INT64 a1, UINT64 a2, INT64 a3){
  unsigned __int64 v3; 
  _MMPTE *Pml4eBase; 
  int v6; 
  _MMPTE *PxeUserLimit; 
  UINT64 v9; 
  char v10; 
  _MMPTE *i; 
  __int64 v12; 
  _MMSUPPORT_INSTANCE *v13; 
  __int64 v14; 
  int v15; 
  unsigned __int64 v16; 
  _MMPTE *PteLimit; 
  UINT64 v18; 
  _MMPTE *v19; 
  _UNICODE_STRING *v20; 
  UINT8 v21; 
  wchar_t *v22; 
  _MMPFN *v23; 
  _MMPFN *v24; 
  int v25; 
  _MMPFN *v26; 
  UINT64 v27; 
  _MMSUPPORT_INSTANCE *v28; 
  unsigned __int64 v29; 
  int v30; 
  _MMPTE *PteBase; 
  INT64 v32; 
  _QWORD *v33; 
  wchar_t *v34; 
  int v35; 
  char v36; 
  _MMPFN *PfnDb; 
  bool v38; 
  __int64 v39; 
  int v40; 
  __int64 v41; 
  unsigned int v42; 
  _MMPTE *v43; 
  __int64 v44; 
  volatile __int64 *v45; 
  _MMPTE *v46; 
  _MMPTE *v47; 
  _UNICODE_STRING *v48; 
  _UNICODE_STRING *v49; 
  __int64 v50; 
  int v51; 
  INT64 v52; 
  int v53; 
  int v54; 
  INT64 v55; 
  unsigned __int64 Long; 
  volatile __int64 v57; 
  _MMPTE *v58; 
  _MMPTE *v59; 
  char v60; 
  _MMPFN *v61; 
  char v62; 
  int v63; 
  char v64; 
  unsigned int v65; 
  char v66; 
  __int64 v67; 
  __int64 v68; 
  unsigned __int64 v69; 
  __int64 v70; 
  __int64 v71; 
  unsigned __int64 v72; 
  __int64 v73; 
  unsigned __int64 v74; 
  unsigned int v75; 
  __int64 v76; 
  unsigned __int64 v77; 
  unsigned __int64 v79; 
  _MI_PAGE_DELETE_RESULT v80; 
  int v81; 
  VOID *v82; 
  _EPROCESS *v83; 
  _MMCLONE_DESCRIPTOR *CloneAddress; 
  ULONG_PTR v85; 
  ULONG_PTR v86; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v87; 
  _MMPTE *v88; 
  _MMPTE *v89; 
  __int64 PartitionId; 
  _MI_PARTITION *v91; 
  INT64 v92; 
  __int64 *v93; 
  unsigned __int64 PteShadow; 
  _MMPTE *v95; 
  _MMPFN *v96; 
  INT64 *BugCheckParameter4; 
  UINT64 v98; 
  _MMSUPPORT_INSTANCE *v99; 
  int v100; 
  int v101; 
  char v102; 
  int v103; 
  __int64 v104; 
  UINT64 SpinCount; 
  unsigned __int64 v106; 
  unsigned __int64 v107; 
  __int64 v108; 
  UINT64 v109; 
  INT64 v110; 
  unsigned __int64 v111; 
  UINT64 IoPageFrame; 
  _OWORD v113[2]; 

  v3 = *(_QWORD *)a2;
  Pml4eBase = MmGetPml4eBase();
  v6 = a3;
  v101 = a3;
  PxeUserLimit = MmGetPxeUserLimit();
  if( a2 >= (unsigned __int64)Pml4eBase && a2 <= (unsigned __int64)PxeUserLimit )
    Pml4eBase = MmGetPml4eBase();
  v109 = v3;
  if( !v3 )
  {
    if( !(_DWORD)a3 )
    {
      v9 = *(_QWORD *)(a1 + 88);
      v10 = 1;
      if( v9 > (a2 & 0xFFFFFFFFFFFFF000ui64) + 4088 )
        v9 = (a2 & 0xFFFFFFFFFFFFF000ui64) + 4088;
      for( i = (_MMPTE *)(a2 + 8); (unsigned __int64)i <= v9; ++i )
      {
        if( i >= Pml4eBase && i <= PxeUserLimit )
          Pml4eBase = MmGetPml4eBase();
        if( i->u.Long )
          break;
        if( !++v10 )
          break;
      }
      *(_BYTE *)(a1 + 3) = v10 - 1;
    }
    return 0;
  }
  v12 = *(_QWORD *)(a1 + 168);
  v13 = *(_MMSUPPORT_INSTANCE **)(a1 + 24);
  v14 = *(_QWORD *)(a1 + 16);
  v104 = v12;
  v15 = *(_DWORD *)(v12 + 104);
  v99 = v13;
  v16 = (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
  if( (v3 & 1) != 0 )
  {
    if( v6 >= 1 )
    {
      if( (v3 & 0x80u) != 0i64 )
      {
LABEL_19:
        MiDeleteLargeUserPde(a1, a2, (unsigned int)v6);
        return 0;
      }
      if( !MiIsPageTableDeletable((_TOKEN *)a1, (_TOKEN **)a2) )
        return 0;
      v13 = v99;
      v6 = v101;
    }
    if( (v13->Flags._bf_0 & 7) != 0 )
    {
      MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v14, (VOID *)v16, 1ui64, 0i64);
      if( (v15 & 0x100) == 0 && v16 >= (unsigned __int64)MmGetPteBase() && v16 <= (unsigned __int64)MmGetPteLimit() )
      {
        if( !MiEvictPageTableLock((INT64)v99, (UINT64 *)a2, v3 & 0xFFFFFFFFFFFFFBFEui64 | 0x400, v101 > 1) )
          return 0;
        goto LABEL_141;
      }
      goto LABEL_57;
    }
    PteLimit = MmGetPteLimit();
    if( v6 )
      goto LABEL_55;
    if( (v15 & 0x800) != 0 )
    {
      MiDeleteLargeUserPde(a1, a2, 0i64);
      MiFlushTbListEarly((_MI_TB_FLUSH_LIST *)v14, 0i64);
      return 0;
    }
    if( (v15 & 0x10) != 0 )
    {
      LODWORD(v18) = MiDeleteVadAwePtes(*(_QWORD *)(*(_QWORD *)(v12 + 16) + 32i64), a2, (INT64 *)(v12 + 112));
      MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v14, (VOID *)v16, v18, 0i64);
      goto LABEL_141;
    }
    if( (v15 & 0x60) != 0 )
    {
      MiDeletePhysmemPte(a1, a2);
      goto LABEL_141;
    }
    if( (v15 & 8) != 0 )
    {
      if( MiRotatedToFrameBuffer((_MMPTE *)a2) == 1 )
      {
        IoPageFrame = 0i64;
        MiUnmapFrameBuffer(a2, MiNotMapped, 0i64, &IoPageFrame);
        MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v14, (VOID *)v16, 1ui64, 0i64);
        goto LABEL_141;
      }
      v13 = v99;
      PteLimit = MmGetPteLimit();
    }
    if( (v15 & 0x90) != 0x80 )
    {
LABEL_55:
      if( (v15 & 0x100) != 0 )
      {
        MiInsertTbFlushEntry((_MI_TB_FLUSH_LIST *)v14, (VOID *)v16, 1ui64, 0i64);
LABEL_57:
        v28 = v99;
LABEL_58:
        v29 = v3 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
        v109 = v29;
        if( v101 == 3 && (v28->Flags._bf_0 & 7) != 0 )
          MiWriteTopLevelPxe(a2, v29);
        else
          *(_QWORD *)a2 = v29;
        goto LABEL_141;
      }
      v30 = 0;
      v108 = 0i64;
      if( v101
        || (PteBase = MmGetPteBase(),
            (HIBYTE(*(unsigned __int64 *)((char *)&PteBase->u.Long + ((v16 >> 9) & 0x7FFFFFFFF8i64))) & 0xF) == 8) )
      {
        PfnDb = MmGetPfnDb();
      }
      else
      {
        v32 = v12 + 120;
        v33 = (unsigned __int64 *)((char *)&PteBase->u.Long + ((v16 >> 9) & 0x7FFFFFFFF8i64));
        v34 = (wchar_t *)(unsigned __int8)(HIBYTE(*v33) & 0xF | (16 * ((*v33 >> 60) & 7)));
        v102 = HIBYTE(*v33) & 0xF | (16 * ((*v33 >> 60) & 7));
        v106 = *(_QWORD *)a2;
        LOBYTE(v35) = MI_PFN_IS_PROTO(
                        (_UNICODE_STRING *)&MmGetPfnDb()[(v106 >> 12) & 0xFFFFFFFFFi64],
                        (_UNICODE_STRING *)((v106 >> 12) & 0xFFFFFFFFFi64),
                        (UINT8)v33,
                        v34);
        v38 = v35 == 0;
        v40 = v30;
        v39 = *(_QWORD *)(v32 + 8);
        LOBYTE(v40) = v38;
        if( !v39 )
        {
LABEL_70:
          *(_QWORD *)v32 = v99;
          v42 = *(_DWORD *)(v32 + 24) & 0xFFFFFFFE;
          *(_QWORD *)(v32 + 8) = a2;
          *(_BYTE *)(v32 + 28) = v36;
          *(_DWORD *)(v32 + 24) = v40 | v42;
          *(_QWORD *)(v32 + 16) = 1i64;
          IoPageFrame = *(_QWORD *)a2;
LABEL_141:
          v77 = *(&stru_140C4DB30 + 52);
          if( (*(_BYTE *)(v14 + 4) & 2) == 0
            && *(_DWORD *)v14 == 1
            && KeGetCurrentThread()->ApcState.Process->VmContext )
          {
            v77 = -1i64;
          }
          if( (*(_DWORD *)(v14 + 12) >= *(_DWORD *)(v14 + 8) || *(_BYTE *)(v14 + 5) || *(_QWORD *)(v14 + 16) > v77)
            && v77 >= 0x400
            && !*(_BYTE *)(v14 + 5) )
          {
            MiFlushTbList((_MI_TB_FLUSH_LIST *)v14);
          }
          v12 = v104;
LABEL_152:
          if( !*(_QWORD *)v12 )
            *(_QWORD *)v12 = a2;
          *(_QWORD *)(v12 + 8) = a2;
          return 0;
        }
        v41 = *(_QWORD *)(v32 + 16);
        if( a2 == v39 + 8 * v41 && v36 == *(_BYTE *)(v32 + 28) && v40 == (*(_DWORD *)(v32 + 24) & 1) )
        {
          *(_QWORD *)(v32 + 16) = v41 + 1;
          IoPageFrame = *(_QWORD *)a2;
          goto LABEL_141;
        }
        if( (*(_DWORD *)(v32 + 24) & 2) == 0 )
        {
          MiTerminateWsleCluster(v32);
          v36 = v102;
          goto LABEL_70;
        }
      }
      v43 = MmGetPteBase();
      v44 = 1i64;
      v100 = 1;
      v45 = (volatile __int64 *)((char *)v43 + ((v16 >> 9) & 0x7FFFFFFFF8i64));
      v46 = MmGetPml4eBase();
      v47 = MmGetPxeUserLimit();
      if( v45 >= (volatile __int64 *)v46 && v45 <= (volatile __int64 *)v47 )
        LOBYTE(v46) = (unsigned __int8)MmGetPml4eBase();
      if( v16 < (unsigned __int64)v43 || v16 > (unsigned __int64)MmGetPteLimit() )
      {
        v103 = 1;
        v49 = (_UNICODE_STRING *)(HIBYTE(*v45) & 0xF);
        v50 = (unsigned __int8)((unsigned __int8)v49 | (16 * (((unsigned __int64)*v45 >> 60) & 7)));
        v48 = (_UNICODE_STRING *)&PfnDb[((unsigned __int64)*v45 >> 12) & 0xFFFFFFFFFi64];
        LOBYTE(v51) = MI_PFN_IS_PROTO(v48, v49, (UINT8)v46, &v48->Length);
        v54 = v53;
        LOBYTE(v54) = v51 == 0;
        v100 = v54;
        if( (v50 & 0xF) == 8 )
        {
          MiUnlockWsle(v99, v16, v52);
          MiGetWsleContents(v55, v16);
        }
        Long = ZeroPte.u.Long;
        v57 = *v45;
        v58 = MmGetPml4eBase();
        v59 = MmGetPxeUserLimit();
        if( (MiFlags & 0x800) != 0 )
        {
          LOBYTE(v57) = 32;
        }
        else if( (MiFlags & 0x4000000) != 0 )
        {
          _mm_lfence();
        }
        if( (v57 & 0x20) != 0 )
        {
          if( v45 >= (volatile __int64 *)v58
            && v45 <= (volatile __int64 *)v59
            && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
            && (ZeroPte.u.Long & 1) != 0 )
          {
            Long = ZeroPte.u.Long | 0x8000000000000000ui64;
          }
          *v45 = Long;
        }
        else
        {
          v60 = _InterlockedExchange64(v45, ZeroPte.u.Hard._bf_0);
          if( v45 >= (volatile __int64 *)v58 && v45 <= (volatile __int64 *)v59 )
            MiWritePteShadow();
          if( (v60 & 0x20) == 0 )
          {
LABEL_98:
            v28 = v99;
            LODWORD(v98) = v100;
            LODWORD(BugCheckParameter4) = 10;
            MiRemoveWsle((UINT64)v99, (_MMSUPPORT_INSTANCE *)v16);
            if( v103 )
            {
              v107 = *(unsigned __int64 *)((char *)&MmGetPdeBase()->u.Long + ((v16 >> 18) & 0x3FFFFFF8));
              v61 = &MmGetPfnDb()[(v107 >> 12) & 0xFFFFFFFFFi64];
              if( ((LODWORD(v61->ListEntry.Flink) >> 4) & 0x3FF) == 0 )
              {
                MiCountWslesInPageTable((INT64)&v107, v16, v113);
                v62 = 8;
                while( 1 )
                {
                  v63 = *((_DWORD *)v113 + (unsigned __int8)--v62);
                  if( v63 )
                    break;
                  if( !v62 )
                    goto LABEL_105;
                }
                v61->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v61->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFFFE000Fui64 | (16 * (v63 & 0x3FF | ((unsigned __int64)(v62 & 7) << 10)));
              }
            }
LABEL_105:
            if( (_DWORD)v108 != 1 )
              goto LABEL_58;
            if( *(_DWORD *)v14 != 1 )
            {
              v64 = *(_BYTE *)(v14 + 4);
              if( (v64 & 8) == 0 && v16 >= (unsigned __int64)MmGetPteBase() && v16 <= (unsigned __int64)MmGetPteLimit() )
                *(_BYTE *)(v14 + 4) = v64 | 8;
            }
            v65 = *(_DWORD *)(v14 + 12);
            v66 = *(_BYTE *)(v14 + 4);
            if( v65 )
            {
              if( (v66 & 4) == 0 )
              {
                v67 = v14 + 8i64 * (v65 - 1);
                v68 = *(_QWORD *)(v67 + 24);
                if( (v68 & 0xC00) == 0 )
                {
                  v69 = *(_QWORD *)(v67 + 24) & 0x3FFi64;
                  if( (v68 & 0xFFFFFFFFFFFFF000ui64) + ((v69 + 1) << 12) == v16 && v69 + 1 > v69 && v69 + 1 <= 0x3FF )
                  {
                    ++*(_QWORD *)(v14 + 16);
                    *(_QWORD *)(v67 + 24) = v68 ^ ((unsigned __int16)v68 ^ (unsigned __int16)(v68 + 1)) & 0x3FF;
                    goto LABEL_58;
                  }
                }
              }
              if( (v66 & 4) == 0 )
              {
                v70 = v14 + 8i64 * (v65 - 1);
                v71 = *(_QWORD *)(v70 + 24);
                if( (v71 & 0xC00) == 0 && (v71 & 0xFFFFFFFFFFFFF000ui64) == v16 + 4096 )
                {
                  v72 = *(_QWORD *)(v70 + 24) & 0x3FFi64;
                  if( v72 + 1 > v72 && v72 + 1 <= 0x3FF )
                  {
                    ++*(_QWORD *)(v14 + 16);
                    *(_QWORD *)(v70 + 24) = (v71 - 4096) ^ ((unsigned __int16)(v71 - 4096) ^ (unsigned __int16)(v71 - 4096 + 1)) & 0x3FF;
                    goto LABEL_58;
                  }
                }
              }
            }
            if( v65 < *(_DWORD *)(v14 + 8) )
            {
              while( 1 )
              {
                v73 = 1024i64;
                if( (unsigned __int64)(v44 - 1) <= 0x3FF )
                  v73 = v44;
                v44 -= v73;
                v74 = v16 & 0xFFFFFFFFFFFFF000ui64 | ((_WORD)v73 - 1) & 0x3FF;
                v16 += v73 << 12;
                *(_QWORD *)(v14 + 8i64 * (unsigned int)(*(_DWORD *)(v14 + 12))++ + 24) = v74;
                v75 = *(_DWORD *)(v14 + 12);
                *(_QWORD *)(v14 + 16) += v73;
                if( v75 == *(_DWORD *)(v14 + 8) && (*(_BYTE *)(v14 + 4) & 4) == 0 )
                {
                  qsort(v14 + 24, v75, 8ui64, (INT64)MiTbFlushSort, BugCheckParameter4, v98, (UINT64)v99);
                  MiCompressTbFlushList((_MI_TB_FLUSH_LIST *)v14);
                  v76 = *(unsigned int *)(v14 + 12);
                  if( (_DWORD)v76 == *(_DWORD *)(v14 + 8) )
                    break;
                }
                if( !v44 )
                  goto LABEL_58;
              }
              if( v44 )
              {
                *(_BYTE *)(v14 + 5) = 1;
                *(_QWORD *)(v14 + 16) = v76;
              }
            }
            else
            {
              *(_BYTE *)(v14 + 5) = 1;
            }
            goto LABEL_58;
          }
        }
      }
      else
      {
        v103 = v30;
        if( !MiEvictPageTableLock((INT64)v99, (UINT64 *)v45, ZeroPte.u.Hard._bf_0, 0) )
          return 0;
      }
      LODWORD(v108) = 1;
      goto LABEL_98;
    }
    if( (v15 & 2) != 0 && (v13->Flags._bf_0 & 1) == 0 && *(&stru_140C4DB30 + 654) )
    {
      v19 = MmGetPteBase();
      if( v16 >= (unsigned __int64)v19 && v16 <= (unsigned __int64)PteLimit )
      {
LABEL_42:
        if( (*(_BYTE *)a2 & 0x20) != 0 )
          MiLogPageAccess(v13, (_MMPTE *)a2);
        goto LABEL_44;
      }
      if( (HIBYTE(*(unsigned __int64 *)((char *)&v19->u.Long + ((v16 >> 9) & 0x7FFFFFFFF8i64))) & 0xF) != 7 )
      {
        v13 = v99;
        goto LABEL_42;
      }
    }
LABEL_44:
    MiPteInShadowRange((UINT64)&v109);
    v23 = &MmGetPfnDb()[(v3 >> 12) & 0xFFFFFFFFFi64];
    if( (v23->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
    {
      if( (v15 & 1) != 0 && (unsigned int)(MiGetPfnPriority(v23) - 3) <= 2 )
        MiLockSetPfnPriority(v24, (VOID *)2);
      if( (v15 & 4) != 0 && !*(_QWORD *)(v12 + 88) && (v3 & 0x42) == 0 )
      {
        LOBYTE(v25) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v23, v20, v21, v22);
        if( v25 )
        {
          if( (*(_BYTE *)(&v23->u3 + 1) & 0x10) == 0 && (unsigned int)MiGetPfnPriority(v26) < 5 )
            *(_QWORD *)(v12 + 88) = MiCreateDecayPfn(v27);
        }
      }
    }
    goto LABEL_55;
  }
  if( (v3 & 0x400) != 0 )
  {
    v79 = v3;
    if( *(&stru_140C4DB30 + 42) && (v3 & 0x10) == 0 )
      v79 = v3 & ~*(&stru_140C4DB30 + 42);
    if( HIDWORD(v79) == 0xFFFFFFFF || (v3 & 0x800) == 0 )
    {
      if( !KeGetCurrentThread()->ApcState.Process->CloneRoot.Root )
        goto LABEL_172;
      LOBYTE(v81) = MiIsPrototypePteVadLookup(v3);
      if( v81 )
        goto LABEL_172;
      CloneAddress = MiLocateCloneAddress(v83, v82);
      if( !CloneAddress )
        goto LABEL_172;
      v80 = MiDecrementCloneBlockReference((ULONG_PTR)CloneAddress, v85, v86);
    }
    else
    {
      v80 = MiDecrementCombinedPte((_MMPTE *)v13);
    }
    if( v80 == PageStillReferenced )
    {
      ++*(_QWORD *)(*(_QWORD *)(v12 + 16) + 8i64);
    }
    else if( v80 == PageCommitNotCharged )
    {
      ++*(_QWORD *)(*(_QWORD *)(v12 + 16) + 16i64);
    }
    PxeUserLimit = MmGetPxeUserLimit();
LABEL_172:
    v87.Long = ZeroPte.u.Long;
    v88 = MmGetPml4eBase();
    if( a2 >= (unsigned __int64)v88 )
    {
      v89 = PxeUserLimit;
LABEL_193:
      if( a2 <= (unsigned __int64)v89
        && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
        && (v87.Long & 1) != 0 )
      {
        v87.Long |= 0x8000000000000000ui64;
      }
      goto LABEL_197;
    }
    goto LABEL_197;
  }
  if( (v3 & 0x800) != 0 )
  {
    if( (v15 & 0x800) != 0 )
      goto LABEL_19;
    if( (v15 & 0x10) != 0 && (v3 & 0x3E0) == 768 )
      MiDeleteVadAwePtes(*(_QWORD *)(*(_QWORD *)(v12 + 16) + 32i64), a2, (INT64 *)(v12 + 112));
    goto LABEL_152;
  }
  if( (v3 & 0x3E0) == 0 )
    KeBugCheckEx(0x1Au, (PVOID)0x41792, (PVOID)a2, (PVOID)v3, 0i64);
  PartitionId = v13->PartitionId;
  v110 = v3;
  v91 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * PartitionId);
  if( (v3 & 4) != 0 || (v3 & 2) != 0 )
    LODWORD(v92) = MI_READ_PTE_LOCK_FREE((INT64)&v110);
  else
    v92 = 0i64;
  v110 = v92;
  if( v92 )
    MiReleasePageFileInfo(v91, (_MMPTE)v92, 0i64);
  if( (v99->Flags._bf_0 & 7) != 0 )
    goto LABEL_190;
  if( (v15 & 0x80u) != 0 )
  {
    if( *(&stru_140C4DB30 + 42) && (v3 & 0x10) == 0 )
      LOWORD(v3) = ~*(&stru_140C4DB30 + 168) & v3;
    if( (v3 & 0x400) != 0 || (v3 & 0x800) != 0 || (v3 & 4) != 0 )
LABEL_190:
      ++*(_QWORD *)(*(_QWORD *)(v12 + 16) + 24i64);
  }
  v87.Long = ZeroPte.u.Long;
  v88 = MmGetPml4eBase();
  if( a2 >= (unsigned __int64)v88 )
  {
    v89 = MmGetPxeUserLimit();
    goto LABEL_193;
  }
LABEL_197:
  *(union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} *)a2 = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v87.Long;
  if( (v15 & 0x80u) != 0 && (a2 < (unsigned __int64)v88 || a2 > (unsigned __int64)MmGetPml4eLimit()) )
  {
    v93 = (__int64 *)((char *)MmGetPdeBase() + ((v16 >> 18) & 0x3FFFFFF8));
    PteShadow = *v93;
    v95 = MmGetPxeUserLimit();
    if( v93 >= (__int64 *)v88 && v93 <= (__int64 *)v95 )
    {
      PteShadow = MiReadPteShadow((__int64)v93, *v93);
      v95 = MmGetPxeUserLimit();
    }
    v111 = PteShadow;
    if( &v111 >= (unsigned __int64 *)v88 && &v111 <= (unsigned __int64 *)v95 )
      PteShadow = MiReadPteShadow((__int64)&v111, PteShadow);
    v96 = &MmGetPfnDb()[(PteShadow >> 12) & 0xFFFFFFFFFi64];
    if( (*(_DWORD *)(&v96->3 + 1) & 0x3FF0000) == 0 )
      KeBugCheckEx(0x1Au, (PVOID)0x41790, v96, (PVOID)(HIWORD(*((_DWORD *)&v96->3 + 4)) & 0x3FF), (PVOID)1);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&v96->u2, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( v96->u2._bf_0 < 0 );
    }
    v96->OriginalPte.u.Long ^= ((unsigned int)v96->OriginalPte.u.Long ^ (((unsigned int)(v96->OriginalPte.u.Long >> 16)
                                                                        - 1) << 16)) & 0x3FF0000;
    _InterlockedAnd64(&v96->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  }
  return 0;
}

Referenced by:

MiDeletePagablePteRange