IopCancelIrpsInFileObjectList

UINT64 __stdcall IopCancelIrpsInFileObjectList(
        _FILE_OBJECT *FileObject,
        _EPROCESS *Process,
        _IO_STATUS_BLOCK *IoRequestToCancel,
        _ETHREAD *Thread,
        UINT8 Wait,
        UINT8 Cleanup){
  unsigned __int64 *p_IrpListLock; 
  _ETHREAD *v8; 
  _LIST_ENTRY *hintEntry; 
  unsigned __int8 v10; 
  _LIST_ENTRY *p_IrpList; 
  _LIST_ENTRY *v12; 
  UINT8 v14; 
  PIRP v15; 
  PVOID v16; 
  PVOID v17; 
  PVOID v18; 
  int v19; 
  unsigned int v20; 
  PIRP Irp; 
  _LARGE_INTEGER Interval; 
  int(__fastcall *DriverInit)(_DRIVER_OBJECT *, _UNICODE_STRING *); 
  int v24; 

  v24 = 1;
  p_IrpListLock = &FileObject->IrpListLock;
  Irp = 0i64;
  DriverInit = 0i64;
  v20 = 0;
  v8 = Thread;
  Interval.QuadPart = -10000i64;
  hintEntry = 0i64;
  v10 = KeAcquireSpinLockRaiseToDpc(&FileObject->IrpListLock);
  if( Cleanup )
    FileObject->Flags |= 0x400u;
  p_IrpList = &FileObject->IrpList;
  while( 1 )
  {
    v12 = hintEntry;
    if( p_IrpList->Flink == p_IrpList )
      break;
    v14 = IopCheckListForCancelableIrp(&FileObject->IrpList, Process, IoRequestToCancel, v8, hintEntry, &Irp);
    v15 = Irp;
    hintEntry = 0i64;
    if( !Irp )
    {
      if( !Wait )
        break;
      if( v14 )
      {
        if( !v12 )
          break;
      }
      else
      {
        DriverInit = FileObject->DeviceObject->DriverObject->DriverInit;
        KxReleaseSpinLock(p_IrpListLock);
        __writecr8(v10);
        KeDelayExecutionThread(0, 0, &Interval);
        v19 = v24;
        if( v24 < 100 )
        {
          v24 *= 2;
          Interval.QuadPart = -20000 * v19;
        }
        v10 = KeAcquireSpinLockRaiseToDpc(p_IrpListLock);
      }
      goto LABEL_23;
    }
    if( !Irp->Cancel )
    {
      v20 = 1;
      Irp->Cancel = 1;
      KxReleaseSpinLock(p_IrpListLock);
      __writecr8(v10);
      IoCancelIrp((_KDPC *)v15, v16, v17, v18);
      v10 = KeAcquireSpinLockRaiseToDpc(p_IrpListLock);
    }
    if( (v15->Flags & 0x2000) != 0 )
      hintEntry = v15->ThreadListEntry.Flink;
    if( !(unsigned int)IopInterlockedAdd((UINT64 *)&v15->Overlay, 0xFFFFFFFFi64) )
      IoFreeIrp(v15);
    v8 = Thread;
    if( hintEntry == p_IrpList )
    {
      if( !Wait )
        break;
      hintEntry = 0i64;
LABEL_23:
      v8 = Thread;
    }
  }
  KxReleaseSpinLock(p_IrpListLock);
  __writecr8(v10);
  return v20;
}

Referenced by:

IopCleanupProcessResources
IopRevokeFileObjectForProcess
NtCancelIoFile
NtCancelIoFileEx