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