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.