MiGetCrossPartitionCombineCharges
NTSTATUS __fastcall MiGetCrossPartitionCombineCharges(volatile INT64 *a1, INT64 a2){
int v2;
unsigned __int64 v4;
struct _KPRCB *CurrentPrcb;
__int64 v6;
bool v7;
signed __int32 v8;
v2 = a2;
v4 = 1i64;
if( (_DWORD)a2 && (MiAcquireNonPagedResources((_MI_PARTITION *)a1, 1ui64) & 0x80000000) != 0i64 )
return 0;
if( (int)MiGetCrossPartitionCharges((INT64)a1, 2i64, 1, 1i64) < 0 )
{
if( v2 )
{
MiReturnCommit((_MI_PARTITION *)a1, 1ui64);
if( a1 != (volatile INT64 *)&MiSystemPartition )
goto LABEL_16;
CurrentPrcb = KeGetCurrentPrcb();
v6 = *((int *)CurrentPrcb + 8391);
if( (_DWORD)v6 == -1 )
goto LABEL_16;
if( (unsigned __int64)(v6 + 1) <= 0x100 )
{
do
{
v8 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v6 + 1, v6);
v7 = (_DWORD)v6 == v8;
LODWORD(v6) = v8;
if( v7 )
return 0;
}
while( v8 != -1 && (unsigned __int64)(v8 + 1i64) <= 0x100 );
}
if( (int)v6 > 192
&& (_DWORD)v6 != -1
&& (_DWORD)v6 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v6) )
{
v4 = (int)v6 - 192 + 1i64;
}
if( v4 )
LABEL_16:
_InterlockedExchangeAdd64(a1 + 896, v4);
}
return 0;
}
return 1;
}Referenced by:
MiConvertPrivateToProto
MiConvertStandbyToProto
MiIncrementCombinedPte