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