IopCancelApcRequired

VOID __fastcall IopCancelApcRequired(_ETHREAD *Thread, _FILE_OBJECT *FileObject, _IO_STATUS_BLOCK *IoRequestToCancel){
  unsigned __int64 *p_IrpListLock; 
  unsigned __int64 v7; 
  _LIST_ENTRY *Flink; 

  p_IrpListLock = &Thread->IrpListLock;
  v7 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&Thread->IrpListLock);
  Flink = Thread->IrpList.Flink;
  if( Flink != &Thread->IrpList && (IoRequestToCancel || FileObject) )
  {
    do
    {
      if( ((__int64)Flink[-1].Flink & 2) == 0
        && ((_IO_STATUS_BLOCK *)Flink[2].Blink == IoRequestToCancel
         && (!FileObject || (_FILE_OBJECT *)Flink[10].Flink == FileObject)
         || !IoRequestToCancel && (_FILE_OBJECT *)Flink[10].Flink == FileObject) )
      {
        break;
      }
      Flink = Flink->Flink;
    }
    while( &Thread->IrpList != Flink );
  }
  KxReleaseSpinLock(p_IrpListLock);
  __writecr8(v7);
}

Referenced by:

IopCancelIrpsInThreadListForCurrentProcess
IopCancelSynchronousIrpsForThread