FsRtlpOplockKeysEqual
UINT8 __stdcall FsRtlpOplockKeysEqual(_FILE_OBJECT *OperationFileObject, _FILE_OBJECT *OplockFileObject, UINT64 Flags){
char v3;
_QWORD *FileObjectExtension;
__int64 v7;
_QWORD *v8;
__int64 v9;
__int16 v10;
int v11;
int v13;
__int64 v15;
INT64 OplockKeyContext;
__int64 v17;
v3 = Flags;
if( (Flags & 0x40) == 0
|| OperationFileObject
&& (v15 = *((_QWORD *)OperationFileObject->FsContext + 11)) != 0
&& *(_QWORD *)(v15 + 136)
&& (OplockKeyContext = IoGetOplockKeyContextEx((INT64)OperationFileObject)) != 0
&& (*(_BYTE *)(OplockKeyContext + 2) & 1) != 0
&& (v17 = *(_QWORD *)(v15 + 136), *(_DWORD *)(OplockKeyContext + 4) == *(_DWORD *)v17)
&& *(_WORD *)(OplockKeyContext + 8) == *(_WORD *)(v17 + 4)
&& *(_WORD *)(OplockKeyContext + 10) == *(_WORD *)(v17 + 6)
&& *(_BYTE *)(OplockKeyContext + 12) == *(_BYTE *)(v17 + 8)
&& *(_BYTE *)(OplockKeyContext + 13) == *(_BYTE *)(v17 + 9)
&& *(_BYTE *)(OplockKeyContext + 14) == *(_BYTE *)(v17 + 10)
&& *(_BYTE *)(OplockKeyContext + 15) == *(_BYTE *)(v17 + 11)
&& *(_BYTE *)(OplockKeyContext + 16) == *(_BYTE *)(v17 + 12)
&& *(_BYTE *)(OplockKeyContext + 17) == *(_BYTE *)(v17 + 13)
&& *(_BYTE *)(OplockKeyContext + 18) == *(_BYTE *)(v17 + 14)
&& *(_BYTE *)(OplockKeyContext + 19) == *(_BYTE *)(v17 + 15) )
{
if( OperationFileObject && OplockFileObject )
{
if( OperationFileObject == OplockFileObject )
return 1;
FileObjectExtension = OperationFileObject->FileObjectExtension;
if( !FileObjectExtension
|| FileObjectExtension == (_QWORD *)IopRevocationExtension
|| (v7 = FileObjectExtension[7]) == 0
|| (*(_BYTE *)(v7 + 2) & 3) == 0 )
{
v7 = 0i64;
}
v8 = OplockFileObject->FileObjectExtension;
if( !v8 || v8 == (_QWORD *)IopRevocationExtension || (v9 = v8[7]) == 0 || (*(_BYTE *)(v9 + 2) & 3) == 0 )
v9 = 0i64;
if( v7 && v9 && (*(_BYTE *)(v9 + 2) & 2) != 0 )
{
v10 = *(_WORD *)(v7 + 2);
v11 = v3 & 0x10;
if( !(v11 ? (v10 & 1) == 0 : (v10 & 2) == 0) )
{
v13 = *(_DWORD *)(v9 + 20);
if( v11 )
{
if( *(_DWORD *)(v7 + 4) == v13
&& *(_WORD *)(v7 + 8) == *(_WORD *)(v9 + 24)
&& *(_WORD *)(v7 + 10) == *(_WORD *)(v9 + 26)
&& *(_BYTE *)(v7 + 12) == *(_BYTE *)(v9 + 28)
&& *(_BYTE *)(v7 + 13) == *(_BYTE *)(v9 + 29)
&& *(_BYTE *)(v7 + 14) == *(_BYTE *)(v9 + 30)
&& *(_BYTE *)(v7 + 15) == *(_BYTE *)(v9 + 31)
&& *(_BYTE *)(v7 + 16) == *(_BYTE *)(v9 + 32)
&& *(_BYTE *)(v7 + 17) == *(_BYTE *)(v9 + 33)
&& *(_BYTE *)(v7 + 18) == *(_BYTE *)(v9 + 34)
&& *(_BYTE *)(v7 + 19) == *(_BYTE *)(v9 + 35) )
{
return 1;
}
}
else if( *(_DWORD *)(v7 + 20) == v13
&& *(_WORD *)(v7 + 24) == *(_WORD *)(v9 + 24)
&& *(_WORD *)(v7 + 26) == *(_WORD *)(v9 + 26)
&& *(_BYTE *)(v7 + 28) == *(_BYTE *)(v9 + 28)
&& *(_BYTE *)(v7 + 29) == *(_BYTE *)(v9 + 29)
&& *(_BYTE *)(v7 + 30) == *(_BYTE *)(v9 + 30)
&& *(_BYTE *)(v7 + 31) == *(_BYTE *)(v9 + 31)
&& *(_BYTE *)(v7 + 32) == *(_BYTE *)(v9 + 32)
&& *(_BYTE *)(v7 + 33) == *(_BYTE *)(v9 + 33)
&& *(_BYTE *)(v7 + 34) == *(_BYTE *)(v9 + 34)
&& *(_BYTE *)(v7 + 35) == *(_BYTE *)(v9 + 35) )
{
return 1;
}
}
}
}
}
return 0;
}Referenced by:
FsRtlCheckOplockEx2
FsRtlOplockKeysEqual
FsRtlpAcknowledgeOplockBreakByCacheFlags
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockBreakToII
FsRtlpOplockBreakToNone
FsRtlpReleaseIrpsWaitingForRH
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock