IopCancelWaitCompletionPacket

CHAR __fastcall IopCancelWaitCompletionPacket(KWAIT_BLOCK *Entry, CHAR a2, UINT8 a3){
  void *Object; 
  unsigned __int64 v5; 
  __int16 *WaitObject; 
  __int16 *v8; 
  UINT8 v9; 
  void *SparePtr; 
  Object = Entry[1].Object;
  v5 = a3;
  WaitObject = (__int16 *)ObpGetWaitObject((INT64)Object - 48);
  v8 = 0i64;
  if( WaitObject != &ObpDefaultObject )
    v8 = WaitObject;
  v9 = KeDeregisterObjectNotification(v8, Entry);
  SparePtr = Entry[1].SparePtr;
  if( !v9 && (!a2 || !KeRemoveQueueEntry((_KQUEUE *)Entry[1].SparePtr, &Entry->WaitListEntry)) )
    return 0;
  Entry[1].SparePtr = 0i64;
  LOBYTE(Entry[2].WaitListEntry.Blink) = 0;
  KxReleaseSpinLock((UINT64 *)&Entry[2]);
  __writecr8(v5);
  ObfDereferenceObjectWithTag(Object, 0x746C6644ui64);
  ObfDereferenceObjectWithTag(SparePtr, 0x746C6644ui64);
  ObfDereferenceObjectWithTag(Entry, 0x746C6644ui64);
  return 1;
}

Referenced by:

IopCloseWaitCompletionPacket
NtCancelWaitCompletionPacket