ExReferenceCallBackBlock
_EX_RUNDOWN_REF *__fastcall ExReferenceCallBackBlock(INT64 *a1){
signed __int64 v2;
signed __int64 v4;
_EX_RUNDOWN_REF *v5;
signed __int64 v6;
signed __int64 v7;
signed __int64 v8;
unsigned __int64 v9;
signed __int64 Count;
bool v11;
signed __int64 v12;
unsigned __int64 v13;
_m_prefetchw(a1);
v2 = *a1;
if( (*a1 & 0xF) != 0 )
{
do
{
v6 = _InterlockedCompareExchange64(a1, v2 - 1, v2);
if( v2 == v6 )
break;
v2 = v6;
}
while( (v6 & 0xF) != 0 );
}
if( !v2 )
return 0i64;
v4 = v2 & 0xF;
if( (v2 & 0xF) != 0 )
{
v5 = (_EX_RUNDOWN_REF *)(v2 & 0xFFFFFFFFFFFFFFF0ui64);
if( v4 == 1 && ExAcquireRundownProtectionEx((INT64 *)v5, 15i64) )
{
_m_prefetchw(a1);
v7 = *a1;
while( (v7 & 0xF) == 0 )
{
if( v5 != (_EX_RUNDOWN_REF *)(v7 & 0xFFFFFFFFFFFFFFF0ui64) )
break;
v8 = v7;
v7 = _InterlockedCompareExchange64(a1, v7 + 15, v7);
if( v8 == v7 )
return v5;
}
_m_prefetchw(v5);
Count = v5->Count;
if( (v5->Count & 1) != 0 )
{
LABEL_24:
v13 = Count & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v13, 0xFFFFFFFFFFFFFFF1ui64) == 15
&& !_interlockedbittestandreset((volatile signed __int32 *)(v13 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v13 + 8), 0, 0);
}
}
else
{
while( 1 )
{
v12 = _InterlockedCompareExchange64((volatile signed __int64 *)v5, Count - 30, Count);
v11 = Count == v12;
Count = v12;
if( v11 )
break;
if( (v12 & 1) != 0 )
goto LABEL_24;
}
}
}
}
else
{
v9 = (unsigned __int8)ExAcquireSpinLockShared((INT64 *)&ExBootDevicesRemovedEvent + 7);
v5 = (_EX_RUNDOWN_REF *)(*a1 & 0xFFFFFFFFFFFFFFF0ui64);
if( v5 && !ExAcquireRundownProtection((_EX_RUNDOWN_REF *)(*a1 & 0xFFFFFFFFFFFFFFF0ui64)) )
v5 = 0i64;
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)&ExBootDevicesRemovedEvent + 14);
__writecr8(v9);
if( !v5 )
return 0i64;
}
return v5;
}Referenced by:
DbgkLkmdRegisterCallback
DbgkLkmdUnregisterCallback
DbgkpLkmdFireCallbacks
ExCallCallBack
ExCallSessionCallBack
IoBoostThreadIoPriority
IoUnregisterPriorityCallback
KeDeregisterBoundCallback
KiEnumerateCallback
KiHandleBound
PoIssueCoalescingNotification
PoUnregisterCoalescingCallback
PsCallImageNotifyRoutines
PsInvokeWin32Callout
PsRemoveCreateThreadNotifyRoutine
PsRemoveLoadImageNotifyRoutine
PspCallProcessNotifyRoutines
PspCallThreadNotifyRoutines
PspSetCreateProcessNotifyRoutine