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