Поделиться через


Функция FsRtlCopyWrite (ntifs.h)

В FsRtlCopyWrite подпрограмма копирует данные из буфера пользователя в кэшированный файл.

Синтаксис

BOOLEAN FsRtlCopyWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  BOOLEAN          Wait,
  [in]  ULONG            LockKey,
  [in]  PVOID            Buffer,
  [out] PIO_STATUS_BLOCK IoStatus,
  [in]  PDEVICE_OBJECT   DeviceObject
);

Параметры

[in] FileObject

Указатель на объект файла для кэшированного файла, в который записываются данные.

[in] FileOffset

Указатель на переменную, указывающую начальное смещение байтов в кэшированном файле.

[in] Length

Длина в байтах записываемых данных.

[in] Wait

Установите значение TRUE, если вызывающий объект может быть помещен в состояние ожидания до тех пор, пока все данные не будут скопированы, значение FALSE в противном случае.

[in] LockKey

Значение, связанное с диапазоном байтов для блокировки. Если диапазон для блокировки перекрывает другой диапазон, который уже заблокирован с неисключительной блокировкой, или если диапазон для чтения является подрангом другого диапазона, который уже заблокирован неисключительно, значение в этом параметре должно быть ключом для этой неисключительной блокировки, блокировка должна храниться родительским процессом вызывающего потока. В противном случае этот параметр не действует.

[in] Buffer

Указатель на буфер, из которого копируются данные.

[out] IoStatus

Указатель на выделенную вызывающим объектом структуру, которая получает окончательное состояние завершения и сведения об операции. Если данные копируются успешно, IoStatus.Status содержит STATUS_SUCCESS. Если не все данные копируются успешно, IoStatus.Information содержит фактическое количество байтов, скопированных.

[in] DeviceObject

Указатель на объект устройства для подключенного тома, в котором хранятся данные файла.

Возвращаемое значение

FsRtlCopyWrite возвращает значение TRUE, если запрос копирования был завершен, значение FALSE в противном случае. Обратите внимание, что возвращаемое значение TRUE не обязательно означает, что операция копирования была успешной.

Если FsRtlCopyWrite возвращает значение FALSE или если содержимое IoStatus указывает, что операция копирования завершилась ошибкой, вызывающий объект должен выделить IRP записи вместо вызова FsRtlCopyWrite.

Замечания

Вместо реализации процедуры быстрой записи в файловой системе разработчики файловых систем, поддерживающих кэширование файлов, должны рассмотреть возможность использования FsRtlCopyWrite в качестве точки входа файловой системы для обработки быстрых запросов ввода-вывода. Для этого требуется, чтобы программа driverEntry DriverEntry установила точку входа FastIoWrite FsRtlCopyWrite в структуре FAST_IO_DISPATCH объекта драйвера файловой системы. Кроме того, файловая система должна выполнять следующие действия:

  1. Для каждого файла, на котором могут выполняться быстрые операции ввода-вывода, файловая система должна выделить и инициализировать структуру FSRTL_COMMON_FCB_HEADER.

    В большинстве файловых систем это достигается путем включения FSRTL_COMMON_FCB_HEADER структуры в блок управления файлами (FCB) или сопоставимую структуру, которая используется для поддержания состояния открытого файла.

    Хранилище для структуры FSRTL_COMMON_FCB_HEADER обычно выделяется из пула страниц.

  2. Для каждого файла, на котором могут выполняться быстрые операции ввода-вывода, файловая система должна связать любые объекты файлов для файла с структурой FSRTL_COMMON_FCB_HEADER. Это делается путем задания каждого объекта файла FsContext элемента, указывающего на эту структуру (или на ФКБ или другую структуру, содержащую структуру FSRTL_COMMON_FCB_HEADER).

  3. При кэшировании файла файловая система должна задать IsFastIoPossible элемент структуры FSRTL_COMMON_FCB_HEADER файла соответствующим значением. Это значение должно обновляться по мере необходимости, пока файл остается кэшированным.

    В частности, файловые системы должны задать IsFastIoPossible член структуры FSRTL_COMMON_FCB_HEADER, чтобы FastIoIsQuestionable, как только любой монопольный диапазон байтов в кэшированном файле существует.

Если Ждать имеет значение TRUE, FsRtlCopyWrite гарантированно копировать данные и возвращать ЗНАЧЕНИЕ TRUE. Если необходимые страницы кэшированного файла уже находятся в памяти, данные будут скопированы немедленно, и блокировка не будет возникать. Если все необходимые страницы не являются резидентами, вызывающий объект будет помещен в состояние ожидания до тех пор, пока все необходимые страницы не были сделаны резидентами и данные можно скопировать.

Если ожидание имеет значение FALSE, FsRtlCopyWrite откажется от блокировки и вернет значение FALSE, если он не может получить основной ресурс файла или если необходимые страницы кэшированного файла еще не находятся в памяти.

Подпрограмма fastIoCheckIfPossible файловой системы отвечает за обеспечение того, чтобы диапазон байтов, определенный FileOffset и Length, не включает только заблокированный диапазон байтов, для которого вызывающий объект не передает соответствующее значение LockKey. Если в файловой системе используется FsRtlXxxLockYyy для управления блокировками диапазона байтов, это можно сделать путем вызова FsRtlFastCheckLockForWriteиз подпрограммы fastIoCheckIfPoss ible перед вызовом FsRtlCopyRead.

Чтобы кэшировать файл, используйте подпрограмму CcInitializeCacheMap.

Требования

Требование Ценность
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
правил соответствия DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

См. также

CcInitializeCacheMap

FsRtlCopyRead

FsRtlFastCheckLockForWrite