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