ExCompareExchangeCallBack
UINT8 __stdcall ExCompareExchangeCallBack(
_EX_CALLBACK *CallBack,
_EX_RUNDOWN_REF *NewBlock,
_EX_CALLBACK_ROUTINE_BLOCK *OldBlock){
signed __int64 i;
signed __int64 *v7;
signed __int64 Count;
signed __int64 v9;
signed __int64 v11;
unsigned __int64 v12;
unsigned int v13;
signed __int64 v14;
bool v15;
signed __int64 v16;
unsigned __int64 v17;
unsigned __int64 v18;
if( NewBlock && !ExAcquireRundownProtectionEx((INT64 *)NewBlock, 16i64) )
return 0;
_m_prefetchw(CallBack);
for( i = *(_QWORD *)CallBack->RoutineBlock; ((unsigned __int64)OldBlock ^ i) <= 0xF; i = v11 )
{
v11 = _InterlockedCompareExchange64(
(volatile signed __int64 *)CallBack,
((unsigned __int64)NewBlock | 0xF) & -(__int64)(NewBlock != 0i64),
i);
if( i == v11 )
break;
}
v7 = (signed __int64 *)(i & 0xFFFFFFFFFFFFFFF0ui64);
if( (_EX_CALLBACK_ROUTINE_BLOCK *)(i & 0xFFFFFFFFFFFFFFF0ui64) != OldBlock )
{
if( NewBlock )
{
_m_prefetchw(NewBlock);
Count = NewBlock->Count;
while( (Count & 1) == 0 )
{
v9 = Count;
Count = _InterlockedCompareExchange64((volatile signed __int64 *)NewBlock, Count - 32, Count);
if( v9 == Count )
return 0;
}
v18 = Count & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v18, 0xFFFFFFFFFFFFFFF0ui64) == 16
&& !_interlockedbittestandreset((volatile signed __int32 *)(v18 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v18 + 8), 0, 0);
}
}
return 0;
}
if( v7 )
{
v12 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ExBootDevicesRemovedEvent + 7);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ExBootDevicesRemovedEvent + 7);
__writecr8(v12);
v13 = (i & 0xF) + 1;
_m_prefetchw(v7);
v14 = *v7;
if( (*v7 & 1) != 0 )
{
LABEL_18:
v17 = v14 & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v17, -(__int64)v13) == v13
&& !_interlockedbittestandreset((volatile signed __int32 *)(v17 + 32), 0) )
{
KeSetEvent((PRKEVENT)(v17 + 8), 0, 0);
}
}
else
{
while( 1 )
{
v16 = _InterlockedCompareExchange64(v7, v14 - 2 * v13, v14);
v15 = v14 == v16;
v14 = v16;
if( v15 )
break;
if( (v16 & 1) != 0 )
goto LABEL_18;
}
}
}
return 1;
}Referenced by:
DbgkLkmdRegisterCallback
DbgkLkmdUnregisterCallback
IoRegisterPriorityCallback
IoUnregisterPriorityCallback
KeDeregisterBoundCallback
PoRegisterCoalescingCallback
PoUnregisterCoalescingCallback
PsRemoveCreateThreadNotifyRoutine
PsRemoveLoadImageNotifyRoutine
PsSetLoadImageNotifyRoutineEx
PspSetCreateProcessNotifyRoutine