Функция FsRtlPrepareMdlWriteDev (ntifs.h)
Подпрограмма FsRtlPrepareMdlWriteDev возвращает связанный список списков дескрипторов памяти (MDL), указывающих на указанный диапазон кэшированных данных файлов для записи данных непосредственно в кэш.
Синтаксис
BOOLEAN FsRtlPrepareMdlWriteDev(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] ULONG LockKey,
[out] PMDL *MdlChain,
[out] PIO_STATUS_BLOCK IoStatus,
[ in, optional ] PDEVICE_OBJECT DeviceObject
);
Параметры
[in] FileObject
Указатель на объект file.
[in] FileOffset
Указатель на значение, указывающее смещение начального байта в кэше, в котором хранятся данные.
[in] Length
Длина данных для чтения из кэша в байтах.
[in] LockKey
Значение , связанное с диапазоном байтов для блокировки. Если диапазон для блокировки перекрывает другой диапазон, который уже заблокирован с неисключительной блокировкой, или если диапазон для чтения является поддиапозоном другого диапазона, который уже заблокирован неисключенной, значение в этом параметре должно быть ключом для этой неисключительной блокировки. Блокировка должна удерживаться родительским процессом вызывающего потока. В противном случае этот параметр не действует.
[out] MdlChain
В выходных данных — указатель на связанный список списков дескрипторов памяти (MDL), указывающих на диапазон байтов в кэшированных данных.
[out] IoStatus
Указатель на структуру IO_STATUS_BLOCK , которая в выходных данных содержит состояние передачи. Если операция выполнена успешно, ioStatus.Status имеет значение STATUS_SUCCESS. В противном случае ему присваивается соответствующий код ошибки NTSTATUS. IoStatus.Information — это фактическое число байтов, которое успешно заблокировано подпрограммой.
[ in, optional ] DeviceObject
Указатель на объект устройства, в котором открыт файл.
Возвращаемое значение
Подпрограмма FsRtlPrepareMdlWriteDev возвращает значение TRUE , если операция выполнена успешно, и FALSE в случае сбоя операции.
Комментарии
FsRtlPrepareMdlWriteDev похож на FsRtlCopyWrite, за исключением того, что FsRtlPrepareMdlWriteDev не копирует данные в кэш. Вместо этого физические страницы, которые будет перезаписывать вызывающий объект, блокируются в памяти, а FsRtlPrepareMdlWriteDev возвращает один или несколько списков дескрипторов памяти (MDL), указывающих на указанный диапазон байтов. Заблокированные страницы остаются заблокированными, пока вызывающий объект не вызовет FsRtlMdlWriteCompleteDev.
Страницы, на которые указывают многомерные списки, блокируются в памяти, но не сопоставлены в системном пространстве. Вызывающий объект может выполнить это сопоставление, вызвав MmGetSystemAddressForMdlSafe.
Даже если вызов FsRtlPrepareMdlWriteDev завершается сбоем, возможно, выделено одно или несколько многомерных списков. Вызывающий объект может проверить значение IoStatus.Information , чтобы определить, произошло ли это. Если это так, вызывающий объект должен вызвать FsRtlMdlWriteCompleteDev , чтобы освободить выделенные многомерные списки.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |