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