FsRtlUninitializeFileLock
VOID __stdcall FsRtlUninitializeFileLock(_FILE_LOCK *FileLock){
char *LockInformation;
unsigned __int8 v3;
_QWORD *v4;
_RTL_SPLAY_LINKS **v5;
_RTL_SPLAY_LINKS *v6;
_QWORD *v7;
UINT64 *v8;
_RTL_SPLAY_LINKS *v9;
_RTL_SPLAY_LINKS *Parent;
__int64 v11;
INT64 v12;
INT64 v13;
UINT8 v14;
int v15;
v15 = 0;
LockInformation = (char *)FileLock->LockInformation;
if( LockInformation )
{
v3 = KeAcquireSpinLockRaiseToDpc(&FsRtlFileLockCancelCollideLock);
KxAcquireSpinLock((UINT64 *)LockInformation + 3);
v4 = LockInformation + 32;
while( *v4 )
{
v9 = (_RTL_SPLAY_LINKS *)(*v4 - 24i64);
while( v9->Parent )
{
Parent = v9->Parent;
v9->Parent = v9->Parent->Parent;
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2600), Parent);
}
RtlDeleteNoSplay(v9 + 1, (_RTL_SPLAY_LINKS **)LockInformation + 4);
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2472), v9);
}
v5 = (_RTL_SPLAY_LINKS **)(LockInformation + 40);
while( 1 )
{
v6 = *v5;
if( !*v5 )
break;
RtlDeleteNoSplay(*v5, (_RTL_SPLAY_LINKS **)LockInformation + 5);
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2728), v6);
}
while( 1 )
{
v7 = (_QWORD *)*((_QWORD *)LockInformation + 6);
v8 = (UINT64 *)(LockInformation + 24);
if( !v7 )
break;
*((_QWORD *)LockInformation + 6) = *v7;
v11 = v7[3];
KxReleaseSpinLock(v8);
*(_BYTE *)(v11 + 69) = KeAcquireQueuedSpinLock(7i64, v12, v13);
_InterlockedExchange64((volatile __int64 *)(v11 + 104), 0i64);
v14 = *(_BYTE *)(v11 + 69);
if( *(_BYTE *)(v11 + 68) )
{
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, v14);
*v7 = FsRtlFileLockCancelCollideList;
FsRtlFileLockCancelCollideList = (__int64)v7;
}
else
{
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, v14);
KxReleaseSpinLock(&FsRtlFileLockCancelCollideLock);
__writecr8(v3);
*(_QWORD *)(v11 + 56) = 0i64;
FsRtlCompleteLockIrpReal(
*((__int64(__fastcall **)(__int64, _IRP *))LockInformation + 1),
v7[2],
(_IRP *)v11,
-1073741698,
&v15,
0i64);
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2344), v7);
v3 = KeAcquireSpinLockRaiseToDpc(&FsRtlFileLockCancelCollideLock);
}
KxAcquireSpinLock((UINT64 *)LockInformation + 3);
}
KxReleaseSpinLock(v8);
KxReleaseSpinLock(&FsRtlFileLockCancelCollideLock);
__writecr8(v3);
ExFreeToNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2088), LockInformation);
FileLock->LockInformation = 0i64;
}
}Referenced by:
FsRtlFreeFileLock