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,
BOOL FailImmediately,
BOOL ExclusiveLock){
VOID *v11;
INT8 PreviousMode;
NTSTATUS result;
__int64 v14;
PADAPTER_OBJECT v15;
_KPROCESS *CurrentProcess;
UINT8 *v17;
NTSTATUS v18;
_DEVICE_OBJECT *v19;
_DEVICE_OBJECT *v20;
_FAST_IO_DISPATCH *FastIoDispatch;
unsigned __int8(__fastcall *FastIoLock)(_FILE_OBJECT *, _LARGE_INTEGER *, _LARGE_INTEGER *, _EPROCESS *, unsigned int, unsigned __int8, unsigned __int8, _IO_STATUS_BLOCK *, _DEVICE_OBJECT *);
VOID *v23;
unsigned __int8 v24;
PIO_STATUS_BLOCK v25;
NTSTATUS v26;
int v27;
bool v28;
_ETHREAD *v29;
PADAPTER_OBJECT v30;
_BYTE *v31;
NTSTATUS v32;
UINT8 v33;
_IRP *Irp;
_IRP *v35;
_IO_STACK_LOCATION *CurrentStackLocation;
char v37;
char *PoolWithQuota_4;
_OBJECT_HANDLE_INFORMATION *pHandleInformation;
POBJECT_HANDLE_INFORMATION HandleInformation;
int HandleInformationa;
UINT64 TransferType;
_TRANSFER_TYPE TransferTypea;
UINT64 *v44;
void *v45;
INT64 v46;
PADAPTER_OBJECT DmaAdapter;
PRKEVENT Eventa;
INT64 IoStatus[2];
LONGLONG QuadPart;
LONGLONG v51;
PVOID KeyContext;
_OBJECT_HANDLE_INFORMATION v53;
PVOID Object;
PVOID IoCompletion;
_ETHREAD *CurrentThread;
VOID *retaddr;
INT64 v58;
PVOID v59;
v59 = ApcContext;
v58 = (INT64)ApcRoutine;
v11 = *(VOID **)&Event;
DmaAdapter = 0i64;
Eventa = 0i64;
QuadPart = 0i64;
v51 = 0i64;
v53 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
PreviousMode = CurrentThread->Tcb.PreviousMode;
result = IopReferenceFileObject(*(VOID **)&FileHandle, 0i64, PreviousMode, (_FILE_OBJECT **)&DmaAdapter, &v53);
if( result >= 0 )
{
if( PreviousMode )
{
if( (v53.GrantedAccess & 3) == 0 )
{
HalPutDmaAdapter(DmaAdapter);
return -1073741790;
}
v14 = (__int64)IoStatusBlock;
if( (unsigned __int64)IoStatusBlock >= 0x7FFFFFFF0000i64 )
v14 = 0x7FFFFFFF0000i64;
*(_DWORD *)v14 = *(_DWORD *)v14;
IopMarkApcRoutineIfAsynchronousIo32(
(UINT64 **)&IoStatusBlock,
&v58,
DmaAdapter->AdapterObject.ScatterTranslationEnd.Offset & 2);
if( ((unsigned __int8)ByteOffset & 3) != 0 )
ExRaiseDatatypeMisalignment();
QuadPart = ByteOffset->QuadPart;
if( ((unsigned __int8)Length & 3) != 0 )
ExRaiseDatatypeMisalignment();
v51 = Length->QuadPart;
v15 = DmaAdapter;
if( DmaAdapter->WaitQueueEntry[1].Flink && (v58 & 0xFFFFFFFFFFFFFFFEui64) != 0 )
{
HalPutDmaAdapter(DmaAdapter);
return -1073741811;
}
}
else
{
QuadPart = ByteOffset->QuadPart;
v51 = Length->QuadPart;
v15 = DmaAdapter;
}
LOBYTE(v15->AdapterObject.ScatterTranslationEnd.Buffer) = 1;
CurrentProcess = (_EPROCESS *)PsGetCurrentProcess();
result = IopSetLockOperationProcess(
(UINT16)v15,
CurrentProcess->Pcb.gap0,
0i64,
v17,
(UINT64)pHandleInformation,
(UINT64)HandleInformation,
TransferType,
v44,
v45);
if( result >= 0 )
{
if( v11 )
{
Object = 0i64;
v18 = ObReferenceObjectByHandle(v11, 2ui64, (_OBJECT_TYPE *)ExEventObjectType, PreviousMode, &Object, 0i64);
Eventa = (PRKEVENT)Object;
if( v18 >= 0 )
KeResetEvent((_KEVENT *)Object);
}
LODWORD(v19) = IoGetRelatedDeviceObject((INT64)v15);
v20 = v19;
FastIoDispatch = v19->DriverObject->FastIoDispatch;
if( FastIoDispatch )
{
FastIoLock = FastIoDispatch->FastIoLock;
if( FastIoLock )
{
*(_OWORD *)IoStatus = 0i64;
if( (MmVerifierData & 0x10) != 0 )
v23 = VfFastIoSnapState();
else
v23 = 0i64;
LOBYTE(TransferTypea) = ExclusiveLock;
LOBYTE(HandleInformationa) = FailImmediately;
v24 = FastIoLock(
(_FILE_OBJECT *)v15,
(_LARGE_INTEGER *)&QuadPart,
(_LARGE_INTEGER *)&v51,
CurrentThread->Tcb.ApcState.Process,
Key,
HandleInformationa,
TransferTypea,
(_IO_STATUS_BLOCK *)IoStatus,
v20);
LOBYTE(v46) = v24;
if( v23 )
{
VfFastIoCheckState(v23, FastIoLock);
v24 = v46;
}
if( v24 )
{
if( (v58 & 1) != 0 )
{
v25 = IoStatusBlock;
HIDWORD(IoStatusBlock->Pointer) = IoStatus[1];
v25->Status = IoStatus[0];
}
else
{
*IoStatusBlock = *(PIO_STATUS_BLOCK)IoStatus;
}
if( Eventa )
{
if( (v15->AdapterObject.ScatterTranslationEnd.Offset & 0x8000000) == 0 )
KeSetEvent(Eventa, 0, 0);
HalPutDmaAdapter((PADAPTER_OBJECT)Eventa);
}
if( v15->WaitQueueEntry[1].Flink )
{
if( ApcContext )
{
if( (v15->AdapterObject.ScatterTranslationEnd.Offset & 0x2000000) == 0 )
{
IoCompletion = 0i64;
KeyContext = 0i64;
BYTE1(v46) = 0;
IopIncrementCompletionContextUsageCountAndReadData(v15);
if( IoCompletion )
{
v26 = IoSetIoCompletion(IoCompletion, KeyContext, ApcContext, LODWORD(IoStatus[0]), IoStatus[1], 1u);
v27 = IoStatus[0];
if( v26 < 0 )
v27 = -1073741670;
LODWORD(IoStatus[0]) = v27;
}
}
}
}
HalPutDmaAdapter(v15);
return IoStatus[0];
}
}
}
if( (v15->AdapterObject.ScatterTranslationEnd.Offset & 2) != 0 )
{
v28 = (v15->AdapterObject.ScatterTranslationEnd.Offset & 4) != 0;
v29 = (_ETHREAD *)KeGetCurrentThread();
--v29->Tcb.KernelApcDisable;
v30 = DmaAdapter;
v31 = KeAbPreAcquire(&DmaAdapter->AdapterObject.GrowLock, 0i64, 0i64);
LOBYTE(v46) = 0;
if( _InterlockedExchange((volatile __int32 *)&v30->AdapterObject.CrashDump.ScatterHint.Offset + 1, 1) )
{
v15 = DmaAdapter;
v32 = IopWaitAndAcquireFileObjectLock(DmaAdapter, PreviousMode, v28, v31, (INT64)&v46);
}
else
{
if( v31 )
v31[26] |= 1u;
v15 = DmaAdapter;
ObfReferenceObject(DmaAdapter);
v32 = 0;
}
if( (_BYTE)v46 )
{
if( Eventa )
HalPutDmaAdapter((PADAPTER_OBJECT)Eventa);
HalPutDmaAdapter(v15);
return v32;
}
v33 = 1;
}
else
{
v33 = 0;
}
IopResetEvent((_FILE_OBJECT *)v15);
Irp = IopAllocateIrpExReturn(v20, v20->StackSize, v33 ^ 1u, retaddr);
v35 = Irp;
KeyContext = Irp;
if( Irp )
{
Irp->Tail.OriginalFileObject = (_FILE_OBJECT *)v15;
Irp->Tail.Thread = CurrentThread;
Irp->RequestorMode = PreviousMode;
Irp->UserEvent = Eventa;
Irp->UserIosb = IoStatusBlock;
Irp->Overlay.UserApcRoutine = (void(__fastcall *)(void *, _IO_STATUS_BLOCK *, unsigned int))v58;
Irp->Overlay.UserApcContext = v59;
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
*(_WORD *)&CurrentStackLocation[-1].MajorFunction = 273;
CurrentStackLocation[-1].FileObject = (_FILE_OBJECT *)v15;
CurrentStackLocation[-1].Flags = 0;
v37 = 0;
if( FailImmediately )
{
CurrentStackLocation[-1].Flags = 1;
v37 = 1;
}
if( ExclusiveLock )
CurrentStackLocation[-1].Flags = v37 | 2;
CurrentStackLocation[-1].Parameters.Options = Key;
*(_QWORD *)&CurrentStackLocation[-1].Parameters.FileAttributes = QuadPart;
PoolWithQuota_4 = (char *)IopVerifierExAllocatePoolWithQuota_4();
*(_QWORD *)PoolWithQuota_4 = v51;
v35->Tail.AuxiliaryBuffer = PoolWithQuota_4;
CurrentStackLocation[-1].Parameters.SecurityContext = (_IO_SECURITY_CONTEXT *)PoolWithQuota_4;
return IopSynchronousServiceTail(v20, v35, (_FILE_OBJECT *)v15, 0, PreviousMode, v33, OtherTransfer);
}
else
{
IopAllocateIrpCleanup(v15, Eventa);
return -1073741670;
}
}
}
return result;
}Referenced by:
No references.