FsRtlPrivateLock

UINT8 __stdcall FsRtlPrivateLock(
        PFILE_LOCK FileLock,
        PFILE_OBJECT FileObject,
        PLARGE_INTEGER FileOffset,
        PLARGE_INTEGER Length,
        PEPROCESS ProcessId,
        UINT64 Key,
        BOOL FailImmediately,
        BOOL ExclusiveLock,
        PIO_STATUS_BLOCK Iosb,
        PIRP Irp,
        VOID *Context,
        UINT8 AlreadySynchronized){
  UINT64 *v16; 
  char *LockInformation; 
  _LARGE_INTEGER v18; 
  _LOCK_QUEUE *v19; 
  UINT8 v20; 
  _KIRQL v21; 
  char v22; 
  PIO_STATUS_BLOCK v23; 
  _QWORD *v24; 
  _KIRQL v25; 
  int v27; 
  unsigned __int8 NewIrql; 
  UINT8 NewIrql_1; 
  char NewIrql_2; 
  int v31; 
  char *v32; 
  UINT64 *v33; 
  _FILE_LOCK_INFO FileLockInfo; 
  _IO_STACK_LOCATION *CurrentStackLocation; 

  NewIrql_2 = 0;
  v32 = 0i64;
  v16 = 0i64;
  v33 = 0i64;
  NewIrql = -1;
  memset(&FileLockInfo, 0, sizeof(FileLockInfo));
  LockInformation = (char *)FileLock->LockInformation;
  v32 = LockInformation;
  if( !LockInformation )
  {
    if( !FsRtlPrivateInitializeFileLock(FileLock, Irp == 0i64) )
      goto LABEL_14;
    FileLock->FastIoIsQuestionable = 1;
    LockInformation = (char *)FileLock->LockInformation;
    v32 = LockInformation;
  }
  FileLockInfo.StartingByte = *FileOffset;
  v18 = *Length;
  FileLockInfo.Length = v18;
  FileLockInfo.EndingByte.QuadPart = FileLockInfo.StartingByte.QuadPart + v18.QuadPart - 1;
  FileLockInfo.Key = Key;
  FileLockInfo.FileObject = FileObject;
  FileLockInfo.ProcessId = ProcessId;
  FileLockInfo.ExclusiveLock = ExclusiveLock;
  v16 = (UINT64 *)(LockInformation + 24);
  v33 = (UINT64 *)(LockInformation + 24);
  if( FileLockInfo.EndingByte.QuadPart < (unsigned __int64)FileLockInfo.StartingByte.QuadPart && v18.QuadPart )
  {
    v23 = Iosb;
    Iosb->Status = -1073741407;
    goto LABEL_10;
  }
  NewIrql_2 = 1;
  NewIrql = KeAcquireSpinLockRaiseToDpc((UINT64 *)LockInformation + 3);
  v19 = (_LOCK_QUEUE *)(LockInformation + 24);
  if( ExclusiveLock )
    v20 = FsRtlPrivateCheckForExclusiveLockAccess(v19, &FileLockInfo.StartingByte);
  else
    FsRtlPrivateCheckForSharedLockAccess(v19, &FileLockInfo);
  if( v20 )
  {
    FsRtlPrivateInsertLock((_LOCK_INFO *)LockInformation, FileObject, &FileLockInfo);
    if( v22 )
    {
      v23 = Iosb;
      Iosb->Status = 0;
LABEL_10:
      NewIrql_1 = 1;
      goto LABEL_29;
    }
    if( Irp )
    {
      LOBYTE(v21) = NewIrql;
      KeReleaseSpinLock((PKSPIN_LOCK)LockInformation + 3, v21);
      RtlRaiseStatus(-1073741670);
    }
  }
  else
  {
    if( FailImmediately )
    {
      v23 = Iosb;
      Iosb->Status = -1073741739;
      goto LABEL_10;
    }
    if( Irp )
    {
      v24 = ExAllocateFromNPagedLookasideList((_NPAGED_LOOKASIDE_LIST *)((char *)&WheapErrorSourceTable + 2344));
      if( !v24 )
      {
        LOBYTE(v25) = NewIrql;
        KeReleaseSpinLock((PKSPIN_LOCK)LockInformation + 3, v25);
        RtlRaiseStatus(-1073741670);
      }
      v24[3] = Irp;
      v24[2] = Context;
      v24[1] = *((_QWORD *)LockInformation + 1);
      CurrentStackLocation = Irp->Tail.CurrentStackLocation;
      CurrentStackLocation->Control |= 1u;
      *v24 = 0i64;
      if( *((_QWORD *)LockInformation + 6) )
        **((_QWORD **)LockInformation + 7) = v24;
      else
        *((_QWORD *)LockInformation + 6) = v24;
      *((_QWORD *)LockInformation + 7) = v24;
      Irp->IoStatus.Information = (unsigned __int64)LockInformation;
      _InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, (__int64)FsRtlPrivateCancelFileLockIrp);
      if( Irp->Cancel && _InterlockedExchange64((volatile __int64 *)&Irp->CancelRoutine, 0i64) )
      {
        Irp->CancelIrql = NewIrql;
        FsRtlPrivateCancelFileLockIrp(0i64, Irp);
        NewIrql_2 = 0;
      }
      v23 = Iosb;
      Iosb->Status = 259;
      LockInformation = v32;
      v16 = v33;
      goto LABEL_10;
    }
  }
LABEL_14:
  NewIrql_1 = 0;
  v23 = Iosb;
LABEL_29:
  if( NewIrql_2 )
  {
    KxReleaseSpinLock(v16);
    __writecr8(NewIrql);
  }
  if( Irp && v23->Status != 259 )
  {
    v31 = 0;
    ObfReferenceObjectWithTag(FileObject, 0x746C6644ui64);
    FsRtlCompleteLockIrpReal(
      *((__int64(__fastcall **)(__int64, _IRP *))LockInformation + 1),
      (__int64)Context,
      Irp,
      v23->Status,
      &v31,
      (__int64)FileObject);
    v27 = v31;
    if( v31 < 0 && v23->Status >= 0 )
      FsRtlPrivateRemoveLock((_LOCK_INFO *)LockInformation, &FileLockInfo, 1u);
    ObfDereferenceObjectWithTag(FileObject, 0x746C6644ui64);
    v23->Status = v27;
  }
  return NewIrql_1;
}

Referenced by:

FsRtlProcessFileLock