FsRtlpOplockBreakByCacheFlags
__int64 __fastcall FsRtlpOplockBreakByCacheFlags(
__int64 a1,
__int64 a2,
__int64 a3,
int a4,
__int64 a5,
int a6,
__int64 a7,
__int64 a8,
void (__fastcall *a9)(__int64, __int64),
__int64 a10,
__int64 a11,
void (__fastcall *a12)(__int128 *),
_BYTE *a13,
_BYTE *a14){
unsigned int v14;
__int64 v15;
char v17;
int v18;
int v21;
int v22;
int v23;
unsigned int v24;
unsigned int v25;
unsigned int v26;
bool v27;
__int64 v28;
__int64 v29;
_IRP *v30;
__int64 v31;
char v32;
int v33;
__int64 *v34;
UINT8 v35;
__int64 *i;
LIST_ENTRY *v37;
_LIST_ENTRY *Flink;
LIST_ENTRY **p_Flink;
__int64 v40;
INT64 v41;
__int64 v42;
int v43;
INT16 v44;
int v45;
int v46;
int v47;
UINT16 ShareMode;
__int64 *v49;
UINT8 v50;
__int64 v51;
INT64 v52;
__int64 v53;
char v54;
char v55;
_LIST_ENTRY *v56;
__int64 *v57;
_IRP *v58;
__int64 v59;
_IRP *v60;
__int64 v61;
int v62;
_IRP *v63;
_IRP *v64;
_WAITING_IRP *v65;
__int64 v66;
int v67;
__int64 *v68;
INT64 v69;
INT64 v70;
UINT64 v71;
char v72;
char v73;
bool v74;
char v75;
__int128 v76;
__int64 v77;
unsigned int v81;
int v82;
v14 = a4;
v15 = a2;
v81 = 0;
v76 = 0i64;
v77 = 0i64;
v17 = 0;
v72 = 0;
v75 = 0;
v74 = 0;
v73 = 1;
v18 = v14 & 8;
if( a6 == 28672 || a6 == 20480 || a6 == 0x4000 || a6 == 0x2000 )
{
if( !a1 )
return v81;
v21 = *(_DWORD *)(a1 + 144);
if( v21 != 1 && (v21 & a6) != 0 )
{
if( (v14 & 8) != 0 )
{
LABEL_14:
v22 = *(_DWORD *)(a1 + 144);
v23 = v14 & 0x10010000;
v82 = v14 & 0x10010000;
if( (v22 & 0x40) != 0 && v23 )
return(unsigned int)-1073739511;
v24 = v22 & 0x1F0FFDF;
if( (v22 & 0x1F0FFDFu) > 0x105040 )
{
if( v24 <= 0x803000 )
{
if( v24 == 8400896 )
{
if( (a6 & 0x3000) != 0 )
{
if( v23 )
return(unsigned int)-1073739511;
if( (a6 & 0x2000) != 0 )
{
v68 = *(__int64 **)(a1 + 72);
while( v68 != (__int64 *)(a1 + 72) )
{
if( v18 || !FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v68[3], 0i64) )
goto LABEL_151;
v68 = (__int64 *)*v68;
v15 = a2;
}
}
}
LABEL_152:
if( v17 )
{
if( (a4 & 1) != 0 )
{
v67 = *(_DWORD *)(a1 + 144);
if( (v67 & 0x10000) != 0 )
*(_DWORD *)(a1 + 144) = v67 | 0x20000;
return 264;
}
else
{
if( v73 )
{
FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)a1, 0i64, 1u);
FsRtlpOplockSendModernAppTermination((_NONOPAQUE_OPLOCK *)a1, 0i64);
}
*a13 = 0;
return(unsigned int)FsRtlpWaitOnIrp(a1, a3, a7, a8, a9, (char *)&v76, v74, a10, a11, a12, a14);
}
}
return v81;
}
if( v24 != 1077312 )
{
if( v24 == 3174464 )
{
if( a6 == 0x4000 )
{
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x107040;
}
else if( (a6 & 0x5000) == 20480 )
{
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x807040;
}
goto LABEL_151;
}
if( v24 != 5271616 )
goto LABEL_180;
if( a6 == 0x2000 )
{
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x107040;
goto LABEL_151;
}
}
if( (a6 & 0x1000) != 0 )
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x807040;
goto LABEL_151;
}
if( v24 != 8409152 )
{
if( v24 == 8417344 )
goto LABEL_151;
goto LABEL_180;
}
}
else
{
if( v24 != 1069120 )
{
if( v24 <= 0x5040 )
{
if( v24 != 20544 )
{
v25 = v24 - 4096;
if( v25 )
{
v26 = v25 - 16;
if( v26 )
{
if( v26 == 8176 )
goto LABEL_64;
v27 = (v22 & 0x1000000) == 0;
LABEL_150:
if( v27 )
goto LABEL_152;
goto LABEL_151;
}
}
goto LABEL_51;
}
if( (a6 & 0x5000) == 20480 )
{
v28 = *(_QWORD *)a1;
*(_BYTE *)(v28 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)(v28 + 104), 0i64);
KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v28 + 69));
if( !*(_BYTE *)(v28 + 68) )
{
v29 = *(_QWORD *)(v28 + 24);
*(_OWORD *)v29 = 0i64;
*(_QWORD *)(v29 + 16) = 0i64;
*(_DWORD *)v29 = 1572865;
*(_DWORD *)(v29 + 4) = (*(_DWORD *)(a1 + 144) >> 12) & 7;
*(_DWORD *)(v29 + 12) |= 1u;
*(_QWORD *)(v28 + 56) = 24i64;
*(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x805040;
LABEL_151:
v17 = 1;
goto LABEL_152;
}
}
else
{
if( (a6 & 0x4000) == 0 )
goto LABEL_152;
v30 = *(_IRP **)a1;
*((_BYTE *)v30 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)v30 + 13, 0i64);
KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)v30 + 69));
if( !*((_BYTE *)v30 + 68) )
{
v31 = *((_QWORD *)v30 + 3);
*(_OWORD *)v31 = 0i64;
*(_QWORD *)(v31 + 16) = 0i64;
*(_DWORD *)v31 = 1572865;
*(_DWORD *)(v31 + 4) = (*(_DWORD *)(a1 + 144) >> 12) & 7;
*(_DWORD *)(v31 + 8) = 1;
*(_DWORD *)(v31 + 12) |= 1u;
*((_QWORD *)v30 + 7) = 24i64;
*(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x105040;
v17 = 1;
goto LABEL_152;
}
}
goto LABEL_140;
}
switch( v24 )
{
case 0x7040u:
if( a6 == 0x4000 )
{
v58 = *(_IRP **)a1;
*((_BYTE *)v58 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)v58 + 13, 0i64);
KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)v58 + 69));
if( !*((_BYTE *)v58 + 68) )
{
v59 = *((_QWORD *)v58 + 3);
*(_OWORD *)v59 = 0i64;
*(_QWORD *)(v59 + 16) = 0i64;
*(_DWORD *)v59 = 1572865;
*(_DWORD *)(v59 + 4) = (*(_DWORD *)(a1 + 144) >> 12) & 7;
*(_DWORD *)(v59 + 8) = 3;
*(_DWORD *)(v59 + 12) |= 1u;
*((_QWORD *)v58 + 7) = 24i64;
*(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x507040;
goto LABEL_151;
}
}
else if( a6 == 0x2000 )
{
v60 = *(_IRP **)a1;
*((_BYTE *)v60 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)v60 + 13, 0i64);
KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)v60 + 69));
if( !*((_BYTE *)v60 + 68) )
{
v61 = *((_QWORD *)v60 + 3);
*(_OWORD *)v61 = 0i64;
*(_QWORD *)(v61 + 16) = 0i64;
*(_DWORD *)v61 = 1572865;
*(_DWORD *)(v61 + 4) = (*(_DWORD *)(a1 + 144) >> 12) & 7;
*(_DWORD *)(v61 + 8) = 5;
v62 = *(_DWORD *)(v61 + 12) | 1;
*(_DWORD *)(v61 + 12) = v62;
if( !*(_BYTE *)a2 )
{
*(_DWORD *)(v61 + 12) = v62 | 2;
*(_DWORD *)(v61 + 16) = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 8) + 8i64) + 20i64);
*(_WORD *)(v61 + 20) = *(_WORD *)(a2 + 26);
}
*((_QWORD *)v60 + 7) = 24i64;
*(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x307040;
goto LABEL_151;
}
}
else
{
if( (a6 & 0x5000) != 20480 )
goto LABEL_152;
v63 = *(_IRP **)a1;
*((_BYTE *)v63 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)v63 + 13, 0i64);
KeReleaseQueuedSpinLock(7ui64, *((_BYTE *)v63 + 69));
if( !*((_BYTE *)v63 + 68) )
{
v66 = *((_QWORD *)v63 + 3);
*(_OWORD *)v66 = 0i64;
*(_QWORD *)(v66 + 16) = 0i64;
*(_DWORD *)v66 = 1572865;
*(_DWORD *)(v66 + 4) = (*(_DWORD *)(a1 + 144) >> 12) & 7;
*(_DWORD *)(v66 + 12) |= 1u;
*((_QWORD *)v63 + 7) = 24i64;
*(_DWORD *)(*(_QWORD *)a1 + 48i64) = 0;
IofCompleteRequest(*(_IRP **)a1, 1);
*(_QWORD *)a1 = 0i64;
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x807040;
goto LABEL_151;
}
}
LABEL_140:
FsRtlpModifyThreadPriorities((_NONOPAQUE_OPLOCK *)a1, 0i64, 0);
FsRtlpClearOwner(a1, 0i64);
*(_BYTE *)(a1 + 32) = 0;
v64 = *(_IRP **)a1;
if( *(_QWORD *)(*(_QWORD *)a1 + 56i64) == a1 )
{
*((_QWORD *)v64 + 7) = 0i64;
v64 = *(_IRP **)a1;
}
*((_DWORD *)v64 + 12) = -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 )
{
v65 = *(_WAITING_IRP **)(a1 + 88);
if( v65 == (_WAITING_IRP *)(a1 + 88) )
break;
FsRtlpRemoveAndCompleteWaitingIrp(v65);
}
v74 = 0;
v73 = 1;
goto LABEL_152;
case 0xB000u:
LABEL_51:
if( (a6 & 0x1000) == 0 )
goto LABEL_63;
v37 = *(LIST_ENTRY **)(a1 + 40);
while( v37 != (LIST_ENTRY *)(a1 + 40) )
{
Flink = v37[1].Flink;
if( LODWORD(Flink[1].Blink) == 590400 )
{
if( v18 )
goto LABEL_59;
if( FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)Flink[3].Flink, v14) )
{
v14 = a4;
v37 = v37->Flink;
v15 = a2;
}
else
{
v14 = a4;
LABEL_59:
if( (v14 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
p_Flink = &v37->Blink->Flink;
FsRtlpRemoveAndCompleteReadOnlyIrp(*p_Flink, 0i64, 0i64);
v14 = a4;
v37 = *p_Flink;
v15 = a2;
}
}
else
{
v37 = v37->Flink;
v15 = a2;
}
}
v23 = v82;
LABEL_63:
if( (*(_DWORD *)(a1 + 144) & 0x1F0FFDF) == 45056 )
{
LABEL_64:
if( a6 == 0x2000 )
{
v40 = a1 + 56;
v41 = *(_QWORD *)(a1 + 56);
while( 1 )
{
while( 1 )
{
if( v41 == v40 )
goto LABEL_119;
v42 = *(_QWORD *)(v41 + 16);
if( !v18 )
{
if( FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), *(_FILE_OBJECT **)(v41 + 24), 0i64) )
goto LABEL_85;
v23 = v82;
}
if( v23 )
return(unsigned int)-1073739511;
if( !*(_QWORD *)(v41 + 56) )
break;
v17 = 1;
v72 = 1;
v41 = *(_QWORD *)v41;
v15 = a2;
v40 = a1 + 56;
}
v41 = *(_QWORD *)(v41 + 8);
if( (unsigned int)Feature_Servicing_39887415__private_IsEnabled() )
{
v43 = 1;
v44 = 0;
v45 = 0;
if( !*(_BYTE *)a2 )
{
v43 = 3;
v45 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 8) + 8i64) + 20i64);
v44 = *(_WORD *)(a2 + 26);
}
LODWORD(v70) = v45;
LODWORD(v69) = v43;
if( !FsRtlpRemoveAndCompleteRHIrp(*(_QWORD *)v41, a1, 0i64, 0x1000ui64, v69, v70, v44) )
{
v75 = 1;
goto LABEL_85;
}
v73 = 0;
}
else
{
*(_BYTE *)(v42 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)(v42 + 104), 0i64);
KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v42 + 69));
if( *(_BYTE *)(v42 + 68) )
{
LODWORD(v71) = 0;
LODWORD(v70) = 0;
LODWORD(v69) = 0;
FsRtlpRemoveAndBreakRHIrp(
*(_LIST_ENTRY **)v41,
(_NONOPAQUE_OPLOCK *)a1,
0,
3221225760i64,
v69,
v70,
v71,
0);
v75 = 1;
v17 = v72;
goto LABEL_85;
}
v46 = 1;
v47 = 0;
ShareMode = 0;
if( !*(_BYTE *)a2 )
{
v46 = 3;
v47 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 8) + 8i64) + 20i64);
ShareMode = *(_WORD *)(a2 + 26);
}
LODWORD(v71) = v47;
LODWORD(v70) = v46;
LODWORD(v69) = 4096;
FsRtlpRemoveAndBreakRHIrp(
*(_LIST_ENTRY **)v41,
(_NONOPAQUE_OPLOCK *)a1,
0,
0i64,
v69,
v70,
v71,
ShareMode);
v73 = 0;
}
v17 = 1;
v72 = 1;
v74 = v18 != 0;
LABEL_85:
v23 = v82;
v41 = *(_QWORD *)v41;
v15 = a2;
v40 = a1 + 56;
}
}
if( (a6 & 0x5000) == 20480 )
{
v49 = *(__int64 **)(a1 + 72);
while( v49 != (__int64 *)(a1 + 72) )
{
if( v18
|| (v50 = FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v49[3], v14),
v14 = a4,
!v50) )
{
if( (v14 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
*((_DWORD *)v49 + 12) &= 0xFF0FFFFF;
*((_DWORD *)v49 + 12) |= 0x800000u;
if( (a6 & 0x2000) != 0 )
v17 = 1;
v72 = v17;
}
v49 = (__int64 *)*v49;
v15 = a2;
}
v51 = a1 + 56;
v52 = *(_QWORD *)(a1 + 56);
while( 1 )
{
while( 1 )
{
if( v52 == v51 )
goto LABEL_119;
v53 = *(_QWORD *)(v52 + 16);
if( !v18 )
{
if( FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), *(_FILE_OBJECT **)(v52 + 24), v14) )
goto LABEL_118;
v14 = a4;
}
if( (v14 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
if( !*(_QWORD *)(v52 + 56) )
break;
v54 = v17;
if( (a6 & 0x2000) != 0 )
v54 = 1;
v17 = v54;
v72 = v54;
v52 = *(_QWORD *)v52;
v15 = a2;
v51 = a1 + 56;
}
v52 = *(_QWORD *)(v52 + 8);
if( (unsigned int)Feature_Servicing_39887415__private_IsEnabled() )
{
LODWORD(v70) = 0;
LODWORD(v69) = 1;
if( !FsRtlpRemoveAndCompleteRHIrp(*(_QWORD *)v52, a1, 0i64, 0i64, v69, v70, 0) )
{
v75 = 1;
goto LABEL_118;
}
v73 = 0;
v55 = v17;
if( (a6 & 0x2000) != 0 )
v55 = 1;
v72 = v55;
v74 = v18 != 0;
}
else
{
*(_BYTE *)(v53 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)(v53 + 104), 0i64);
KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v53 + 69));
v56 = *(_LIST_ENTRY **)v52;
LODWORD(v71) = 0;
if( *(_BYTE *)(v53 + 68) )
{
LODWORD(v70) = 0;
LODWORD(v69) = 0;
FsRtlpRemoveAndBreakRHIrp(v56, (_NONOPAQUE_OPLOCK *)a1, 0, 3221225760i64, v69, v70, v71, 0);
v75 = 1;
v17 = v72;
goto LABEL_118;
}
LODWORD(v70) = 1;
LODWORD(v69) = 0;
FsRtlpRemoveAndBreakRHIrp(v56, (_NONOPAQUE_OPLOCK *)a1, 0, 0i64, v69, v70, v71, 0);
v73 = 0;
v55 = v72;
if( (a6 & 0x2000) != 0 )
v55 = 1;
v72 = v55;
v74 = v18 != 0;
}
v17 = v55;
LABEL_118:
v14 = a4;
v52 = *(_QWORD *)v52;
v15 = a2;
v51 = a1 + 56;
}
}
LABEL_119:
if( v75 )
FsRtlpReleaseIrpsWaitingForRH(a1);
if( !v17 )
{
v57 = *(__int64 **)(a1 + 72);
if( v57 != (__int64 *)(a1 + 72) && (a6 & 0x2000) != 0 )
{
if( v18 )
{
LABEL_128:
v17 = 1;
}
else
{
while( v57 != (__int64 *)(a1 + 72) )
{
if( !FsRtlpOplockKeysEqual((_FILE_OBJECT *)v57[3], *(_FILE_OBJECT **)(a2 + 48), 0i64) )
goto LABEL_128;
v57 = (__int64 *)*v57;
}
}
}
}
}
FsRtlpComputeShareableOplockState((_NONOPAQUE_OPLOCK *)a1);
goto LABEL_152;
case 0x103000u:
v32 = 0;
v33 = a6 & 0x1000;
if( (a6 & 0x1000) != 0 )
{
v34 = *(__int64 **)(a1 + 72);
while( v34 != (__int64 *)(a1 + 72) )
{
if( v18
|| (v35 = FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(v15 + 48), (_FILE_OBJECT *)v34[3], v14),
v14 = a4,
!v35) )
{
v32 = 1;
if( (v14 & 0x10010000) != 0 )
return(unsigned int)-1073739511;
*((_DWORD *)v34 + 12) &= 0xFF0FFFFF;
*((_DWORD *)v34 + 12) |= 0x800000u;
}
v34 = (__int64 *)*v34;
v15 = a2;
}
FsRtlpComputeShareableOplockState((_NONOPAQUE_OPLOCK *)a1);
v33 = a6 & 0x1000;
}
if( (a6 & 0x2000) == 0 )
goto LABEL_152;
if( !v32 )
{
if( !v33 )
{
for( i = *(__int64 **)(a1 + 72); i != (__int64 *)(a1 + 72); i = (__int64 *)*i )
{
if( v18 || !FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), (_FILE_OBJECT *)i[3], 0i64) )
goto LABEL_151;
}
}
goto LABEL_152;
}
goto LABEL_151;
}
LABEL_180:
v27 = (v22 & 0x1000000) == 0;
goto LABEL_150;
}
if( (a6 & 0x1000) != 0 )
*(_DWORD *)(a1 + 144) = *(_DWORD *)(a1 + 144) & 0x20 | 0x805040;
}
v27 = (a6 & 0x5000) == 0;
goto LABEL_150;
}
if( !FsRtlpOplockKeysEqual(*(_FILE_OBJECT **)(a2 + 48), *(_FILE_OBJECT **)(a1 + 8), v14) )
{
v15 = a2;
v14 = a4;
goto LABEL_14;
}
}
return 0;
}
if( a3 )
{
*(_DWORD *)(a3 + 48) = -1073741597;
IofCompleteRequest((_IRP *)a3, 1);
}
return 3221225699i64;
}Referenced by:
FsRtlCheckOplockEx2
FsRtlCheckUpperOplock
FsRtlOplockBreakH
FsRtlOplockBreakToNoneEx