Функция 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

См. также раздел

FsRtlMdlWriteCompleteDev

FsRtlCopyWrite

MmGetSystemAddressForMdlSafe