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.