FsRtlpOpBatchBreakClosePending

NTSTATUS __stdcall FsRtlpOpBatchBreakClosePending(_NONOPAQUE_OPLOCK *Oplock, _IO_STACK_LOCATION *IrpSp, _IRP *Irp){
  _IO_STACK_LOCATION *v4; 
  int v6; 
  _CCHAR v8; 
  unsigned int v9; 
  unsigned int OplockState; 
  _LIST_ENTRY *Flink; 
  unsigned int v12; 

  v4 = IrpSp;
  v6 = 0;
  if( Oplock )
  {
    ExAcquireFastMutexUnsafe(Oplock->FastMutex);
    if( Oplock->FileObject == v4->FileObject && (v9 = Oplock->OplockState, (v9 & 0x700) != 0) )
    {
      if( (v9 & 0x82) != 0 )
      {
        FsRtlpModifyThreadPriorities(Oplock, 0i64, 0);
        FsRtlpClearOwner(Oplock, 0i64);
        Oplock->WaiterPriority = 0;
        OplockState = Oplock->OplockState;
        if( (OplockState & 2) != 0 )
        {
          HalPutDmaAdapter((PADAPTER_OBJECT)Oplock->FileObject);
          OplockState = Oplock->OplockState;
        }
        Oplock->OplockState = OplockState & 0x20 | 1;
        Oplock->FileObject = 0i64;
        while( 1 )
        {
          Flink = Oplock->WaitingIrps.Flink;
          if( Flink == &Oplock->WaitingIrps )
            break;
          FsRtlpRemoveAndCompleteWaitingIrp((_WAITING_IRP *)Flink);
        }
      }
      else
      {
        v12 = v9 & 0xFE0FF0FF;
        Oplock->OplockState = v12;
        Oplock->OplockState = v12 | 0x800;
      }
    }
    else
    {
      v6 = -1073741597;
    }
    Irp->IoStatus.Status = v6;
    LOBYTE(v8) = 1;
    IofCompleteRequest(Irp, v8);
    ExReleaseFastMutexUnsafe(Oplock->FastMutex);
    return v6;
  }
  else
  {
    Irp->IoStatus.Status = -1073741597;
    LOBYTE(IrpSp) = 1;
    IofCompleteRequest(Irp, (_CCHAR)IrpSp);
    return -1073741597;
  }
}

Referenced by:

FsRtlpOplockFsctrlInternal