FsRtlCopyRead

UINT8 __stdcall FsRtlCopyRead(
        PFILE_OBJECT FileObject,
        PLARGE_INTEGER FileOffset,
        UINT64 Length,
        BOOL Wait,
        UINT64 LockKey,
        VOID *Buffer,
        PIO_STATUS_BLOCK IoStatus,
        PDEVICE_OBJECT DeviceObject){
  __int64 v9; 
  LONGLONG v13; 
  _QWORD *FsContext; 
  _ETHREAD *CurrentThread; 
  UINT8 v16; 
  __int64 v17; 
  char v18; 
  LONGLONG v19; 
  UINT8 v20; 

  v9 = (unsigned int)Length;
  if( IoGetTopLevelIrp() )
    return 0;
  if( (_DWORD)v9 )
  {
    if( 0x7FFFFFFFFFFFFFFFi64 - FileOffset->QuadPart < v9 )
    {
      IoStatus->Status = -1073741811;
      IoStatus->Information = 0i64;
      return 0;
    }
    v13 = v9 + FileOffset->QuadPart;
    FsContext = FileObject->FsContext;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    if( Wait )
    {
      __incgsdword(0x2EC8u);
      v16 = 1;
      ExAcquireResourceSharedLite(FsContext[1], 1);
    }
    else
    {
      __incgsdword(0x2EC4u);
      if( !(unsigned __int8)ExAcquireResourceSharedLite(FsContext[1], 0) )
      {
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        __incgsdword(0x8140u);
        return 0;
      }
      v16 = 1;
    }
    if( !FileObject->PrivateCacheMap
      || (v18 = *((_BYTE *)FsContext + 5)) == 0
      || v18 == 2
      && (LOBYTE(v17) = Wait,
          !DeviceObject->DriverObject->FastIoDispatch->FastIoCheckIfPossible(
             FileObject,
             FileOffset,
             v9,
             v17,
             LockKey,
             1u,
             IoStatus,
             DeviceObject)) )
    {
      ExReleaseResourceLite((PERESOURCE)FsContext[1]);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      __incgsdword(0x2ECCu);
      return 0;
    }
    v19 = FsContext[4];
    if( v13 > v19 )
    {
      if( FileOffset->QuadPart >= v19 )
      {
        IoStatus->Status = -1073741807;
        IoStatus->Information = 0i64;
LABEL_22:
        ExReleaseResourceLite((PERESOURCE)FsContext[1]);
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        return v16;
      }
      LODWORD(v9) = v19 - FileOffset->anonymous_0.LowPart;
    }
    IoSetTopLevelIrp((_IRP *)4);
    CcCopyReadEx(FileObject, FileOffset, (unsigned int)v9, Wait, Buffer, IoStatus, 0i64);
    v16 = v20;
    FileObject->Flags |= 0x80000u;
    if( v20 )
      FileObject->CurrentByteOffset.QuadPart = FileOffset->QuadPart + IoStatus->Information;
    IoSetTopLevelIrp(0i64);
    goto LABEL_22;
  }
  IoStatus->Status = 0;
  IoStatus->Information = 0i64;
  return 1;
}

Referenced by:

No references.