FsRtlpOplockBreakToII
__int64 __fastcall FsRtlpOplockBreakToII(
_NONOPAQUE_OPLOCK *Oplock,
__int64 a2,
__int64 a3,
int a4,
int a5,
__int64 a6,
__int64 a7,
__int64 a8,
__int64 a9,
__int64 a10,
__int64 a11,
__int64 a12,
__int64 a13){
unsigned int OplockState;
unsigned int v17;
char v18;
unsigned int v19;
_IRP *IrpExclusiveOplock;
unsigned __int64 v21;
_CCHAR v22;
_CCHAR v23;
_IRP *v24;
_LIST_ENTRY *Flink;
unsigned int v26;
int v27;
__int128 v29;
__int64 v30;
v29 = 0i64;
v30 = 0i64;
OplockState = Oplock->OplockState;
if( (OplockState & 0x40) == 0 || (OplockState & 0x7000) != 0 )
return 0;
if( (a4 & 8) != 0 )
{
v17 = 0;
}
else
{
FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), Oplock->FileObject, 0i64);
v17 = 0;
if( v18 )
return v17;
}
if( (a4 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
v19 = Oplock->OplockState;
if( (v19 & 0x1F00F80) != 0 )
{
if( (v19 & 0x80u) != 0 )
{
Oplock->OplockState = Oplock->OplockState & 0x20 | 1;
Oplock->FileObject = 0i64;
return v17;
}
goto LABEL_20;
}
IrpExclusiveOplock = Oplock->IrpExclusiveOplock;
v21 = 7i64;
IrpExclusiveOplock->CancelIrql = KeAcquireQueuedSpinLock(7i64, a2, a3);
_InterlockedExchange64((volatile __int64 *)&IrpExclusiveOplock->CancelRoutine, 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, IrpExclusiveOplock->CancelIrql);
if( !IrpExclusiveOplock->Cancel )
{
v26 = Oplock->OplockState;
if( (v26 & 6) != 0 )
{
v27 = v26 | 0x100;
}
else
{
v27 = v26 | 0x200;
v21 = 8i64;
}
Oplock->OplockState = v27;
Oplock->IrpExclusiveOplock->IoStatus.Information = v21;
Oplock->IrpExclusiveOplock->IoStatus.Status = 0;
LOBYTE(v22) = 1;
IofCompleteRequest(Oplock->IrpExclusiveOplock, v22);
Oplock->IrpExclusiveOplock = 0i64;
LABEL_20:
if( (a4 & 1) != 0 )
{
return 264;
}
else
{
FsRtlpModifyThreadPriorities(Oplock, 0i64, 1u);
FsRtlpOplockSendModernAppTermination(Oplock, 0i64);
*(_BYTE *)a12 = 0;
return(unsigned int)FsRtlpWaitOnIrp(
(__int64)Oplock,
a3,
(void *)a6,
(void(__fastcall *)(void *, _IRP *))a7,
(void(__fastcall *)(void *, __int64))a8,
(char *)&v29,
0,
a9,
a10,
(void(__fastcall *)(__int128 *))a11,
(_WAITING_IRP *)a13);
}
}
IrpExclusiveOplock->IoStatus.Information = 8i64;
FsRtlpModifyThreadPriorities(Oplock, 0i64, 0);
FsRtlpClearOwner(Oplock, 0i64);
Oplock->WaiterPriority = 0;
v24 = Oplock->IrpExclusiveOplock;
if( (_NONOPAQUE_OPLOCK *)Oplock->IrpExclusiveOplock->IoStatus.Information == Oplock )
{
v24->IoStatus.Information = 0i64;
v24 = Oplock->IrpExclusiveOplock;
}
v24->IoStatus.Status = -1073741536;
LOBYTE(v23) = 1;
IofCompleteRequest(Oplock->IrpExclusiveOplock, v23);
Oplock->IrpExclusiveOplock = 0i64;
ObfDereferenceObjectWithTag(Oplock->FileObject, 0x746C6644ui64);
Oplock->FileObject = 0i64;
Oplock->OplockState = Oplock->OplockState & 0x20 | 1;
while( 1 )
{
Flink = Oplock->WaitingIrps.Flink;
if( Flink == &Oplock->WaitingIrps )
break;
FsRtlpRemoveAndCompleteWaitingIrp((_WAITING_IRP *)Flink);
}
return v17;
}Referenced by:
FsRtlCheckOplockEx2
FsRtlCheckUpperOplock