MiDeleteBootRange
VOID __stdcall MiDeleteBootRange(_MMPTE *PointerPte, UINT64 PageCount, UINT64 NonPaged){
_MMPTE *v3;
UINT64 v4;
_MMPTE *PteBase;
UINT64 v6;
char *v7;
char *v8;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v10;
UINT8 v11;
UINT64 v12;
_MMPFN *PfnDb;
unsigned __int64 v14;
_MMPFN *v15;
UINT8 v16;
_MMSUPPORT_INSTANCE *v17;
_ETHREAD *CurrentThread;
_MMSUPPORT_SHARED *v19;
UINT8 v20;
UINT8 v21;
UINT64 v22;
unsigned __int64 v23;
_MMPFN *v24;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v26;
__int64 CachedResidentAvailable;
bool v28;
signed __int32 v29;
UINT64 v30;
__int64 v31;
__int64 v32;
unsigned __int64 v33;
unsigned __int64 i;
__int16 v35;
INT64 v36;
_MMPTE *PdeBase;
__int64 v38;
unsigned __int64 v39;
unsigned __int64 v40;
char *v41;
_MI_TB_FLUSH_LIST *v42;
_MMSUPPORT_SHARED *v43;
UINT8 v44;
UINT64 Flags;
_MMSUPPORT_INSTANCE *Vm;
char *v47;
_MI_DELETE_VA_INFO DeleteInfo;
__int128 v49;
__int128 v50;
UINT64 SpinCount;
UINT64 v54;
LODWORD(SpinCount) = NonPaged;
v3 = PointerPte;
v4 = PageCount;
PteBase = MmGetPteBase();
DeleteInfo = 0i64;
v49 = 0i64;
v50 = 0i64;
v6 = (UINT64)PteBase + (((unsigned __int64)PointerPte >> 9) & 0x7FFFFFFFF8i64);
v7 = (char *)v6;
v8 = (char *)PteBase + (((unsigned __int64)&PointerPte[v4 - 1] >> 9) & 0x7FFFFFFFF8i64);
v47 = v8;
Vm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, PteBase);
SharedVm = MiGetSharedVm(Vm);
v10 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
v11 = v10;
if( v6 <= (unsigned __int64)v8 )
{
v12 = v6;
PfnDb = MmGetPfnDb();
do
{
v14 = *(_QWORD *)v7;
MiPteInShadowRange(v12);
v15 = &PfnDb[(v14 >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v15->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v15->u2._bf_0 < 0 );
}
v15->u2._bf_0 ^= ((v15->u2._bf_0 + 1) ^ v15->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v15->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v7 += 8;
v12 = (UINT64)v7;
}
while( v7 <= v8 );
v4 = PageCount;
v3 = PointerPte;
}
v16 = v11;
v17 = Vm;
MiUnlockWorkingSetExclusive(Vm, v16);
LODWORD(Flags) = 1;
MiDeleteSystemPagableVm(Vm, 0i64, v3, v4, Flags, &DeleteInfo);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite((UINT64)&PsLoadedModuleResource, 1);
v19 = MiGetSharedVm(Vm);
v20 = ExAcquireSpinLockExclusive((INT64 *)&v19->WorkingSetLock);
v19->GoodCitizenWaiting = 0;
v21 = v20;
if( v6 <= (unsigned __int64)v47 )
{
v22 = v6;
do
{
v23 = *(_QWORD *)v6;
MiPteInShadowRange(v22);
v24 = &MmGetPfnDb()[(v23 >> 12) & 0xFFFFFFFFFi64];
LODWORD(v54) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v24->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v54);
while( v24->u2._bf_0 < 0 );
}
v24->u2._bf_0 ^= ((v24->u2._bf_0 - 1) ^ v24->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v24->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (v24->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
{
v31 = (_QWORD)MmGetPteBase() << 25;
v32 = (__int64)((v6 << 25) - v31) >> 16;
v33 = v32;
for( i = v32 + 4096; v33 < i; v33 += 8i64 )
{
v35 = MI_READ_PTE_LOCK_FREE(v33);
if( (v35 & 0xC01) != 0 || (v35 & 0x3E0) != 0 && (v35 & 0x3E0) != 768i64 )
break;
}
if( v33 == i )
{
v36 = PsLoadedModuleList;
PdeBase = MmGetPdeBase();
v38 = ((v32 << 25) - v31) >> 16;
while( 1 )
{
v39 = *(_QWORD *)(v36 + 48);
v40 = v39
+ (((unsigned int)dword_140C4C9F0 + 4095i64) & 0xFFFFFFFFFFFFF000ui64)
+ (unsigned int)(*(_DWORD *)(v36 + 64) - 1);
if( v39 != PsNtosImageBase && (PVOID)v39 != PsHalImageBase )
v40 += (unsigned __int64)(unsigned int)dword_140C4C98C << 12;
v41 = (char *)PdeBase + ((v40 >> 18) & 0x3FFFFFF8);
if( v6 >= (unsigned __int64)PdeBase + ((v39 >> 18) & 0x3FFFFFF8) && v6 <= (unsigned __int64)v41 )
break;
v36 = *(_QWORD *)v36;
if( (INT64 *)v36 == &PsLoadedModuleList )
goto LABEL_30;
}
v36 = 0i64;
LABEL_30:
v17 = Vm;
if( v36 )
{
MiUnlockWorkingSetExclusive(Vm, v21);
MiReturnSystemVa((VOID *)v38, (VOID *)(v38 + 0x200000), MiVaDriverImages, v42);
v43 = MiGetSharedVm(Vm);
v44 = ExAcquireSpinLockExclusive((INT64 *)&v43->WorkingSetLock);
v43->GoodCitizenWaiting = 0;
v21 = v44;
}
}
else
{
v17 = Vm;
}
}
v6 += 8i64;
v22 = v6;
}
while( v6 <= (unsigned __int64)v47 );
v4 = PageCount;
}
MiUnlockWorkingSetExclusive(v17, v21);
ExReleaseResourceLite(&PsLoadedModuleResource);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
CurrentPrcb = KeGetCurrentPrcb();
v26 = v4;
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( v4 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v4 >= 0x80000 )
break;
v29 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
v4 + CachedResidentAvailable,
CachedResidentAvailable);
v28 = (_DWORD)CachedResidentAvailable == v29;
LODWORD(CachedResidentAvailable) = v29;
if( v28 )
goto LABEL_18;
}
while( v29 != -1 && v4 + v29 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v26 = v4 + (int)CachedResidentAvailable - 192;
}
}
if( v26 )
_InterlockedExchangeAdd64((_QWORD *)&stru_140C50B28 + 883, v26);
LABEL_18:
v30 = v4 - *(_QWORD *)&DeleteInfo.ReducedCommitClonePages;
MiReturnCommit(&Irp, v30);
*(&stru_140C4DB30 + 568) -= v30;
}Referenced by:
MmFreeBootRegistry
MmFreeLoaderBlock