RtlpFcCalculateRequiredSizeForNewUsageSubscriptionTable
NTSTATUS __fastcall RtlpFcCalculateRequiredSizeForNewUsageSubscriptionTable(
_DWORD *a1,
INT64 *a2,
UINT64 a3,
UINT64 *a4){
UINT64 v5;
UINT64 v6;
_DWORD *v8;
UINT64 v9;
INT64 *v10;
char *v11;
int v12;
UINT64 v13;
int v14;
UINT64 v15;
int v16;
UINT64 v17;
_DWORD *v18;
bool v19;
UINT64 v20;
NTSTATUS result;
UINT64 v22;
UINT64 v23;
v5 = 0i64;
v6 = 0i64;
if( a1 )
{
v5 = (unsigned int)*a1;
v8 = a1 + 1;
v9 = v5;
if( *a1 )
{
v10 = a2;
v11 = (char *)a2 + 4;
do
{
if( v6 >= a3 )
goto LABEL_20;
v12 = RtlpFcCompareUsageSubscriptionToUsageSubscription((INT64)v8, (INT64)v11);
if( v12 )
{
if( v12 != 1 )
{
++v13;
v8 += 4;
continue;
}
v16 = *(_DWORD *)v10;
v15 = v5 + 1;
v10 = (INT64 *)((char *)v10 + 20);
++v6;
v11 += 20;
if( v16 )
v15 = v5;
}
else
{
v14 = *(_DWORD *)v10;
v15 = v5 - 1;
v10 = (INT64 *)((char *)v10 + 20);
++v13;
v8 += 4;
++v6;
v11 += 20;
if( !v14 )
v15 = v5;
}
v5 = v15;
}
while( v13 < v9 );
}
}
if( v6 < a3 )
{
v17 = a3 - v6;
v18 = (_DWORD *)a2 + 5 * v6;
do
{
v19 = *v18 == 0;
v20 = v5 + 1;
v18 += 5;
if( !v19 )
v20 = v5;
v5 = v20;
--v17;
}
while( v17 );
}
LABEL_20:
if( v5 )
{
result = RtlULongLongMult(v5, 0x10ui64, a4);
if( result >= 0 )
{
v22 = -1i64;
v23 = *a4 + 4;
if( v23 >= *a4 )
v22 = *a4 + 4;
result = v23 < *a4 ? 0xC0000095 : 0;
*a4 = v22;
}
}
else
{
*a4 = 0i64;
return 0;
}
return result;
}Referenced by:
RtlpFcUpdateUsageTriggers