MiDeletePteRun
INT64 __fastcall MiDeletePteRun(__int64 a1, __int64 a2){
_QWORD *v2;
unsigned __int64 v3;
unsigned __int64 v4;
__int64 v6;
int v7;
unsigned __int64 PteBase;
unsigned __int64 v9;
unsigned __int64 v10;
int v11;
__int64 v12;
unsigned __int64 v13;
ULONG_PTR v14;
__int64 v15;
_MMPTE *Pml4eBase;
__int64 v17;
_MMPTE *PxeUserLimit;
int v19;
unsigned int v20;
char *v21;
UINT64 v22;
ULONG_PTR v23;
__int64 v24;
char *v25;
WCHAR *v26;
int v27;
int v28;
_MMPTE *v29;
int v30;
__int64 v31;
__int64 v32;
_MMPTE *v33;
ULONG_PTR v34;
_MMPTE *v35;
unsigned __int64 v36;
char *v37;
UINT8 v38;
__int64 v39;
char v40;
unsigned __int64 v41;
INT64 v42;
INT64 v43;
_QWORD *v44;
__int64 v45;
signed __int8 v46;
UNICODE_STRING *v47;
char v48;
UINT64 v49;
int v50;
__int64 v51;
int v52;
__int64 v53;
int v54;
unsigned __int64 v55;
INT64 v56;
WCHAR *v57;
unsigned int v58;
unsigned __int64 v59;
unsigned __int64 v60;
unsigned __int64 v61;
int v62;
int v63;
UINT64 ValidPte;
struct _KPRCB *CurrentPrcb;
UINT64 v66;
__int64 v67;
unsigned __int64 UltraMapping;
_MMPTE *v69;
_MMPTE *v70;
_MMPTE *v71;
__int64 v72;
__int64 v73;
__int64 *v74;
__int64 v75;
UNICODE_STRING *v76;
char v77;
char v78;
int v79;
char v80;
INT64 v81;
INT64 v82;
__int64 v83;
_MI_PARTITION *v84;
int v85;
__int64 v86;
__int64 v87;
char v88;
UINT64 v89;
unsigned __int64 v90;
INT64 v91;
unsigned __int64 v92;
int v93;
INT16 v94;
INT64 result;
ULONG_PTR v96;
ULONG_PTR BugCheckParameter4;
INT64 v98;
ULONG_PTR v99;
__int64 a8;
_QWORD *a9;
INT64 a10;
UINT64 v103;
INT64 a12;
int v105;
__int16 v106;
ULONG_PTR BugCheckParameter3;
_MMPTE *v108;
int v109;
ULONG_PTR BugCheckParameter2;
INT64 v111;
int v112;
int v113;
_MI_PARTITION *Partition;
UINT64 SpinCount;
UINT64 v116;
unsigned __int64 v117;
unsigned __int64 v118;
INT64 v119;
char *v120;
_MI_PARTITION *v121;
ULONG_PTR v122;
__int64 v123;
ULONG_PTR v124;
unsigned __int64 v125;
unsigned __int64 v126;
__int64 v127;
UINT64 a2a[2];
__int64 v129;
UINT8 v130[16];
__int128 v131[8];
EVENT_DATA_DESCRIPTOR EventData;
v2 = *(_QWORD **)(a2 + 16);
v3 = *(_QWORD *)a2;
v4 = *(_QWORD *)(a2 + 8);
v129 = 0i64;
LOBYTE(a10) = *(_BYTE *)(a2 + 108);
v6 = *(_QWORD *)(a2 + 88);
v7 = *(_DWORD *)(a2 + 104);
v123 = v6;
PteBase = (unsigned __int64)MmGetPteBase();
a8 = a1;
*(_OWORD *)a2a = 0i64;
a9 = v2;
*(_OWORD *)v130 = 0i64;
v125 = v3;
memset(v131, 0, sizeof(v131));
v126 = v4;
v106 = v7;
v9 = PteBase << 25;
a12 = PteBase << 25;
v10 = (__int64)((v3 << 25) - (PteBase << 25)) >> 16;
if( v10 < PteBase || (v11 = 1, v10 > (unsigned __int64)MmGetPteLimit()) )
v11 = 0;
v12 = a1 - 1664;
v13 = 0i64;
if( (*(_BYTE *)(a1 + 184) & 7) != 0 )
v12 = 0i64;
v105 = v11;
v14 = 0i64;
v103 = v12;
v121 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a1 + 174));
v109 = 0;
LODWORD(v99) = 0;
Partition = 0i64;
v122 = 0i64;
if( v3 <= v4 )
{
v15 = a8;
Pml4eBase = MmGetPml4eBase();
while( 1 )
{
v17 = *(_QWORD *)v3;
PxeUserLimit = MmGetPxeUserLimit();
if( v3 >= (unsigned __int64)Pml4eBase && v3 <= (unsigned __int64)PxeUserLimit )
LOBYTE(v7) = v106;
if( v17 )
{
v19 = v7 & 0x80;
v113 = v19;
if( (v7 & 0x80) != 0 && (v3 < (unsigned __int64)Pml4eBase || v3 > (unsigned __int64)MmGetPml4eLimit()) )
{
v13 = (unsigned int)(v13 + 1);
LODWORD(v99) = v13;
if( !v14 )
{
v117 = *(_QWORD *)((char *)MmGetPdeBase() + ((((__int64)((v3 << 25) - v9) >> 16) & 0xFFFFFFE00000ui64) >> 18));
v9 = (v117 >> 12) & 0xFFFFFFFFFi64;
v122 = (ULONG_PTR)MmGetPfnDb() + 48 * v9;
}
}
v20 = v13;
if( (v17 & 0x400) != 0 )
{
LODWORD(v21) = 0;
v108 = 0i64;
BugCheckParameter2 = 0i64;
BugCheckParameter3 = v17 & 0xFFFFFFFFFFFFFBFEui64 | 1;
v22 = 0i64;
v124 = 0i64;
v23 = (BugCheckParameter3 >> 12) & 0xFFFFFFFFFi64;
v24 = 48 * v23;
v127 = 48 * v23;
if( (*((_QWORD *)MmGetPfnDb() + 6 * v23 + 5) & 0x4000000000000i64) == 0 )
goto LABEL_192;
v21 = (char *)MmGetPfnDb() + v24;
if( (v106 & 0x60) != 0 && !v11 )
{
MiDeleteBatch(v130);
if( !MiIsPfnLocked((INT64)v21) )
MiShowBadMapper(v23, 4ui64);
if( (v106 & 0x40) != 0 )
MiDoubleUnlockMdlPage((UINT64)v21);
v25 = (char *)MmGetPfnDb() + 48 * MiGetContainingPageTable(v3);
v27 = 4;
LODWORD(v21) = 0;
v28 = 0;
goto LABEL_170;
}
if( !v21 )
{
LABEL_192:
MiDeleteBatch(v130);
MiDereferenceIoPages(1i64, v23, 1i64);
v25 = (char *)MmGetPfnDb() + 48 * MiGetContainingPageTable(v3);
v27 = 4;
v28 = (int)v21;
goto LABEL_170;
}
if( (*(_BYTE *)(a8 + 184) & 7) == 0
&& !v11
&& ((BugCheckParameter3 >> 12) & 0xF) == 0
&& ((__int64)(v126 - v3) >> 3) + 1 >= 16
&& (unsigned int)MiDeleteClusterPage(v3, v130) == 1 )
{
v15 = a8;
v13 = v20 + 15;
v3 += 120i64;
if( !v19 )
v13 = v20;
Pml4eBase = MmGetPml4eBase();
LODWORD(v99) = v13;
LABEL_232:
v2 = a9;
LABEL_233:
v9 = a12;
goto LABEL_234;
}
v29 = (_MMPTE *)(*((_QWORD *)v21 + 1) | 0x8000000000000000ui64);
LOBYTE(v30) = MI_PFN_IS_PROTO((UNICODE_STRING *)v21, *((UNICODE_STRING **)v21 + 1), v9, (PWCHAR)v13);
if( v30 )
{
if( (*((_QWORD *)v21 + 5) & 0x1000000000i64) != 0 || v31 <= 0 )
{
v35 = MmGetPteBase();
if( v3 <= (unsigned __int64)v35 + 0x3FFFFFFF78i64
&& v3 >= (unsigned __int64)v35
&& *(_QWORD *)(v32 + 1264) )
{
v124 = (ULONG_PTR)v29;
BugCheckParameter2 = (ULONG_PTR)MiLocateCloneAddress(v32, (unsigned __int64)v29);
v34 = BugCheckParameter2;
if( BugCheckParameter2 )
a9[1] += MiDeleteBatch(v130);
}
else
{
v34 = 0i64;
}
v33 = 0i64;
}
else
{
v108 = v29;
v33 = v29;
v34 = 0i64;
a9[1] += MiDeleteBatch(v130);
}
v26 = (WCHAR *)MmGetPml4eBase();
v118 = *(_QWORD *)((char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64));
v36 = (v118 >> 12) & 0xFFFFFFFFFi64;
v37 = (char *)MmGetPfnDb() + 48 * v36;
v120 = v37;
if( !v130[0] )
goto LABEL_52;
if( v37 != *(char **)&v130[8]
|| *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v21 + 5) >> 39) & 0x3FFi64)) != v121
|| _interlockedbittestandset64((volatile signed __int32 *)v21 + 6, 0x3Fui64) )
{
a9[1] += MiDeleteBatch(v130);
}
v38 = v130[0];
if( !v130[0] )
{
LABEL_52:
*(_QWORD *)&v130[8] = v37;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v21 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v21 + 3) < 0 );
}
v38 = v130[0];
}
v39 = a8;
if( (*(_BYTE *)(a8 + 184) & 7) == 0 )
{
v40 = v21[34];
if( (v40 & 7) == 6
&& (*((_DWORD *)v21 + 4) & 0x400i64) == 0
&& ((BugCheckParameter3 & 0x42) != 0 || (v40 & 0x10) != 0)
&& !v33
&& !v34 )
{
*((_QWORD *)v131 + v38) = BugCheckParameter3;
if( !v130[0] )
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v21 + 5) >> 39) & 0x3FFi64));
v41 = ZeroPte;
Pml4eBase = MmGetPml4eBase();
if( v3 >= (unsigned __int64)Pml4eBase
&& v3 <= (unsigned __int64)MmGetPxeUserLimit()
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (ZeroPte & 1) != 0 )
{
v41 = ZeroPte | 0x8000000000000000ui64;
}
*(_QWORD *)v3 = v41;
if( ++v130[0] == 16 )
{
v42 = MiDeleteBatch(v130);
v2 = a9;
v15 = a8;
v13 = (unsigned int)v99;
a9[1] += v42;
goto LABEL_233;
}
v15 = a8;
LABEL_231:
v13 = (unsigned int)v99;
goto LABEL_232;
}
}
if( v38 )
{
v130[1] = 1;
v43 = MiDeleteBatch(v130);
v44 = a9;
v130[1] = 0;
a9[1] += v43;
}
else
{
v44 = a9;
}
}
else
{
if( v21 == (char *)qword_140C4EAA0 )
{
v15 = a8;
*(_QWORD *)v3 = ZeroPte;
Pml4eBase = MmGetPml4eBase();
goto LABEL_231;
}
v44 = a9;
a9[1] += MiDeleteBatch(v130);
if( v29 != (_MMPTE *)v3 )
KeBugCheckEx(0x1Au, 0x403ui64, v3, BugCheckParameter3, *((_QWORD *)v21 + 1));
v45 = 48 * (*((_QWORD *)v21 + 5) & 0xFFFFFFFFFi64);
++a9[3];
HIDWORD(SpinCount) = 0;
v46 = _interlockedbittestandset64((volatile signed __int32 *)v21 + 6, 0x3Fui64);
v120 = (char *)MmGetPfnDb() + v45;
if( v46 )
{
do
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( *((__int64 *)v21 + 3) < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)v21 + 6, 0x3Fui64) );
}
*((_QWORD *)v21 + 3) |= 0x4000000000000000ui64;
if( (_BYTE)a10 && v105 )
{
*(_OWORD *)a2a = 0i64;
v129 = 0i64;
MiIdentifyPfn((_MMPFN *)v21, a2a);
v109 = 1;
}
v39 = a8;
if( (*(_BYTE *)(a8 + 184) & 7) != 0 && ((*((_QWORD *)v21 + 5) >> 60) & 7) == 2 )
*((_QWORD *)v21 + 5) &= 0x8FFFFFFFFFFFFFFFui64;
}
v47 = (UNICODE_STRING *)(unsigned __int8)v21[34];
if( ((unsigned __int8)v47 & 7) != 6 )
MiBadShareCount((_MMPFN *)v21);
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v21 + 5) >> 39) & 0x3FFi64));
if( (BugCheckParameter3 & 0x42) != 0 && ((unsigned __int8)v47 & 0x10) == 0 )
{
v48 = (char)v47;
if( (*((_DWORD *)v21 + 4) & 0x400i64) == 0 && ((unsigned __int8)v47 & 8) == 0 )
{
v49 = MiCapturePageFileInfoInline((UINT64 *)v21 + 2, 1i64, 0i64);
v48 = v21[34];
v22 = v49;
}
LOBYTE(v36) = v48 | 0x10;
v21[34] = v36;
}
if( (*(_BYTE *)(v39 + 184) & 7) != 0 )
{
LOBYTE(v50) = MI_PFN_IS_PROTO((UNICODE_STRING *)v21, v47, v36, v26);
if( v50 )
{
v51 = *((_QWORD *)v21 + 2);
if( (v51 & 0x400) == 0 || (BugCheckParameter3 & 0x200) != 0 )
goto LABEL_102;
if( qword_140C4DC80 && (v51 & 0x10) == 0 )
v51 &= ~qword_140C4DC80;
if( (*(_DWORD *)(*(_QWORD *)(v51 >> 16) + 56i64) & 0x820) == 2080 )
LABEL_102:
++v44[3];
}
}
v52 = v105;
v112 = 0;
v27 = 4;
v28 = 0;
if( v105 && v113 )
{
if( (*((_QWORD *)v21 + 3) & 0x3FFFFFFFFFFFFFFFui64) >= 0x10000 )
v28 = 1;
v112 = v28;
}
v53 = *((_QWORD *)v21 + 3) ^ (*((_QWORD *)v21 + 3) ^ (*((_QWORD *)v21 + 3) - 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
*((_QWORD *)v21 + 3) = v53;
if( (v53 & 0x3FFFFFFFFFFFFFFFi64) != 0 )
{
if( v105 )
{
v27 = 2;
if( (v106 & 0x100) == 0 )
*(_QWORD *)v21 &= ~1ui64;
}
}
else
{
LOBYTE(v54) = MI_PFN_IS_PROTO((UNICODE_STRING *)v21, (UNICODE_STRING *)v53, 0, v26);
if( v54 )
{
v59 = *((_QWORD *)v21 + 2);
v111 = v56;
v60 = *((_QWORD *)v21 + 1);
v61 = v59 >> 5;
v62 = v58;
v63 = *((unsigned __int8 *)MmGetPfnDb() + 48 * (*((_QWORD *)v21 + 5) & 0xFFFFFFFFFi64) + 34) >> 6;
if( !v63 || v63 == 3 )
{
v62 = 12;
}
else if( v63 == 2 )
{
v62 = 28;
}
ValidPte = MiMakeValidPte(0i64, *((_QWORD *)v21 + 5) & 0xFFFFFFFFFi64, v62 | 0xA0000000);
CurrentPrcb = KeGetCurrentPrcb();
v66 = ValidPte;
v67 = *((_QWORD *)CurrentPrcb + 4095);
if( !v67
|| (UltraMapping = MiGetUltraMapping((unsigned __int64 *)(v67 + 12448), 3u, 1i64, 0),
v69 = (_MMPTE *)((char *)MmGetPteBase() + ((UltraMapping >> 9) & 0x7FFFFFFFF8i64)),
*(_QWORD *)(v67 + 12344) = v69,
!UltraMapping) )
{
UltraMapping = (*((_QWORD *)CurrentPrcb + 4160) & 0xFFFFFFFFFFFFF000ui64)
+ ((*((_QWORD *)CurrentPrcb + 4160) & 0xFFFi64) << 12);
v69 = (_MMPTE *)((char *)MmGetPteBase() + ((UltraMapping >> 9) & 0x7FFFFFFFF8i64));
}
v70 = MmGetPml4eBase();
v71 = MmGetPxeUserLimit();
if( v69 >= v70
&& v69 <= v71
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (v66 & 1) != 0 )
{
v66 |= 0x8000000000000000ui64;
}
*(_QWORD *)v69 = v66;
v72 = (v60 >> 3) & 0x1FF;
v73 = *(_QWORD *)(UltraMapping + 8 * v72);
v74 = (__int64 *)(UltraMapping + 8 * v72);
v111 = v73;
v75 = v73 & 0xFFFFFFFFF000i64 | (32 * (v61 & 0x1F | 0x40));
if( qword_140C4DC80 )
{
if( (v75 & qword_140C4DC80) != 0 )
v75 |= 0x10ui64;
else
v75 |= qword_140C4DC80;
}
v111 = v75;
if( v74 >= (__int64 *)v70
&& v74 <= (__int64 *)v71
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (v75 & 1) != 0 )
{
v75 |= 0x8000000000000000ui64;
}
*v74 = v75;
MiUnmapPageInHyperSpaceWorker(v74, 0x11u, 0x80000000ui64);
v55 = *((_QWORD *)v21 + 3);
v56 = 0i64;
v28 = v112;
v24 = v127;
v3 = v125;
v52 = v105;
v58 = 4;
}
--*((_WORD *)v21 + 16);
v76 = (UNICODE_STRING *)((v55 >> 62) & 1);
if( *((_WORD *)v21 + 16) )
{
v77 = v21[34];
if( (_DWORD)v76 )
{
v78 = v77 | 7;
}
else if( (v77 & 0x10) != 0 )
{
v78 = v77 & 0xF8 | 3;
}
else
{
v78 = v77 & 0xF8 | 2;
}
v21[34] = v78;
if( (*((_DWORD *)v21 + 4) & 0x400i64) == 0 && (unsigned int)MiGetPagingFileOffset((MMPTE *)(v21 + 16)) )
*(_BYTE *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v21 + 5) >> 39) & 0x3FFi64)) + 675i64) = 1;
v27 = 3;
if( v52 && v113 )
v28 = 1;
LOBYTE(v79) = MI_PFN_IS_PROTO((UNICODE_STRING *)v21, v76, v56, v57);
if( v79 && !v108 && !BugCheckParameter2 )
v27 = 4;
}
else
{
if( (_DWORD)v76 )
{
v80 = v21[35];
if( (v80 & 0x10) != 0 )
v21[35] = v80 & 0xEF;
v81 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v21 + 5) >> 39) & 0x3FFi64));
v119 = *((_QWORD *)v21 + 2);
if( (v119 & 0x400) == 0 )
{
v82 = (v119 & 4) != 0 || (v119 & 2) != 0 ? MI_READ_PTE_LOCK_FREE((INT64)&v119) : v56;
v119 = v82;
if( v82 )
MiReleasePageFileInfo(
v81,
v82,
0,
(INT64)v57,
BugCheckParameter4,
v98,
v99,
a8,
(INT64)a9,
a10,
v103,
a12);
}
MiInsertPageInFreeOrZeroedList(v24 / 48, 2ui64);
}
else
{
v86 = *((_QWORD *)v21 + 2);
v87 = -9i64;
if( (v86 & 0x400) != 0 )
v87 = -2049i64;
*((_QWORD *)v21 + 2) = v86 & v87;
v88 = v21[34];
if( (v88 & 0x10) != 0 )
{
v89 = 136i64;
if( v123 != 1 )
v89 = 8i64;
MiInsertPageInList((_MMPFN *)v21, v89);
}
else
{
v90 = v123;
v21[34] = v88 & 0xF8 | 2;
if( v90 <= 1 || (unsigned int)MiGetPfnPriority((INT64)v21) >= 5 )
MiInsertPageInList((_MMPFN *)v21, v58);
else
MiInsertProtectedStandbyPage(v91, (UINT64)v21);
}
}
v27 = 4;
}
}
if( v28 == 1 )
MiChargeCommit(Partition, 1ui64, 4ui64);
_InterlockedAnd64((volatile signed __int64 *)v21 + 3, 0x7FFFFFFFFFFFFFFFui64);
LODWORD(v21) = 0;
if( v109 )
{
*(_QWORD *)&EventData.Size = 24i64;
EventData.Ptr = (unsigned __int64)a2a;
LODWORD(BugCheckParameter4) = 289413890;
EtwTraceKernelEvent(&EventData, 1ui64, 0x20000001ui64, 0x277u, BugCheckParameter4);
v109 = 0;
}
v25 = v120;
LABEL_170:
if( v25 )
{
LODWORD(v116) = (_DWORD)v21;
while( _interlockedbittestandset64((volatile signed __int32 *)v25 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v116);
while( *((__int64 *)v25 + 3) < 0 );
}
if( (v25[34] & 7) != 6 )
MiBadShareCount((_MMPFN *)v25);
v83 = (*((_QWORD *)v25 + 3) & 0x3FFFFFFFFFFFFFFFi64) - 1;
*((_QWORD *)v25 + 3) ^= (*((_QWORD *)v25 + 3) ^ v83) & 0x3FFFFFFFFFFFFFFFi64;
if( !v83 )
MiPfnShareCountIsZero((UINT64)v25, 0i64);
_InterlockedAnd64((volatile signed __int64 *)v25 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
v84 = Partition;
if( v22 )
MiReleasePageFileInfo(
(INT64)Partition,
v22,
1,
(INT64)v26,
BugCheckParameter4,
v98,
v99,
a8,
(INT64)a9,
a10,
v103,
a12);
if( v108 )
{
v85 = MiDecrementCombinedPte(v103 + 1664, v108);
goto LABEL_195;
}
if( BugCheckParameter2 )
{
v85 = MiDecrementCloneBlockReference(BugCheckParameter2, (volatile INT64 *)v124, v103);
LABEL_195:
v27 = v85;
}
if( v28 == 1 )
goto LABEL_203;
if( v27 == 3 )
{
if( (*(_BYTE *)(a8 + 184) & 7) == 0 || v84 == v121 )
{
v2 = a9;
++a9[1];
goto LABEL_204;
}
LABEL_203:
v2 = a9;
goto LABEL_204;
}
v2 = a9;
if( v27 == 5 )
++a9[2];
LABEL_204:
if( (*(_BYTE *)(a8 + 184) & 7) != 0 && !MiPteIsSessionDynamicBuffer(v3) )
++*v2;
if( v3 < (unsigned __int64)MmGetPml4eBase()
|| v3 > (unsigned __int64)MmGetPml4eLimit()
|| (*(_BYTE *)(a8 + 184) & 7) == 0 )
{
v92 = ZeroPte;
Pml4eBase = MmGetPml4eBase();
if( v3 >= (unsigned __int64)Pml4eBase
&& v3 <= (unsigned __int64)MmGetPxeUserLimit()
&& (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
&& (ZeroPte & 1) != 0 )
{
v92 = ZeroPte | 0x8000000000000000ui64;
}
v15 = a8;
v13 = (unsigned int)v99;
*(_QWORD *)v3 = v92;
goto LABEL_233;
}
MiWriteTopLevelPxe((_QWORD *)v3, ZeroPte);
v15 = a8;
LABEL_211:
v13 = (unsigned int)v99;
Pml4eBase = MmGetPml4eBase();
goto LABEL_233;
}
v2[1] += MiDeleteBatch(v130);
v93 = MiTryDeleteTransitionPte((UINT64 *)v3);
if( v93 == 1 )
{
BugCheckParameter3 = MI_READ_PTE_LOCK_FREE(v3);
v94 = BugCheckParameter3;
MiReleasePageFileSpace(v121, BugCheckParameter3, 1i64);
if( (*(_BYTE *)(v15 + 184) & 7) != 0 )
{
++v2[3];
if( !MiPteIsSessionDynamicBuffer(v3) )
++*v2;
}
else if( IS_PTE_NOT_DEMAND_ZERO(v94) )
{
++v2[3];
}
*(_QWORD *)v3 = ZeroPte;
goto LABEL_211;
}
++v2[3];
if( (*(_BYTE *)(a8 + 184) & 7) != 0 && !MiPteIsSessionDynamicBuffer(v3) )
++*v2;
v15 = a8;
v13 = (unsigned int)v99;
v9 = a12;
Pml4eBase = MmGetPml4eBase();
if( v93 == 3 )
++v2[1];
}
LABEL_234:
v14 = v122;
v3 += 8i64;
v125 = v3;
if( v3 > v126 )
break;
v11 = v105;
LOBYTE(v7) = v106;
}
}
result = MiDeleteBatch(v130);
if( (_DWORD)v99 )
{
v96 = HIWORD(*(_DWORD *)(v14 + 16)) & 0x3FF;
if( v96 < (unsigned int)v99 )
KeBugCheckEx(0x1Au, 0x41790ui64, v14, v96, (unsigned int)v99);
HIDWORD(v116) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v14 + 24), 0x3Fui64) )
{
do
{
KeYieldProcessorEx((UINT64 *)((char *)&v116 + 4));
result = *(_QWORD *)(v14 + 24);
}
while( result < 0 );
}
*(_QWORD *)(v14 + 16) ^= ((unsigned int)*(_QWORD *)(v14 + 16) ^ (((unsigned int)(*(_QWORD *)(v14 + 16) >> 16)
- (_DWORD)v99) << 16)) & 0x3FF0000;
_InterlockedAnd64((volatile signed __int64 *)(v14 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
return result;
}Referenced by:
MiDeleteEmptyPageTableTail
MiDeleteVaTail