CmFcManagerUnregisterFeatureConfigurationChangeNotification

_LIST_ENTRY *__fastcall CmFcManagerUnregisterFeatureConfigurationChangeNotification(__int64 a1, _EX_RUNDOWN_REF *a2){
  _ETHREAD *CurrentThread; 
  unsigned __int64 Count; 
  _EX_RUNDOWN_REF **v5; 
  _LIST_ENTRY *result; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 206, 0i64);
  Count = a2->Count;
  if( *(_EX_RUNDOWN_REF **)(a2->Count + 8) != a2 || (v5 = (_EX_RUNDOWN_REF **)a2[1].Count, *v5 != a2) )
    __fastfail(3u);
  *v5 = (_EX_RUNDOWN_REF *)Count;
  *(_QWORD *)(Count + 8) = v5;
  if( (_InterlockedExchangeAdd64((_QWORD *)&CmpDummyThreadEvent + 206, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 206);
  KeAbPostRelease((char *)&CmpDummyThreadEvent + 1648);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  ExWaitForRundownProtectionRelease(a2 + 6);
  ExRundownCompleted((INT64 *)&a2[6]);
  if( a2 < (_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 209 )
    return(_LIST_ENTRY *)ExFreePoolWithTag(a2, 0);
  result = (_LIST_ENTRY *)((char *)&CmpDummyThreadEvent + 1960);
  if( a2 >= (_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 245 )
    return(_LIST_ENTRY *)ExFreePoolWithTag(a2, 0);
  return result;
}

Referenced by:

RtlUnregisterFeatureConfigurationChangeNotification