Функция 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
Адрес переменной, получающей указатель на связанный список списков дескрипторов памяти (MDL). 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 создаст синхронное чтение MDL на основе IRP и вернет многомерные значения из запроса.
Страницы, описанные в списках MDL, блокируются в памяти, но не сопоставляются в системном пространстве. Вызывающий объект может выполнить это сопоставление, вызвав MmGetSystemAddressForMdlSafe.
Как и CcMdlRead, подпрограмма FsRtlMdlReadEx блокирует страницы, содержащие кэшированные данные файла, чтобы система не переключала эти страницы на файл подкачки. Страницы остаются заблокированными в памяти, пока вызывающий объект не вызовет подпрограмму CcMdlReadComplete .
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8 |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по