CmFcManagerUpdateFeatureConfigurations
INT64 __fastcall CmFcManagerUpdateFeatureConfigurations(INT64 a1, INT64 a2, INT64 a3, _DWORD *a4, UINT64 a5){
__int64 v5;
__int64 v7;
__int64 v8;
INT64 *v9;
INT64 v10;
__int64 v11;
int Section;
INT64 v13;
_DWORD *v14;
INT64 v15;
_DWORD *v16;
INT64 v17;
NTSTATUS updated;
INT64 v19;
INT64 v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
INT64 v25;
INT64 v26;
INT64 *v27;
INT64 a2a;
int v30[2];
__int64 v31;
_DWORD *a3a;
_QWORD a4a[2];
__int64 v34;
INT64 v35;
INT64 v36;
INT64 result[10];
struct _EVENT_DATA_DESCRIPTOR v38;
_DWORD **p_a3a;
int v40;
int v41;
a2a = 0i64;
v35 = 0i64;
v5 = (int)a3;
a3a = a4;
v36 = 0i64;
v34 = 0i64;
*(_OWORD *)a4a = 0i64;
memset((INT64)result, 0i64);
v31 = 0x100000000i64;
v30[0] = 0;
v7 = *((unsigned int *)&v31 + v5);
v30[1] = 1;
v30[0] = v30[v5];
v8 = 3 * v7;
v31 = 3 * v7;
v9 = &result[3 * v7];
KeEnterCriticalRegion();
CmpVolumeManagerLockContextListExclusive((UINT64)&stru_140C47E90);
RtlpFcBufferManagerReferenceBuffers((INT64)&qword_140C47EF0, (INT64)&a2a, &v35);
v10 = v35;
v11 = 3i64;
if( a2 && a2a != a2 )
{
Section = -1073741823;
goto LABEL_4;
}
v13 = CmFcpIncrementChangeStamp(a2a);
v14 = a3a;
v15 = v13;
v16 = *(_DWORD **)(v10 + 8 * v8 + 8);
a2a = 0i64;
a4a[0] = v13;
*v9 = v13;
updated = RtlpFcUpdateFeatureConfiguration(v16, v17, v14, (unsigned int)a5, 0i64, (size_t *)&a2a);
Section = updated;
if( updated >= 0 )
{
v20 = v36;
goto LABEL_18;
}
if( updated == -2147483643 )
{
Section = CmFcpManagerCreateSection((_LARGE_INTEGER)a2a, v13, *(INT64 *)&CmFcSystemManager, a4a);
if( Section >= 0 )
{
Section = CmFcpMapSection(a4a, v9);
if( Section >= 0 )
{
Section = RtlpFcUpdateFeatureConfiguration(
*(_DWORD **)(v10 + 8 * v31 + 8),
v19,
a3a,
(unsigned int)a5,
(VOID *)v9[1],
(size_t *)v9 + 2);
if( Section >= 0 )
{
if( (int)RtlpFcValidateFeatureConfigurationBuffer((UINT64 *)v9[1], v9[2]) < 0 )
{
if( (unsigned int)dword_140C01988 > 5 && tlgKeywordOn((__int64)&dword_140C01988, 0x400000000001i64) )
{
v41 = 0;
p_a3a = &a3a;
a3a = (_DWORD *)0x1000000;
v40 = 8;
tlgWriteTransfer_EtwWriteTransfer(
(__int64)&dword_140C01988,
(unsigned __int8 *)byte_140022E1F,
0i64,
0i64,
3u,
&v38);
}
Section = -1073741595;
goto LABEL_4;
}
v20 = v34;
v15 = a4a[0];
LABEL_18:
RtlpFcBufferManagerDereferenceBuffers(&qword_140C47EF0, v10);
CmpVolumeManagerLockContextListExclusive((UINT64)&RunOnce);
v21 = 3i64 * (unsigned int)v30[0];
v22 = *(&qword_140C47EA8 + 3 * (unsigned int)v30[0]);
*(&qword_140C47EA8 + v21) = v15;
v23 = *(&qword_140C47EA8 + v21 + 1);
a4a[0] = v22;
*(&qword_140C47EA8 + v21 + 1) = a4a[1];
v24 = *(&qword_140C47EA8 + v21 + 2);
*(&qword_140C47EA8 + v21 + 2) = v20;
a4a[1] = v23;
v34 = v24;
RtlpFcBufferManagerUpdateBuffers(&qword_140C47EF0, v13, (INT64)result);
RtlpFcWriteHighLowHigh((INT64)&qword_140C47E98, v13);
RtlpFcWriteHighLowHigh(0xFFFFF78000000710ui64, v25);
CmSiRWLockReleaseExclusive(&RunOnce);
CmSiRWLockReleaseExclusive(&stru_140C47E90);
CmFcpManagerPublishChangeNotifications(v26, v13);
Section = 0;
goto LABEL_19;
}
}
}
}
LABEL_4:
CmSiRWLockReleaseExclusive(&stru_140C47E90);
if( v10 )
RtlpFcBufferManagerDereferenceBuffers(&qword_140C47EF0, v10);
LABEL_19:
v27 = result;
do
{
CmFcpUnmapSection((INT64)v27);
v27 += 3;
--v11;
}
while( v11 );
CmFcpCleanupSectionState((INT64)a4a);
KeLeaveCriticalRegion();
return(unsigned int)Section;
}Referenced by:
CmUpdateFeatureConfiguration