FsRtlFastCheckLockForWrite
INT8 __fastcall FsRtlFastCheckLockForWrite(){
_LARGE_INTEGER *v0;
__int64 v1;
__int64 *v2;
int v3;
_LARGE_INTEGER *v4;
__int64 v5;
_LARGE_INTEGER v6;
_LOCK_QUEUE *v7;
_LARGE_INTEGER v8;
INT8 v9;
unsigned __int64 v10;
_FILE_OBJECT *v12;
VOID *v13;
__int64 v14;
bool v15;
unsigned int v16;
UINT8 v17;
UINT8 v18;
_LARGE_INTEGER Starting;
_LARGE_INTEGER Ending;
UINT64 Key;
PVOID FileObject;
PVOID ProcessId;
LODWORD(Key) = v3;
v4 = *(_LARGE_INTEGER **)(v1 + 24);
if( v4 && (v4[4].QuadPart || v4[5].QuadPart) )
{
v5 = *v2;
if( *v2 )
{
v6 = *v0;
v7 = (_LOCK_QUEUE *)&v4[3];
Starting = v6;
v8.QuadPart = v6.QuadPart + v5 - 1;
Ending = v8;
v9 = 1;
v10 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&v4[3].QuadPart);
if( v8.QuadPart < (unsigned __int64)v4->QuadPart )
{
LABEL_5:
KxReleaseSpinLock((UINT64 *)&v4[3].QuadPart);
LABEL_6:
__writecr8(v10);
return v9;
}
v12 = (_FILE_OBJECT *)FileObject;
v13 = ProcessId;
v14 = *((_QWORD *)FileObject + 15);
if( v14 )
{
v15 = v6.QuadPart < *(_QWORD *)v14;
v16 = Key;
if( !v15
&& v8.QuadPart <= *(_QWORD *)(v14 + 40)
&& *(_DWORD *)(v14 + 20) == (_DWORD)Key
&& *(PVOID *)(v14 + 32) == ProcessId
&& *(_BYTE *)(v14 + 16) )
{
goto LABEL_5;
}
}
else
{
v16 = Key;
}
v17 = FsRtlCheckNoSharedConflict((_LOCK_QUEUE *)&v4[3], &Starting, &Ending);
if( v17 == 1 )
{
FsRtlCheckNoExclusiveConflict(v7, &Starting, &Ending, v16, v12, v13);
v17 = v18;
}
KxReleaseSpinLock((UINT64 *)v7);
v9 = v17;
goto LABEL_6;
}
}
return 1;
}Referenced by:
FsRtlCheckLockForWriteAccess