AlpcpLookasidePacketCallbackRoutine

VOID __stdcall AlpcpLookasidePacketCallbackRoutine(_IO_MINI_COMPLETION_PACKET_USER *MiniPacket, PVOID Context){
  _ALPC_COMPLETION_PACKET_LOOKASIDE *v2; 
  int v3; 
  __int64 v6; 
  unsigned int PendingNullCount; 
  unsigned int PendingCheckCompletionListCount; 
  _SINGLE_LIST_ENTRY *Next; 
  void *CompletionPort; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  v2 = (_ALPC_COMPLETION_PACKET_LOOKASIDE *)*((_QWORD *)Context + 2);
  memset(&LockHandle, 0, sizeof(LockHandle));
  v3 = 0;
  while( 1 )
  {
    v6 = 0i64;
    KeAcquireInStackQueuedSpinLock(&v2->Lock, &LockHandle);
    PendingNullCount = v2->PendingNullCount;
    if( PendingNullCount )
    {
      v2->PendingNullCount = PendingNullCount - 1;
    }
    else
    {
      PendingCheckCompletionListCount = v2->PendingCheckCompletionListCount;
      if( PendingCheckCompletionListCount )
      {
        v6 = -1i64;
        v2->PendingCheckCompletionListCount = PendingCheckCompletionListCount - 1;
      }
      else
      {
        Next = v2->FreeListHead.Next;
        MiniPacket = 0i64;
        --v2->ActiveCount;
        *(_QWORD *)Context = Next;
        v2->FreeListHead.Next = (_SINGLE_LIST_ENTRY *)Context;
        if( !v2->ActiveCount && v2->PendingDelete )
          v3 = 1;
      }
    }
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    if( !MiniPacket )
      break;
    if( ObReferenceObjectSafeWithTag(v2->CompletionPort, 0x746C6644ui64) )
    {
      CompletionPort = v2->CompletionPort;
      IoSetIoCompletionEx2(CompletionPort, v2->CompletionKey, (PVOID)v6, 0i64, 0i64, 0, MiniPacket, 0);
      ObfDereferenceObjectWithTag(CompletionPort, 0x746C6644ui64);
      break;
    }
  }
  if( v3 )
    AlpcpDeferredFreeCompletionPacketLookaside(v2);
}

Referenced by:

No references.