MiChargePartitionResidentAvailable
_MI_RESAVAIL_CHARGE __stdcall MiChargePartitionResidentAvailable(
_MI_PARTITION *Partition,
UINT64 NumberOfPages,
UINT64 RemainderPages){
signed __int64 ResidentAvailablePages;
unsigned __int64 v6;
__int64 v7;
signed __int64 v8;
_BOOL8 v9;
struct _KPRCB *CurrentPrcb;
unsigned int CachedResidentAvailable;
unsigned __int64 v12;
struct _KPRCB *v13;
__int64 v14;
bool v15;
signed __int32 v16;
_KPRCB **v18;
__int64 v19;
unsigned __int32 v20;
unsigned __int64 v21;
if( NumberOfPages + RemainderPages >= NumberOfPages || RemainderPages == 0xFFFFFFFF )
{
ResidentAvailablePages = Partition->Vp.ResidentAvailablePages;
v6 = 0i64;
if( ResidentAvailablePages < 1024 && Partition == &Irp )
{
if( (_DWORD)KeNumberProcessors_0 )
{
v18 = &KiProcessorBlock;
v19 = (unsigned int)KeNumberProcessors_0;
do
{
if( (*v18)->CachedResidentAvailable != -1 )
{
v20 = _InterlockedExchange((volatile __int32 *)&(*v18)->CachedResidentAvailable, -1);
if( v20 != -1 )
v6 += v20;
}
++v18;
--v19;
}
while( v19 );
}
if( v6 >= NumberOfPages )
{
v21 = v6 - NumberOfPages;
if( v21 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages, v21);
return 3;
}
NumberOfPages -= v6;
}
if( ResidentAvailablePages <= 0 )
{
LABEL_46:
if( RemainderPages != 0xFFFFFFFF )
{
LABEL_47:
++*(&stru_140C4DB30 + 641);
if( v6 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages, v6);
return 0;
}
_InterlockedExchangeAdd64(
(volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages,
-(__int64)NumberOfPages);
return 3;
}
while( 1 )
{
if( NumberOfPages + RemainderPages > ResidentAvailablePages && RemainderPages != 0xFFFFFFFF )
goto LABEL_47;
v7 = _InterlockedCompareExchange64(
(volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages,
ResidentAvailablePages - NumberOfPages,
ResidentAvailablePages);
if( ResidentAvailablePages == v7 )
break;
ResidentAvailablePages = v7;
if( v7 <= 0 )
goto LABEL_46;
}
v8 = ResidentAvailablePages - NumberOfPages;
v9 = v8 < 1024;
if( Partition == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = CurrentPrcb->CachedResidentAvailable;
if( CachedResidentAvailable == -1 )
{
if( v8 >= 2048 )
{
_InterlockedCompareExchange((volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable, 0, -1);
CachedResidentAvailable = 0;
goto LABEL_9;
}
}
else if( CachedResidentAvailable < 0x40 )
{
LABEL_9:
if( v8 > 1024 )
{
v12 = 128 - CachedResidentAvailable;
if( v8 == _InterlockedCompareExchange64(
(volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages,
v8 - v12,
v8) )
{
v13 = KeGetCurrentPrcb();
v14 = (int)v13->CachedResidentAvailable;
if( (_DWORD)v14 != -1 )
{
if( v12 + v14 <= 0x100 )
{
do
{
if( v12 >= 0x80000 )
break;
v16 = _InterlockedCompareExchange(
(volatile signed __int32 *)&v13->CachedResidentAvailable,
v12 + v14,
v14);
v15 = (_DWORD)v14 == v16;
LODWORD(v14) = v16;
if( v15 )
return v9 + 2;
}
while( v16 != -1 && v12 + v16 <= 0x100 );
}
if( (int)v14 > 192
&& (_DWORD)v14 != -1
&& (_DWORD)v14 == _InterlockedCompareExchange(
(volatile signed __int32 *)&v13->CachedResidentAvailable,
192,
v14) )
{
v12 += (int)v14 - 192;
}
}
if( v12 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&Partition->Vp.ResidentAvailablePages, v12);
}
}
}
}
return v9 + 2;
}
++*(&stru_140C4DB30 + 640);
return 0;
}Referenced by:
MiChargeForLockedPage
MiChargeResident
MiFlushSectionInternal
MiLockPageTablePage
MiMakePageAvoidRead
MiObtainFaultCharges
MiProbeLockFrame
MiResolveProtoPteFault
MmCheckCachedPageStates