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


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

Подпрограмма FsRtlMdlReadEx выполняет быстрое кэшированное чтение MDL. Если запрошенные данные не кэшируются, подпрограмма возвращается к операции чтения MDL на основе IRP.

Синтаксис

NTSTATUS FsRtlMdlReadEx(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  ULONG            LockKey,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

Параметры

[in] FileObject

Указатель на объект файла.

[in] FileOffset

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

[in] Length

Длина в байтах данных для чтения из кэша.

[in] LockKey

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

[out] MdlChain

Адрес переменной, получающей указатель на связанный список списков дескрипторов памяти (MDLs). MdlChain необходимо инициализировать для null перед вызовом FsRtlMdlReadEx.

[out] IoStatus

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

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

FsRtlMdlReadEx возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например одно из следующих:

Возвращаемый код Описание
STATUS_INSUFFICIENT_RESOURCES Не удалось выделить IRP для чтения на основе IRP.

Замечания

Если быстрый ввод-вывод доступен из файловой системы, подпрограмма FsRtlMdlReadEx будет обходить обычный механизм чтения IRP и возвращать связанный список списков дескрипторов памяти (MDL), который вызывающий объект может использовать для прямого доступа к кэшированным данным файла. Эта операция не копирует или буферирует данные, поэтому гораздо быстрее, чем обычное чтение. Если быстрый ввод-вывод не включен, FsRtlMdlReadEx создаст синхронное чтение MRP на основе MDL и возвратит mdls из запроса.

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

Как и CcMdlRead, подпрограмма FsRtlMdlReadEx блокирует страницы, содержащие кэшированные данные файла, чтобы предотвратить переключение этих страниц в файл страницы системой. Страницы остаются заблокированными в памяти, пока вызывающий объект не вызовет подпрограмму CcMdlReadComplete.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 8
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

См. также

CcMdlRead

CcMdlReadComplete

IO_STATUS_BLOCK

MmGetSystemAddressForMdlSafe