MiDecreaseUsedPtesCount
INT64 __fastcall MiDecreaseUsedPtesCount(VOID *OpaquePointer, UINT64 PtesJustZeroed){
ULONG_PTR v3;
int v4;
INT64 result;
UINT64 SpinCount;
v3 = HIWORD(*((_DWORD *)OpaquePointer + 4)) & 0x3FF;
v4 = PtesJustZeroed;
if( v3 < (unsigned int)PtesJustZeroed )
KeBugCheckEx(0x1Au, 0x41790ui64, (ULONG_PTR)OpaquePointer, v3, (unsigned int)PtesJustZeroed);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)OpaquePointer + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)OpaquePointer + 3) < 0 );
}
result = ((unsigned int)(*((_QWORD *)OpaquePointer + 2) >> 16) & 0x3FF) - v4;
*((_QWORD *)OpaquePointer + 2) ^= ((unsigned int)*((_QWORD *)OpaquePointer + 2) ^ ((((*((_QWORD *)OpaquePointer + 2) >> 16) & 0x3FF)
- v4) << 16)) & 0x3FF0000;
_InterlockedAnd64((volatile signed __int64 *)OpaquePointer + 3, 0x7FFFFFFFFFFFFFFFui64);
return result;
}Referenced by:
MiDeleteLargeUserPde
MiReducePteUseCount
MiSetProtectionOnSection
MiUpdateAwePageTable