NtLockFile
NTSTATUS __stdcall NtLockFile(
HANDLE FileHandle,
HANDLE Event,
PIO_APC_ROUTINE ApcRoutine,
PVOID ApcContext,
PIO_STATUS_BLOCK IoStatusBlock,
PLARGE_INTEGER ByteOffset,
PLARGE_INTEGER Length,
ULONG Key,
BOOLEAN FailImmediately,
BOOLEAN ExclusiveLock){
INT8 v12;
NTSTATUS result;
__int64 v14;
FILE_OBJECT *v15;
__int64 CurrentProcess;
NTSTATUS v17;
UINT64 v18;
UINT8 v19;
UINT8 v20;
_DEVICE_OBJECT *RelatedDeviceObject;
__int64 v22;
__int64(__fastcall *v23)(FILE_OBJECT *, LONGLONG *, LONGLONG *, _QWORD, ULONG, int, BOOLEAN, INT64 *, _DEVICE_OBJECT *);
void *v24;
char v25;
PIO_STATUS_BLOCK v26;
NTSTATUS v27;
int v28;
_ETHREAD *v29;
PADAPTER_OBJECT v30;
__int64 v31;
INT64 v32;
CHAR v33;
IRP *v34;
IRP *v35;
__int64 v36;
char v37;
_QWORD *PoolWithQuota_4;
IRP *Object;
int HandleInformation;
UINT64 v41;
char v42;
PADAPTER_OBJECT DmaAdapter;
PRKEVENT Eventa;
INT64 IoStatus[2];
LONGLONG QuadPart;
LONGLONG v47;
PIRP Irp;
OBJECT_HANDLE_INFORMATION v49;
PVOID VirtualAddress;
PVOID IoCompletion;
_ETHREAD *CurrentThread;
VOID *retaddr;
INT64 v54;
PVOID v55;
v55 = ApcContext;
v54 = (INT64)ApcRoutine;
DmaAdapter = 0i64;
Eventa = 0i64;
QuadPart = 0i64;
v47 = 0i64;
v49 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v12 = *((_BYTE *)CurrentThread + 562);
result = IopReferenceFileObject(FileHandle, 0i64, v12, (FILE_OBJECT **)&DmaAdapter, &v49);
if( result >= 0 )
{
if( v12 )
{
if( (v49.GrantedAccess & 3) == 0 )
{
HalPutDmaAdapter(DmaAdapter);
return -1073741790;
}
v14 = (__int64)IoStatusBlock;
if( (unsigned __int64)IoStatusBlock >= 0x7FFFFFFF0000i64 )
v14 = 0x7FFFFFFF0000i64;
*(_DWORD *)v14 = *(_DWORD *)v14;
IopMarkApcRoutineIfAsynchronousIo32((UINT64 **)&IoStatusBlock, &v54, DmaAdapter[5].Version & 2);
if( ((unsigned __int8)ByteOffset & 3) != 0 )
ExRaiseDatatypeMisalignment();
QuadPart = ByteOffset->QuadPart;
if( ((unsigned __int8)Length & 3) != 0 )
ExRaiseDatatypeMisalignment();
v47 = Length->QuadPart;
v15 = (FILE_OBJECT *)DmaAdapter;
if( *(_QWORD *)&DmaAdapter[11].Version && (v54 & 0xFFFFFFFFFFFFFFFEui64) != 0 )
{
HalPutDmaAdapter(DmaAdapter);
return -1073741811;
}
}
else
{
QuadPart = ByteOffset->QuadPart;
v47 = Length->QuadPart;
v15 = (FILE_OBJECT *)DmaAdapter;
}
v15->LockOperation = 1;
CurrentProcess = PsGetCurrentProcess();
IopSetLockOperationProcess((__int64)v15, CurrentProcess, 0);
if( result >= 0 )
{
if( Event )
{
VirtualAddress = 0i64;
v17 = ObReferenceObjectByHandle(Event, 2u, (POBJECT_TYPE)ExEventObjectType, v12, &VirtualAddress, 0i64);
Eventa = (PRKEVENT)VirtualAddress;
if( v17 >= 0 )
KeResetEvent(VirtualAddress, v18, v19, v20, Object);
}
RelatedDeviceObject = IoGetRelatedDeviceObject(v15);
v22 = *(_QWORD *)(*((_QWORD *)RelatedDeviceObject + 1) + 80i64);
if( !v22 )
goto LABEL_41;
v23 = *(__int64(__fastcall **)(FILE_OBJECT *, LONGLONG *, LONGLONG *, _QWORD, ULONG, int, BOOLEAN, INT64 *, _DEVICE_OBJECT *))(v22 + 48);
if( !v23 )
goto LABEL_41;
*(_OWORD *)IoStatus = 0i64;
if( (MmVerifierData & 0x10) != 0 )
v24 = VfFastIoSnapState();
else
v24 = 0i64;
LOBYTE(HandleInformation) = FailImmediately;
v25 = v23(
v15,
&QuadPart,
&v47,
*((_QWORD *)CurrentThread + 23),
Key,
HandleInformation,
ExclusiveLock,
IoStatus,
RelatedDeviceObject);
v42 = v25;
if( v24 )
{
VfFastIoCheckState(v24, v23);
v25 = v42;
}
if( v25 )
{
if( (v54 & 1) != 0 )
{
v26 = IoStatusBlock;
HIDWORD(IoStatusBlock->Pointer) = IoStatus[1];
v26->Status = IoStatus[0];
}
else
{
*IoStatusBlock = *(PIO_STATUS_BLOCK)IoStatus;
}
if( Eventa )
{
if( (v15->Flags & 0x8000000) == 0 )
KeSetEvent(Eventa, 0);
HalPutDmaAdapter((PADAPTER_OBJECT)Eventa);
}
if( v15->CompletionContext )
{
if( ApcContext )
{
if( (v15->Flags & 0x2000000) == 0 )
{
IoCompletion = 0i64;
Irp = 0i64;
IopIncrementCompletionContextUsageCountAndReadData(v15);
if( IoCompletion )
{
v27 = IoSetIoCompletion(IoCompletion, Irp, ApcContext, LODWORD(IoStatus[0]), IoStatus[1], 1u);
v28 = IoStatus[0];
if( v27 < 0 )
v28 = -1073741670;
LODWORD(IoStatus[0]) = v28;
}
}
}
}
HalPutDmaAdapter((PADAPTER_OBJECT)v15);
return IoStatus[0];
}
else
{
LABEL_41:
if( (v15->Flags & 2) != 0 )
{
v29 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v29 + 242);
v30 = DmaAdapter;
LODWORD(v31) = KeAbPreAcquire(&DmaAdapter[8], 0i64, 0i64);
if( _InterlockedExchange((volatile __int32 *)(&v30[7].Size + 1), 1) )
{
LOBYTE(v32) = v12;
v15 = (FILE_OBJECT *)DmaAdapter;
IopWaitAndAcquireFileObjectLock(DmaAdapter, v32);
}
else
{
if( v31 )
*(_BYTE *)(v31 + 26) |= 1u;
v15 = (FILE_OBJECT *)DmaAdapter;
ObfReferenceObject(DmaAdapter);
}
v33 = 1;
}
else
{
v33 = 0;
}
IopResetEvent(v15);
v34 = IopAllocateIrpExReturn(RelatedDeviceObject, *((_BYTE *)RelatedDeviceObject + 76), v33 ^ 1u, retaddr);
v35 = v34;
Irp = v34;
if( v34 )
{
*((_QWORD *)v34 + 24) = v15;
*((_QWORD *)v34 + 19) = CurrentThread;
*((_BYTE *)v34 + 64) = v12;
*((_QWORD *)v34 + 10) = Eventa;
*((_QWORD *)v34 + 9) = IoStatusBlock;
*((_QWORD *)v34 + 11) = v54;
*((_QWORD *)v34 + 12) = v55;
v36 = *((_QWORD *)v34 + 23);
*(_WORD *)(v36 - 72) = 273;
*(_QWORD *)(v36 - 24) = v15;
*(_BYTE *)(v36 - 70) = 0;
v37 = 0;
if( FailImmediately )
{
*(_BYTE *)(v36 - 70) = 1;
v37 = 1;
}
if( ExclusiveLock )
*(_BYTE *)(v36 - 70) = v37 | 2;
*(_DWORD *)(v36 - 56) = Key;
*(_QWORD *)(v36 - 48) = QuadPart;
PoolWithQuota_4 = IopVerifierExAllocatePoolWithQuota_4();
*PoolWithQuota_4 = v47;
*((_QWORD *)v35 + 20) = PoolWithQuota_4;
*(_QWORD *)(v36 - 64) = PoolWithQuota_4;
LODWORD(v41) = 2;
return IopSynchronousServiceTail(RelatedDeviceObject, v35, v15, 0, v12, v33, v41);
}
else
{
IopAllocateIrpCleanup((PUNICODE_STRING)v15);
return -1073741670;
}
}
}
}
return result;
}Referenced by:
No references.