CmpEnumerateCallback
LIST_ENTRY *__fastcall CmpEnumerateCallback(VOID **EnumerationContext){
_ETHREAD *CurrentThread;
LIST_ENTRY *v3;
unsigned __int64 v4;
LIST_ENTRY *Flink;
LIST_ENTRY *Blink;
int v8[10];
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&CmpCallbackListLock, 0i64);
v3 = &CallbackListHead;
if( *EnumerationContext )
v3 = (LIST_ENTRY *)*EnumerationContext;
v4 = (unsigned __int64)*EnumerationContext & -(__int64)(*EnumerationContext != 0i64);
Flink = v3->Flink;
Blink = 0i64;
while( Flink != &CallbackListHead )
{
if( SLODWORD(Flink[1].Flink) >= 0 )
{
_InterlockedIncrement((volatile signed __int32 *)&Flink[1]);
Blink = Flink[2].Blink;
*EnumerationContext = Flink;
break;
}
Flink = Flink->Flink;
}
ExReleasePushLockEx((UINT64)&CmpCallbackListLock, 0i64);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v4 )
{
if( _InterlockedDecrement((volatile signed __int32 *)(v4 + 16)) == 0x80000000 )
{
_InterlockedOr(v8, 0);
if( CallbackListDeleteEvent.0 )
ExfUnblockPushLock(&CallbackListDeleteEvent, 0i64);
}
}
return Blink;
}Referenced by:
No references.