Функция FsRtlCopyRead (ntifs.h)
В FsRtlCopyRead подпрограмма копирует данные из кэшированного файла в буфер пользователя.
Синтаксис
BOOLEAN FsRtlCopyRead(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] BOOLEAN Wait,
[in] ULONG LockKey,
[out] PVOID Buffer,
[out] PIO_STATUS_BLOCK IoStatus,
[in] PDEVICE_OBJECT DeviceObject
);
Параметры
[in] FileObject
Указатель на объект файла для кэшированного файла, из которого будут считываться данные.
[in] FileOffset
Запуск смещения байтов в кэшированном файле.
[in] Length
Длина в байтах данных для чтения.
[in] Wait
Установите значение TRUE, если вызывающий объект может быть помещен в состояние ожидания до тех пор, пока все данные не будут скопированы, значение FALSE в противном случае.
[in] LockKey
Значение, связанное с диапазоном байтов для блокировки. Если диапазон для блокировки перекрывает другой диапазон, который уже заблокирован с неисключительной блокировкой, или если диапазон для чтения является подрангом другого диапазона, который уже заблокирован неисключительно, значение в этом параметре должно быть ключом для этой неисключительной блокировки, блокировка должна храниться родительским процессом вызывающего потока. В противном случае этот параметр не действует.
[out] Buffer
Указатель на буфер, в который копируются данные.
[out] IoStatus
Указатель на выделенную вызывающим объектом структуру, которая получает окончательное состояние завершения и сведения об операции. Если данные копируются успешно, IoStatus.Status содержит STATUS_SUCCESS. Если не все данные копируются успешно, IoStatus.Information содержит фактическое количество байтов, скопированных.
[in] DeviceObject
Объект устройства, в котором хранятся данные файла.
Возвращаемое значение
FsRtlCopyRead возвращает значение TRUE, если запрос копирования был завершен, значение FALSE в противном случае. Обратите внимание, что возвращаемое значение TRUE не обязательно означает, что операция копирования была успешной.
Если FsRtlCopyRead возвращает значение FALSE или если содержимое IoStatus указывает, что операция копирования завершилась ошибкой, вызывающий объект должен выделить IRP для чтения вместо вызова FsRtlCopyRead.
Замечания
Вместо реализации процедуры быстрого чтения операций ввода-вывода для конкретной файловой системы разработчики файловых систем, поддерживающих кэширование файлов, должны рассмотреть возможность использования FsRtlCopyRead в качестве точки входа файловой системы для обработки быстрых запросов ввода-вывода. Для этого требуется, чтобы в DriverEntry файловой системы точка входа FastIoReadFsRtlCopyRead в структуре FAST_IO_DISPATCH объекта драйвера файловой системы. Кроме того, файловая система должна выполнять следующие действия:
Для каждого файла, на котором могут выполняться быстрые операции ввода-вывода, файловая система должна выделить и инициализировать структуру FSRTL_COMMON_FCB_HEADER.
В большинстве файловых систем это достигается путем включения FSRTL_COMMON_FCB_HEADER структуры в блок управления файлами (FCB) или сопоставимую структуру, которая используется для поддержания состояния открытого файла.
Хранилище для структуры FSRTL_COMMON_FCB_HEADER обычно выделяется из пула страниц.
Для каждого файла, на котором могут выполняться быстрые операции ввода-вывода, файловая система должна связать любые объекты файлов для файла с структурой FSRTL_COMMON_FCB_HEADER. Это делается путем задания каждого объекта файла FsContext элемента, указывающего на эту структуру (или ФКБ или другую структуру, содержащую структуру FSRTL_COMMON_FCB_HEADER).
При кэшировании файла файловая система должна задать IsFastIoPossible элемент структуры FSRTL_COMMON_FCB_HEADER файла соответствующим значением. Это значение должно обновляться по мере необходимости, пока файл остается кэшированным.
В частности, файловые системы должны задать IsFastIoPossible член структуры FSRTL_COMMON_FCB_HEADER, чтобы FastIoIsQuestionable, как только существует любая монопольная блокировка диапазона байтов в кэшированном файле.
Если ожидание имеет значение TRUE, FsRtlCopyRead гарантированно завершит запрос копирования и возвратит ЗНАЧЕНИЕ TRUE. Если необходимые страницы кэшированного файла уже находятся в памяти, данные будут скопированы немедленно, и блокировка не будет возникать. Если все необходимые страницы не являются резидентами, вызывающий объект будет помещен в состояние ожидания до тех пор, пока все необходимые страницы не были сделаны резидентами и данные можно скопировать.
Если ожидание имеет значение FALSE, FsRtlCopyRead откажется от блокировки и вернет значение FALSE, если он не может получить основной ресурс файла или если необходимые страницы кэшированного файла еще не находятся в памяти.
Подпрограмма fastIoCheckIfPossible файловой системы отвечает за обеспечение того, чтобы диапазон байтов, определенный FileOffset и Length, не включает только заблокированный диапазон байтов, для которого вызывающий объект не передает соответствующее значение LockKey. Если файловая система использует
Чтобы кэшировать файл, используйте подпрограмму CcInitializeCacheMap.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | ntifs.h (include Ntifs.h) |
библиотеки |
NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
правил соответствия DDI |
PowerIrpDDis(wdm) |