IopDeleteIoCompletionInternal

VOID __stdcall IopDeleteIoCompletionInternal(PVOID Object, UINT8 Close){
  UINT8 v4; 
  _LIST_ENTRY *v5; 
  _LIST_ENTRY *v6; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *v8; 
  _LIST_ENTRY *v9; 
  _LIST_ENTRY *Blink; 
  PVOID Objecta[2]; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  *(_OWORD *)Objecta = 0i64;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( Close )
  {
    KeAcquireInStackQueuedSpinLock((UINT64 *)Object + 8, &LockHandle);
    v4 = 0;
    *((_BYTE *)Object + 72) = 1;
  }
  else
  {
    v4 = 1;
  }
  v5 = KeRundownQueueEx((_KQUEUE *)Object, v4);
  v6 = v5;
  if( v5 )
  {
    Flink = v5->Flink;
    if( Flink->Blink == v6 )
    {
      Objecta[0] = Flink;
      Objecta[1] = v6;
      Flink->Blink = (_LIST_ENTRY *)Objecta;
      v6->Flink = (_LIST_ENTRY *)Objecta;
      v6 = (_LIST_ENTRY *)Objecta[0];
      if( Objecta[0] != Objecta )
      {
        do
        {
          v8 = v6;
          v6 = v6->Flink;
          if( LOBYTE(v8[1].Flink) == 2 )
          {
            Blink = v8->Blink;
            if( v6->Blink != v8 || Blink->Flink != v8 )
              goto LABEL_23;
            Blink->Flink = v6;
            v6->Blink = Blink;
            IopFreeWaitCompletionPacket(v8, Object);
          }
        }
        while( v6 != (_LIST_ENTRY *)Objecta );
        v6 = (_LIST_ENTRY *)Objecta[0];
      }
      if( v6 == (_LIST_ENTRY *)Objecta )
      {
        v6 = 0i64;
        goto LABEL_4;
      }
      v9 = (_LIST_ENTRY *)Objecta[1];
      if( (PVOID *)v6->Blink == Objecta && *(PVOID **)Objecta[1] == Objecta )
      {
        *(_QWORD *)Objecta[1] = v6;
        v6->Blink = v9;
        Objecta[1] = Objecta;
        Objecta[0] = Objecta;
        goto LABEL_4;
      }
    }
LABEL_23:
    __fastfail(3u);
  }
LABEL_4:
  if( Close )
  {
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
  }
  if( v6 )
  {
    v6->Blink->Flink = 0i64;
    IopFreeCompletionListPackets((struct SLIST_ENTRY *)v6);
  }
}

Referenced by:

IopCloseIoCompletion
IopDeleteIoCompletion