FsRtlCopyRead

UINT8 __stdcall FsRtlCopyRead(
        FILE_OBJECT *FileObject,
        LARGE_INTEGER *FileOffset,
        UINT64 Length,
        UINT8 Wait,
        UINT64 LockKey,
        VOID *Buffer,
        IO_STATUS_BLOCK *IoStatus,
        DEVICE_OBJECT *DeviceObject){
  __int64 v9; 
  BOOL v12; 
  LONGLONG v14; 
  void *FsContext; 
  _ETHREAD *CurrentThread; 
  UINT8 v17; 
  _MMSUPPORT_INSTANCE *v18; 
  UINT64 v19; 
  UINT64 v20; 
  char v21; 
  LONGLONG v22; 
  _MMSUPPORT_INSTANCE *v23; 
  UINT64 v24; 
  UINT64 v25; 
  UINT8 v26; 
  UINT64 InputGetPageFlags; 
  UINT64 InputGetPageFlagsa; 
  UINT64 Alignment; 
  UINT64 Alignmenta; 
  UINT64 *NumberOfPages; 
  UINT64 *NumberOfPagesa; 
  v9 = (unsigned int)Length;
  if( IoGetTopLevelIrp() )
    return 0;
  if( (_DWORD)v9 )
  {
    if( 0x7FFFFFFFFFFFFFFFi64 - FileOffset->QuadPart < v9 )
    {
      IoStatus->Status = -1073741811;
      IoStatus->Information = 0i64;
      return 0;
    }
    v14 = v9 + FileOffset->QuadPart;
    FsContext = FileObject->FsContext;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    if( Wait )
    {
      __incgsdword(0x2EC8u);
      v17 = 1;
      LOBYTE(v12) = 1;
      ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), v12);
    }
    else
    {
      __incgsdword(0x2EC4u);
      if( !ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), 0) )
      {
        KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        __incgsdword(0x8140u);
        return 0;
      }
      v17 = 1;
    }
    if( !FileObject->PrivateCacheMap
      || (v21 = *((_BYTE *)FsContext + 5)) == 0
      || v21 == 2
      && (NumberOfPages = (UINT64 *)IoStatus,
          LOBYTE(Alignment) = 1,
          LODWORD(InputGetPageFlags) = LockKey,
          LOBYTE(v20) = Wait,
          !(*(unsigned __int8(__fastcall **)(FILE_OBJECT *, LARGE_INTEGER *, _QWORD, UINT64))(*(_QWORD *)(*((_QWORD *)DeviceObject + 1) + 80i64)
                                                                                             + 8i64))(
             FileObject,
             FileOffset,
             (unsigned int)v9,
             v20)) )
    {
      ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      __incgsdword(0x2ECCu);
      return 0;
    }
    v22 = *((_QWORD *)FsContext + 4);
    if( v14 > v22 )
    {
      if( FileOffset->QuadPart >= v22 )
      {
        IoStatus->Status = -1073741807;
        IoStatus->Information = 0i64;
LABEL_22:
        ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
        KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        return v17;
      }
      LODWORD(v9) = v22 - FileOffset->LowPart;
    }
    IoSetTopLevelIrp((_MI_PARTITION *)4, v18, v19, v20, InputGetPageFlags, Alignment, NumberOfPages);
    CcCopyReadEx(FileObject, FileOffset, (unsigned int)v9, Wait, Buffer, IoStatus, 0i64);
    v17 = v26;
    FileObject->Flags |= 0x80000u;
    if( v26 )
      FileObject->CurrentByteOffset.QuadPart = FileOffset->QuadPart + IoStatus->Information;
    IoSetTopLevelIrp(0i64, v23, v24, v25, InputGetPageFlagsa, Alignmenta, NumberOfPagesa);
    goto LABEL_22;
  }
  IoStatus->Status = 0;
  IoStatus->Information = 0i64;
  return 1;
}

Referenced by:

No references.