FsRtlpOplockBreakToNone
__int64 __fastcall FsRtlpOplockBreakToNone(
__int64 a1,
__int64 a2,
__int64 a3,
int a4,
int a5,
__int64 a6,
__int64 a7,
void (__fastcall *a8)(__int64, __int64),
__int64 a9,
__int64 a10,
void (__fastcall *a11)(__int128 *),
_BYTE *a12,
_BYTE *a13){
unsigned int v17;
int v18;
__int64 v19;
__int64 v20;
_WAITING_IRP *v21;
unsigned int v22;
LIST_ENTRY *i;
int v24;
int v25;
__int128 v27;
__int64 v28;
v27 = 0i64;
v28 = 0i64;
v17 = 0;
if( !a1 )
return v17;
v18 = *(_DWORD *)(a1 + 144);
if( v18 == 1 || (v18 & 0x6000) != 0 )
return v17;
if( (v18 & 0x1F00F90) == 0 )
{
v19 = *(_QWORD *)a1;
if( (v18 & 0x1000) != 0 )
return v17;
if( (a4 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
*(_BYTE *)(v19 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)(v19 + 104), 0i64);
KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v19 + 69));
if( *(_BYTE *)(v19 + 68) )
{
*(_QWORD *)(v19 + 56) = 8i64;
FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)a1, 0i64, 0);
FsRtlpClearOwner(a1, 0i64);
*(_BYTE *)(a1 + 32) = 0;
v20 = *(_QWORD *)a1;
if( *(_QWORD *)(*(_QWORD *)a1 + 56i64) == a1 )
{
*(_QWORD *)(v20 + 56) = 0i64;
v20 = *(_QWORD *)a1;
}
*(_DWORD *)(v20 + 48) = -1073741536;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
ObfDereferenceObjectWithTag(*(PVOID *)(a1 + 8), 0x746C6644ui64);
*(_QWORD *)(a1 + 8) = 0i64;
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 1;
while( 1 )
{
v21 = *(_WAITING_IRP **)(a1 + 88);
if( v21 == (_WAITING_IRP *)(a1 + 88) )
break;
FsRtlpRemoveAndCompleteWaitingIrp(v21);
}
return v17;
}
*(_QWORD *)(*(_QWORD *)a1 + 56i64) = 8i64;
*(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
*(_DWORD *)(a1 + 144) |= 0x200u;
goto LABEL_14;
}
if( (((v18 & 0x1F0FFDF) - 16) & 0xFFFFEFFF) != 0 )
{
if( (v18 & 0x100) != 0 )
{
if( (a4 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
v22 = v18 & 0xFFFFFEFF;
*(_DWORD *)(a1 + 144) = v22;
*(_DWORD *)(a1 + 144) = v22 | 0x400;
goto LABEL_14;
}
if( (v18 & 0x80u) == 0 )
{
LABEL_14:
if( (a4 & 8) == 0 && FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), *(_FILE_OBJECT **)(a1 + 8), 0i64) )
return v17;
if( (a4 & 1) != 0 )
return 264;
if( (a4 & 0x10010000) == 0 )
{
FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)a1, 0i64, 1u);
FsRtlpOplockSendModernAppTermination((_NONOPAQUE_OPLOCK *)a1, 0i64);
*a12 = 0;
return(unsigned int)FsRtlpWaitOnIrp(a1, a3, a6, a7, a8, (char *)&v27, 0, a9, a10, a11, a13);
}
return(unsigned int)-1073739511;
}
if( (a4 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
*(_DWORD *)(a1 + 144) = v18 & 0x20 | 1;
*(_QWORD *)(a1 + 8) = 0i64;
if( *(_QWORD *)(a1 + 24) )
{
FsRtlpClearOwner(a1, 0i64);
*(_BYTE *)(a1 + 32) = 0;
}
}
else
{
if( (a4 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
for( i = *(LIST_ENTRY **)(a1 + 40); i != (LIST_ENTRY *)(a1 + 40); i = i->Flink )
{
if( LODWORD(i[1].Flink[1].Blink) != 590400 )
{
i = i->Blink;
FsRtlpRemoveAndCompleteReadOnlyIrp(i->Flink, 0i64, 0i64);
}
}
v24 = *(_DWORD *)(a1 + 144) & 0x20;
if( (*(_DWORD *)(a1 + 144) & 0x1F0FFDF) == 4112 )
v25 = v24 | 0x1000;
else
v25 = v24 | 1;
*(_DWORD *)(a1 + 144) = v25;
}
return v17;
}Referenced by:
FsRtlCheckOplockEx2
FsRtlCheckUpperOplock
FsRtlOplockBreakToNoneEx