CmFcManagerRegisterFeatureConfigurationChangeNotification

INT64 __fastcall CmFcManagerRegisterFeatureConfigurationChangeNotification(){
  _QWORD *v0; 
  _QWORD *v1; 
  unsigned int v2; 
  INT64 v3; 
  _ETHREAD *CurrentThread; 
  INT64 *v5; 
  INT64 *v7; 
  v1 = v0;
  v2 = 0;
  v3 = CmFcpManagerAllocateChangeSubscription();
  if( v3 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx((UINT64)&stru_140C480B0, 0i64);
    v5 = (INT64 *)qword_140C480C0;
    if( *(__int64 **)qword_140C480C0 != &qword_140C480B8 )
      __fastfail(3u);
    *(_QWORD *)v3 = &qword_140C480B8;
    *(_QWORD *)(v3 + 8) = v5;
    *v5 = v3;
    qword_140C480C0 = v3;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&stru_140C480B0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&stru_140C480B0);
    KeAbPostRelease(&stru_140C480B0);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    if( v1 && MiGetPfnLink((INT64)&qword_140C47E98) != *v1 )
      CmFcpWorkItemQueueWork((PWORK_QUEUE_ITEM)(v3 + 16));
    *v7 = v3;
  }
  else
  {
    return(unsigned int)-1073741670;
  }
  return v2;
}

Referenced by:

CmFcRegisterFeatureConfigurationChangeNotification