FsRtlPrivateCheckWaitingLocks
void __fastcall FsRtlPrivateCheckWaitingLocks(__int64 a1, KSPIN_LOCK *a2, KIRQL a3){
KSPIN_LOCK *v3;
KSPIN_LOCK *i;
__int64 v7;
__int64 v8;
CHAR v9;
CHAR v10;
CHAR v11;
CHAR v12;
__int64 v13;
char inserted;
UINT64 v15;
KIRQL v16;
LARGE_INTEGER v17[2];
PVOID Object[2];
__int128 v19;
int v21;
__int64 v22;
v21 = 0;
v3 = a2 + 3;
for( i = (KSPIN_LOCK *)a2[3]; i; i = (KSPIN_LOCK *)*v3 )
{
v7 = i[3];
*(_OWORD *)&v17[0].LowPart = 0i64;
v22 = v7;
*(_OWORD *)Object = 0i64;
v19 = 0i64;
v8 = *(_QWORD *)(v7 + 184);
v17[0] = *(LARGE_INTEGER *)(v8 + 24);
v17[1] = **(LARGE_INTEGER **)(v8 + 8);
*((_QWORD *)&v19 + 1) = v17[1].QuadPart + v17[0].QuadPart - 1;
Object[1] = *(PVOID *)(v8 + 48);
*(_QWORD *)&v19 = IoGetRequestorProcess((_IRP *)v7);
HIDWORD(Object[0]) = *(_DWORD *)(v8 + 16);
if( (*(_BYTE *)(v8 + 2) & 2) != 0 )
{
LOBYTE(Object[0]) = 1;
v9 = FsRtlPrivateCheckForExclusiveLockAccess((INT64)a2, v17);
}
else
{
LOBYTE(Object[0]) = 0;
v9 = FsRtlPrivateCheckForSharedLockAccess((__int64)a2, (__int64)v17);
}
v10 = v9;
if( !v9 )
goto LABEL_16;
*(_BYTE *)(v7 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)(v7 + 104), 0i64);
v11 = v10;
v12 = 0;
v13 = v22;
if( !*(_BYTE *)(v22 + 68) )
v12 = v11;
KeReleaseQueuedSpinLock(7ui64, *(_BYTE *)(v22 + 69));
if( v12 )
{
inserted = FsRtlPrivateInsertLock((_QWORD *)a1, *(_QWORD *)(v8 + 48), (_OWORD *)v17);
*v3 = *i;
if( i == (KSPIN_LOCK *)a2[4] )
a2[4] = (KSPIN_LOCK)v3;
KxReleaseSpinLock(a2);
__writecr8(a3);
ObfReferenceObjectWithTag(Object[1], 0x746C6644u);
FsRtlCompleteLockIrpReal(
*(__int64(__fastcall **)(__int64, __int64))(a1 + 8),
i[2],
v13,
inserted == 0 ? 0xC000009A : 0,
&v21,
(__int64)Object[1]);
if( inserted )
{
if( v21 < 0 )
FsRtlPrivateRemoveLock(a1, (__int64)v17, 0);
}
ObfDereferenceObjectWithTag(Object[1], 0x746C6644ui64);
KeAcquireSpinLockRaiseToDpc(a2, v15);
a3 = v16;
v3 = a2 + 3;
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)FsRtlWaitingLockLookasideList, i);
}
else
{
LABEL_16:
v3 = i;
}
}
}Referenced by:
FsRtlFastUnlockSingleExclusive
FsRtlFastUnlockSingleShared
FsRtlPrivateFastUnlockAll