MiDeletePagablePteRange
void __fastcall MiDeletePagablePteRange(
__int64 a1,
unsigned __int8 a2,
unsigned __int64 a3,
unsigned __int64 a4,
char a5,
int a6,
_QWORD *a7){
unsigned __int64 v7;
int v8;
unsigned __int64 v10;
unsigned __int8 v11;
unsigned __int8 CurrentIrql;
char v13;
int v14;
__int64 v15;
int v16;
int v17;
__int16 Type;
int v19;
char v20;
char v21;
__int64 v22;
_ETHREAD *CurrentThread;
__int16 v24;
unsigned __int8 v25;
LONG *v26;
KIRQL v27;
INT64 *SharedVm;
INT64 *v29;
WORK_QUEUE_TYPE v30;
PVOID v31;
int v32;
_MMPTE *PteBase;
UINT64 v34;
char *i;
__int64 v36;
bool v37;
char v38;
int v39;
_MMPFN *v40;
__int64 v41;
INT64 v42;
int v44;
struct _IO_WORKITEM LockHandle;
__int64 v48;
unsigned __int64 v49;
__int64 v50;
__int128 v51;
__int128 v52;
__int128 v53;
__int128 v54;
__int128 v55;
__int128 v56;
__int64 v57;
INT64(__fastcall *v58)(INT64, UINT64, INT64);
INT64(__fastcall *v59)(INT64 *);
__int128 *v60;
__int128 v61[6];
__int128 v62;
INT64 v63[2];
__int128 v64;
__int64 v65;
int v66;
__int16 v67;
__int16 v68;
__int64 v69;
__int64 v70;
__int64 v71;
__int128 v72;
__int128 v73;
__int128 v74;
__int128 v75;
__int128 v76;
__int128 v77;
__int128 v78;
__int128 v79;
__int128 v80;
__int64 v81;
char v82;
v8 = a6;
v68 = 0;
v10 = a3;
v81 = 0i64;
v11 = a2;
v82 = 4 * (a5 & 7);
LOBYTE(v7) = 0;
v72 = 0i64;
v73 = 0i64;
v74 = 0i64;
v75 = 0i64;
v76 = 0i64;
v77 = 0i64;
v78 = 0i64;
v79 = 0i64;
v80 = 0i64;
memset(&LockHandle, 0, 24);
while( 1 )
{
v44 = v7;
CurrentIrql = v11;
v65 = 2i64;
v13 = 0;
v57 = 0i64;
v62 = 0i64;
v61[1] = (unsigned __int64)a7;
v61[0] = 0i64;
DWORD2(v62) = v8;
memset(&v61[2], 0, 64);
*(_OWORD *)v63 = 0i64;
v64 = 0i64;
*(_OWORD *)&LockHandle.Type = 0i64;
v51 = 0i64;
v52 = 0i64;
v53 = 0i64;
v54 = 0i64;
v55 = 0i64;
v56 = 0i64;
v66 = MiTbFlushType(a1);
*(_QWORD *)&LockHandle.ActivityId.Data4[4] = &v66;
v67 = 0;
v70 = 0i64;
v71 = 0i64;
v69 = 20i64;
BYTE2(LockHandle.Type) = v82 | _mm_cvtsi128_si32(_mm_srli_si128((__m128i)0i64, 2)) & 0xE3;
v60 = v61;
Type = 39;
LOWORD(LockHandle.Type) = 39;
if( v19 )
{
Type = 1059;
LOWORD(LockHandle.Type) = 1059;
}
if( v14 )
{
Type |= 0x800u;
LOWORD(LockHandle.Type) = Type;
}
v20 = BYTE1(LockHandle.ActivityId.Data1);
v49 = v10;
if( v17 )
v20 = 63;
v50 = v15;
BYTE1(LockHandle.ActivityId.Data1) = v20;
v21 = 0;
v48 = a1;
v58 = MiDeleteVa;
v59 = MiDeleteVaTail;
if( v16 )
{
v22 = *(_QWORD *)(a7[4] + 32i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquireAutoExpandPushLockExclusive(v22 + 56, 0i64);
Type = LockHandle.Type;
}
if( a2 != 17 )
{
v21 = 1;
v24 = Type & 0xFFFD;
LOWORD(LockHandle.Type) = v24;
goto LABEL_22;
}
if( (LockHandle.Type & 4) == 0 )
{
SharedVm = MiGetSharedVm(a1);
v27 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
LABEL_20:
LODWORD(v7) = v44;
CurrentIrql = v27;
goto LABEL_21;
}
v25 = *(_BYTE *)(a1 + 184) & 7;
if( v25 < 6u )
{
v26 = &dword_140C4F4C0;
if( v25 != 2 )
v26 = (LONG *)(a1 + 192);
v27 = ExAcquireSpinLockShared(v26);
if( v26[1] )
_InterlockedExchange(v26 + 1, 0);
goto LABEL_20;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LABEL_21:
v24 = LockHandle.Type;
LABEL_22:
BYTE2(LockHandle.ActivityId.Data1) = CurrentIrql;
if( (a6 & 0x100) != 0 )
{
if( (a6 & 0x200) == 0 )
v24 = v24 & 0xEFFB | 0x1000;
LOWORD(LockHandle.Type) = v24 & 0xFFFD;
v29 = MiGetSharedVm(a1);
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(v29 + 8);
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(v29 + 8), v30, v31);
}
if( (a6 & 0x80) == 0 )
goto LABEL_37;
if( (_BYTE)v7 )
goto LABEL_37;
if( ((a4 ^ v10) & 0xFFFFFFE00000i64) != 0 )
goto LABEL_37;
v32 = MiFastLockLeafPageTable(a1, v10);
if( !v32 )
goto LABEL_37;
PteBase = MmGetPteBase();
v7 = (unsigned __int64)PteBase + ((v10 >> 9) & 0x7FFFFFFFF8i64);
LockHandle.WorkItem.Parameter = (void *)v7;
LockHandle.Routine = (void(__fastcall *)(void *, void *, _IO_WORKITEM *))((char *)PteBase
+ ((v7 >> 9) & 0x7FFFFFFFF8i64));
LockHandle.IoObject = (char *)PteBase + (((unsigned __int64)LockHandle.Routine >> 9) & 0x7FFFFFFFF8i64);
LockHandle.Context = (char *)PteBase + (((unsigned __int64)LockHandle.IoObject >> 9) & 0x7FFFFFFFF8i64);
v34 = *((_QWORD *)&LockHandle.WorkItem.Parameter + v32);
if( v32 == 1 )
{
for( i = (char *)PteBase + ((a4 >> 9) & 0x7FFFFFFFF8i64); v7 <= (unsigned __int64)i; v7 += 8 * v36 )
{
MiDeleteVa((INT64)&LockHandle.Type, v7, 0i64);
v36 = (unsigned int)HIBYTE(LockHandle.Type) + 1;
HIBYTE(LockHandle.Type) = 0;
}
MiDeleteVaTail((INT64 *)&LockHandle.Type);
v37 = (*((_DWORD *)MiGetUsedPtesHandle(a3) + 4) & 0x3FF0000) == 0;
v38 = v44;
if( v37 )
v38 = 1;
v13 = 1;
LOBYTE(v44) = v38;
}
MiUnlockPageTableInternal(a1, v34);
if( !v13 )
LABEL_37:
MiWalkPageTables((INT64)&LockHandle.Type);
if( (a6 & 0x100) != 0 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
if( (a6 & 0x200) == 0 )
LOWORD(LockHandle.Type) |= 4u;
}
if( !v21 )
{
if( (LockHandle.Type & 4) != 0 )
{
if( (*(_BYTE *)(a1 + 184) & 7u) < 6 )
{
v39 = *(_DWORD *)(a1 + 184);
if( (v39 & 0x8000000) != 0 || (v39 & 0x4000000) != 0 || (v39 & 0x10000000) != 0 )
{
MiPreUnlockWorkingSetShared(a1, CurrentIrql);
LOBYTE(v39) = *(_BYTE *)(a1 + 184);
}
v7 = (unsigned __int64)&dword_140C4F4C0;
if( (v39 & 7) != 2 )
v7 = a1 + 192;
MiCheckProcessShadow();
_InterlockedAnd((volatile signed __int32 *)v7, 0xBFFFFFFF);
_InterlockedDecrement((volatile signed __int32 *)v7);
}
__writecr8(CurrentIrql);
}
else
{
MiUnlockWorkingSetExclusive(a1, CurrentIrql);
}
}
v40 = (_MMPFN *)a7[5];
if( (__int64)v40 < 0 )
{
MiFreeLargePages(v40);
a7[1] = v41;
a7[5] = 0i64;
}
v42 = a7[4];
if( v42 && v63[0] )
MiFreePhysicalPageChain(v42, v63[0], 1i64);
if( (a6 & 0x10) != 0 )
{
v7 = (unsigned __int64)KeGetCurrentThread();
ExReleaseAutoExpandPushLockExclusive(*(_QWORD *)(a7[4] + 32i64) + 56i64, 0i64);
KiLeaveGuardedRegionUnsafe(v7);
}
if( (_BYTE)v44 != 1 )
break;
v10 = a3;
LOBYTE(v7) = 2;
v11 = a2;
v8 = a6;
}
}Referenced by:
MiDeleteSessionAddressSpace
MiDeleteSessionPdes
MiDeleteVad
MiDeleteVadBitmap
MiDeleteVirtualAddresses