MiUnlockPageTableCharges
VOID __stdcall MiUnlockPageTableCharges(ULONG_PTR Pfn1, UINT8 OldIrql, UINT64 RealPageTable){
_MI_PARTITION *v3;
_MMPFN *v4;
NTSTATUS IsLowestPageTablePage;
int v6;
unsigned __int64 v7;
UINT64 v8;
__int64 bf_0;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
struct _KPRCB *CurrentPrcb;
__int64 CachedResidentAvailable;
bool v15;
signed __int32 v16;
UINT64 SpinCount;
v3 = 0i64;
v4 = *(_MMPFN **)&Pfn1;
if( OldIrql == 2 )
{
IsLowestPageTablePage = MiIsLowestPageTablePage(*(_MMPFN **)&Pfn1);
v6 = 3;
}
else
{
if( !OldIrql )
{
v6 = 4;
goto LABEL_7;
}
IsLowestPageTablePage = 1;
v6 = 1;
}
if( !IsLowestPageTablePage )
goto LABEL_38;
LABEL_7:
if( (v4->u2._bf_0 & 0x3FFFFFFFFFFFFFFFui64) < 0x10000 )
LABEL_38:
KeBugCheckEx(
0x1Au,
(PVOID)0x41791,
v4,
(PVOID)(v4->PteLong | 0x8000000000000000ui64),
(PVOID)(v4->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64));
v7 = 0i64;
v8 = 0i64;
while( 1 )
{
bf_0 = v4->u4._bf_0;
LODWORD(SpinCount) = 0;
v10 = bf_0 & 0xFFFFFFFFFi64;
while( _interlockedbittestandset64((volatile signed __int32 *)&v4->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v4->u2._bf_0 < 0 );
}
v11 = v4->u2._bf_0 ^ ((v4->u2._bf_0 - 0x10000) ^ v4->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
v4->u2._bf_0 = v11;
v12 = v11 & 0x3FFFFFFFFFFFFFFFi64;
if( v12 >= 0x10000 )
break;
if( !v3 )
v3 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v4->u4._bf_0 >> 39) & 0x3FF));
++v7;
if( !v12 && MiPfnShareCountIsZero(v4, 0i64) != PageStillReferenced )
++v8;
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( !--v6 )
goto LABEL_21;
v4 = &MmGetPfnDb()[v10];
}
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_21:
if( v7 )
{
if( v3 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( v7 + CachedResidentAvailable <= 0x100 )
{
do
{
if( v7 >= 0x80000 )
break;
v16 = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + v7,
CachedResidentAvailable);
v15 = (_DWORD)CachedResidentAvailable == v16;
LODWORD(CachedResidentAvailable) = v16;
if( v15 )
goto LABEL_35;
}
while( v16 != -1 && v7 + v16 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v7 += (int)CachedResidentAvailable - 192;
}
}
}
if( v7 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&v3->Vp.ResidentAvailablePages, v7);
}
LABEL_35:
if( v8 )
MiReturnCommit(v3, v8);
}Referenced by:
MiCopyOnWrite
MiDemoteCombinedPte
MiUnlockPageTableRange
MiUnlockWsle
MmUnlockPages
NtLockVirtualMemory