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