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.