MiDeleteNonPagedPoolPte
NTSTATUS __stdcall MiDeleteNonPagedPoolPte(PVOID BugCheckParameter2){
INT64 v1;
int v2;
int v4;
UINT64 v5;
UINT64 v6;
UINT64 v7;
__int64 v8;
int i;
__int64 v10;
__int64 v11;
_MMPFN *v12;
unsigned __int64 Long;
int v14;
int v15;
bool v16;
UINT64 v17;
int v18;
UINT64 v19;
void *v21;
INT64 BugCheckParameter4;
__int64 v23;
UINT64 v24[7];
UINT64 SpinCount;
v4 = v2;
v5 = v1;
LODWORD(v6) = MI_READ_PTE_LOCK_FREE(v1);
v24[0] = v6;
v7 = v6;
if( (v6 & 1) != 0 && v4 <= 1 )
{
v8 = 1i64;
for( i = v4; i; --i )
v8 <<= 9;
v10 = *((_QWORD *)BugCheckParameter2 + 21);
if( (v7 & 0x80u) != 0i64 )
{
if( (*(_DWORD *)(v10 + 204) & 1) != 0 )
{
LODWORD(v21) = MiGetLeafVa(v5);
if( (unsigned __int64)v21 < *((_QWORD *)BugCheckParameter2 + 4)
|| (unsigned __int64)v21 + 4096 * BugCheckParameter4 - 1 > *((_QWORD *)BugCheckParameter2 + 5) )
{
KeBugCheckEx(0x1Au, (PVOID)0x5306, BugCheckParameter2, v21, (PVOID)BugCheckParameter4);
}
MiDecommitLargePoolVa(v21, v5, BugCheckParameter4);
*(_DWORD *)(v10 + 212) += 512;
}
}
else
{
MiPteInShadowRange((UINT64)v24);
v11 = (v7 >> 12) & 0xFFFFFFFFFi64;
v12 = &MmGetPfnDb()[v11];
if( v4 == 1 )
{
if( (v12->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 1
|| !MiEvictPageTableLock((INT64)&stru_140C4DB30 + 6224, (UINT64 *)v5, ZeroPte.u.Hard._bf_0, 2) )
{
return 0;
}
}
else
{
if( (*(_DWORD *)(v10 + 204) & 1) == 0 )
return 0;
Long = ZeroPte.u.Long;
LOBYTE(v14) = MiPteInShadowRange(v5);
if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)v5 = Long;
if( (*((_BYTE *)&v12->u3 + 3) & 0x10) == 0 )
++*(_DWORD *)(v10 + 212);
}
v15 = *(_DWORD *)(v10 + 208);
if( !v15 )
{
LODWORD(v23) = MiGetContainingPageTable(v5);
*(_QWORD *)(v10 + 216) = v23;
}
*(_DWORD *)(v10 + 208) = v15 + 1;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v12->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v12->u2._bf_0 < 0 );
}
if( (*(_DWORD *)(v10 + 204) & 2) == 0 )
{
if( v12->u3.ReferenceCount != 1 )
KeBugCheckEx(
0x4Eu,
(PVOID)0x9A,
(PVOID)(v11 * 48 / 48),
(PVOID)(*(_BYTE *)(&v12->u3 + 1) & 7),
(PVOID)v12->u3.ReferenceCount);
*((_BYTE *)&v12->u3 + 2) = *(_BYTE *)(&v12->u3 + 1) & 0xF8 | 5;
}
if( v4 )
{
v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = *(_QWORD *)(v10 + 192);
*(_QWORD *)(v10 + 192) = v12;
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiInsertRecursiveTbFlushEntries((_MI_TB_FLUSH_LIST *)v10, (unsigned int)v4, v5);
}
else
{
if( (*(_DWORD *)(v10 + 204) & 2) == 0 )
{
v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = *(_QWORD *)(v10 + 184);
*(_QWORD *)(v10 + 184) = v12;
}
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v16 = (*(_DWORD *)(v10 + 200) & 0x40000000) == 0;
v24[0] = 0i64;
if( v16 )
{
MiInitializeTbFlushStamps(v24);
v17 = v24[0];
LOBYTE(v18) = MiPteInShadowRange(v5);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
v17 |= 0x8000000000000000ui64;
*(_QWORD *)v5 = v17;
}
v19 = v24[0];
if( *(&stru_140C4DB30 + 42) && (v24[0] & 0x10) == 0 )
v19 = v24[0] & ~*(&stru_140C4DB30 + 42);
if( (v19 & 0xFFFFFFFF00000000ui64) == 0 )
MiInsertTbFlushEntry(
(_MI_TB_FLUSH_LIST *)v10,
(VOID *)((__int64)((v5 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
1ui64,
0i64);
}
}
}
return 0;
}Referenced by:
MiClearNonPagedPtes