FsRtlUninitializeFileLock
VOID __stdcall FsRtlUninitializeFileLock(_FILE_LOCK *FileLock){
UINT64 v1;
char *LockInformation;
unsigned __int8 v4;
unsigned __int8 v5;
_QWORD *v6;
RTL_SPLAY_LINKS **v7;
RTL_SPLAY_LINKS *v8;
_QWORD *v9;
UINT64 *v10;
RTL_SPLAY_LINKS *v11;
_RTL_SPLAY_LINKS *Parent;
__int64 v13;
KIRQL v14;
UINT64 v15;
unsigned __int8 v16;
int v17;
v17 = 0;
LockInformation = (char *)FileLock->LockInformation;
if( LockInformation )
{
KeAcquireSpinLockRaiseToDpc(&FsRtlFileLockCancelCollideLock, v1);
v5 = v4;
KxAcquireSpinLock((UINT64 *)LockInformation + 3);
v6 = LockInformation + 32;
while( *v6 )
{
v11 = (RTL_SPLAY_LINKS *)(*v6 - 24i64);
while( v11->Parent )
{
Parent = v11->Parent;
v11->Parent = v11->Parent->Parent;
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)FsRtlSharedLockLookasideList, Parent);
}
RtlDeleteNoSplay(v11 + 1, (RTL_SPLAY_LINKS **)LockInformation + 4);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)FsRtlLockTreeNodeLookasideList, v11);
}
v7 = (RTL_SPLAY_LINKS **)(LockInformation + 40);
while( 1 )
{
v8 = *v7;
if( !*v7 )
break;
RtlDeleteNoSplay(*v7, (RTL_SPLAY_LINKS **)LockInformation + 5);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)FsRtlExclusiveLockLookasideList, v8);
}
while( 1 )
{
v9 = (_QWORD *)*((_QWORD *)LockInformation + 6);
v10 = (UINT64 *)(LockInformation + 24);
if( !v9 )
break;
*((_QWORD *)LockInformation + 6) = *v9;
v13 = v9[3];
KxReleaseSpinLock(v10);
*(_BYTE *)(v13 + 69) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)(v13 + 104), 0i64);
v14 = *(_BYTE *)(v13 + 69);
if( *(_BYTE *)(v13 + 68) )
{
KeReleaseQueuedSpinLock(7ui64, v14);
*v9 = FsRtlFileLockCancelCollideList;
FsRtlFileLockCancelCollideList = (__int64)v9;
}
else
{
KeReleaseQueuedSpinLock(7ui64, v14);
KxReleaseSpinLock(&FsRtlFileLockCancelCollideLock);
__writecr8(v5);
*(_QWORD *)(v13 + 56) = 0i64;
FsRtlCompleteLockIrpReal(
*((__int64(__fastcall **)(__int64, __int64))LockInformation + 1),
v9[2],
v13,
-1073741698,
&v17,
0i64);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)FsRtlWaitingLockLookasideList, v9);
KeAcquireSpinLockRaiseToDpc(&FsRtlFileLockCancelCollideLock, v15);
v5 = v16;
}
KxAcquireSpinLock((UINT64 *)LockInformation + 3);
}
KxReleaseSpinLock(v10);
KxReleaseSpinLock(&FsRtlFileLockCancelCollideLock);
__writecr8(v5);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)FsRtlLockInfoLookasideList, LockInformation);
FileLock->LockInformation = 0i64;
}
}Referenced by:
FsRtlFreeFileLock