MiDeleteKernelStack
VOID __stdcall MiDeleteKernelStack(_MMPTE *PointerPte, UINT64 DeleteFlags){
__int64 v2;
__int64 v3;
UINT64 v4;
UINT64 v5;
_MI_PARTITION *v6;
_MMPTE *v7;
_MMPTE *v8;
_MMPTE *v9;
unsigned __int8 v10;
UINT64 v11;
_MMPTE *PteBase;
UINT64 Long;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v15;
__int64 CachedResidentAvailable;
unsigned __int64 v17;
bool v18;
signed __int32 v19;
_MMPTE *v20;
unsigned __int64 v21;
int v22;
unsigned __int8 v23;
UINT64 v24;
UINT64 v25;
v21 = 0i64;
if( (DeleteFlags & 1) != 0 )
v2 = 18i64;
else
v2 = *(&stru_140C4DB30 + 3532);
v3 = (unsigned int)(v2 + 1);
v4 = (unsigned int)v2;
v22 = v2 + 1;
v25 = (unsigned int)v2;
v5 = 0i64;
v6 = 0i64;
v7 = &PointerPte[-v2];
v20 = v7;
v8 = v7;
v9 = &v7[v3];
MiLockWorkingSetShared();
v23 = v10;
if( v7 >= v9 )
goto LABEL_15;
v11 = (UINT64)v7;
PteBase = MmGetPteBase();
do
{
if( v5 )
{
if( (v11 & 0xFFF) != 0 )
goto LABEL_7;
MiUnlockPageTableInternal((INT64)&stru_140C4DB30 + 5904, v5);
}
v5 = (UINT64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal((INT64)&stru_140C4DB30 + 5904, v5, 0i64);
LABEL_7:
Long = v7->u.Long;
MiPteInShadowRange(v11);
v24 = Long;
if( (Long & 1) != 0 )
{
if( !v6 )
{
MiPteInShadowRange((UINT64)&v24);
v6 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
+ 8
* (((unsigned __int64)MmGetPfnDb()[(Long >> 12) & 0xFFFFFFFFFi64].u4._bf_0 >> 39) & 0x3FF));
}
MiDeleteValidSystemPage((_MMPTE *)&stru_140C4DB30 + 738, (UINT64)v7, 0i64);
++v21;
}
v11 = (UINT64)++v7;
}
while( v7 < v9 );
v4 = v25;
v8 = v20;
if( v5 )
MiUnlockPageTableInternal((INT64)&stru_140C4DB30 + 5904, v5);
v10 = v23;
LODWORD(v3) = v22;
LABEL_15:
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)((char *)&stru_140C4DB30 + 5904), v10);
if( v6 == &Irp )
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 571, -(__int64)v4);
v15 = v21;
if( v6 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable == -1 )
{
v15 = v21;
}
else
{
v17 = v21;
if( v21 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v17 >= 0x80000 )
break;
v19 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + v17,
CachedResidentAvailable);
v18 = (_DWORD)CachedResidentAvailable == v19;
LODWORD(CachedResidentAvailable) = v19;
if( v18 )
goto LABEL_22;
if( v19 == -1 )
break;
v17 = v21;
}
while( v21 + v19 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v15 = v21 + (int)CachedResidentAvailable - 192;
}
}
}
if( v15 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&v6->Vp.ResidentAvailablePages, v15);
LABEL_22:
MiReleasePtes(
(_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 3432),
v8,
(unsigned int)v3,
(_KTBFLUSH_TYPE)CurrentPrcb);
MiReturnCommit(v6, v4);
}Referenced by:
MiDeleteCachedKernelStack
MmDeleteKernelStack