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