RtlpFcUpdateFeatureConfiguration

NTSTATUS __fastcall RtlpFcUpdateFeatureConfiguration(_DWORD *a1, INT64 a2, _DWORD *a3, UINT64 a4, VOID *a5, size_t *a6){
  NTSTATUS result; 
  _DWORD *v10; 
  size_t v11; 
  unsigned __int64 v12; 
  UINT64 v13; 
  unsigned __int64 v14; 
  _DWORD *v15; 
  unsigned __int64 v16; 
  _DWORD *v17; 
  _DWORD *v18; 
  int v19; 
  __int64 v20; 
  _DWORD *v21; 
  int v22; 
  _DWORD *v23; 
  UINT64 v24; 
  size_t Size; 
  Size = 0i64;
  qsort((WCHAR *)a3, a4, (const WCHAR *)0x20, RtlpFcCompareUpdates);
  if( !RtlpFcAreSortedFeatureUpdatesValid(a3, a4) )
    return -1073741811;
  result = RtlpFcCalculateRequiredSizeForNewFeatureTable(a1, a3, a4, &Size);
  if( result >= 0 )
  {
    if( !Size )
    {
      *a6 = 0i64;
      return result;
    }
    if( Size > *a6 )
    {
      *a6 = Size;
      return -2147483643;
    }
    v10 = a5;
    memset((INT64)a5, 0i64);
    *v10 = 0;
    v11 = (size_t)(v10 + 1);
    v12 = 0i64;
    Size = (size_t)(v10 + 1);
    v13 = 0i64;
    if( a1 )
    {
      v14 = (unsigned int)*a1;
      v15 = a1 + 1;
      if( (_DWORD)v14 )
      {
        LODWORD(v16) = *a1;
        v17 = a1 + 1;
        v18 = a3;
        while( 1 )
        {
          v14 = (unsigned int)v16;
          if( v13 >= a4 )
          {
LABEL_19:
            v15 = a1 + 1;
            break;
          }
          v19 = RtlpFcCompareFeatureToUpdate(v17, v18);
          if( v19 )
          {
            if( v19 != 1 )
            {
              ++v12;
              *(_QWORD *)v20 = *(_QWORD *)v17;
              *(_DWORD *)(v20 + 8) = v17[2];
              v11 = v20 + 12;
              ++*v10;
              Size = v11;
              v17 += 3;
              goto LABEL_18;
            }
            RtlpFcCreateAndAddFeatureFromUpdate((INT64)v18);
          }
          else
          {
            RtlpFcApplyUpdateAndAddFeature((INT64)v18, (INT64)v17);
            ++v12;
            v17 += 3;
          }
          v11 = Size;
          ++v13;
          v18 += 8;
LABEL_18:
          v16 = (unsigned int)*a1;
          v14 = v16;
          if( v12 >= v16 )
            goto LABEL_19;
        }
      }
      if( v12 < v14 )
      {
        v21 = &v15[3 * v12];
        do
        {
          ++v12;
          *(_QWORD *)v11 = *(_QWORD *)v21;
          v22 = v21[2];
          v21 += 3;
          *(_DWORD *)(v11 + 8) = v22;
          v11 += 12i64;
          ++*v10;
        }
        while( v12 < (unsigned int)*a1 );
        Size = v11;
      }
    }
    if( v13 < a4 )
    {
      v23 = &a3[8 * v13];
      v24 = a4 - v13;
      do
      {
        RtlpFcCreateAndAddFeatureFromUpdate((INT64)v23);
        v23 += 8;
        --v24;
      }
      while( v24 );
    }
    return 0;
  }
  return result;
}

Referenced by:

CmFcManagerUpdateFeatureConfigurations