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