MiChargeForLockedPage
INT64 __fastcall MiChargeForLockedPage(INT64 a1, CHAR a2){
UINT8 v2;
WCHAR *v3;
int v4;
INT64 v5;
int v6;
INT64 v7;
unsigned int v8;
char v9;
int IsPfnCommitNotCharged;
char v11;
__int64 v12;
ULONG_PTR *v13;
INT64 result;
struct _KPRCB *CurrentPrcb;
signed __int32 v16;
signed __int32 v17;
unsigned int v18;
v4 = a2 & 1;
v5 = (unsigned int)-(v4 != 0);
LOBYTE(v6) = MI_PFN_IS_PROTO((UNICODE_STRING *)a1, (UNICODE_STRING *)(v4 ^ 1u), v2, v3);
if( v6 && (*(_DWORD *)(v7 + 16) & 0x400i64) != 0 )
{
v9 = 1;
}
else
{
IsPfnCommitNotCharged = MiIsPfnCommitNotCharged(v7);
v9 = v11;
if( IsPfnCommitNotCharged )
v9 = 1;
}
v12 = (*(_QWORD *)(v7 + 40) >> 39) & 0x3FFi64;
v13 = *(ULONG_PTR **)(qword_140C4E388 + 8 * v12);
if( !v9 || (result = MiChargeCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v12), 1ui64, v8), (_DWORD)result) )
{
if( v13 == &MiSystemPartition )
{
CurrentPrcb = KeGetCurrentPrcb();
v16 = *((_DWORD *)CurrentPrcb + 8391);
if( v16 )
{
while( v16 != -1 )
{
v17 = v16;
v16 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v16 - 1, v16);
if( v17 == v16 )
return 1;
if( !v16 )
break;
}
}
}
v18 = MiChargePartitionResidentAvailable((INT64)v13, 1ui64, v5);
if( !v18 )
{
if( v9 )
MiReturnCommit((_MI_PARTITION *)v13, 1ui64);
}
return v18;
}
return result;
}Referenced by:
MiAddLockedPageCharge
MiCheckProtoPtePageState
MiLockProtoPoolPage
MiMigratePfn
MiWalkEntireImage