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


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

Подпрограмма FsRtlPrepareMdlWriteDev возвращает связанный список списков дескрипторов памяти (MDLs), указывающий на указанный диапазон кэшированных данных для записи данных непосредственно в кэш.

Синтаксис

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

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

[in] FileOffset

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

[in] Length

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

[in] LockKey

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

[out] MdlChain

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

[out] IoStatus

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

[ in, optional ] DeviceObject

Указатель на объект устройства, на который открывается файл.

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

Подпрограмма FsRtlPrepareMdlWriteDev возвращает TRUE, если операция завершается успешно и FALSE, если операция завершается ошибкой.

Замечания

FsRtlPrepareMdlWriteDev аналогичен FsRtlCopyWrite, за исключением того, что FsRtlPrepareMdlWriteDev не копирует данные в кэш. Вместо этого физические страницы, которые вызывающий объект перезаписывает, блокируются в памяти, и FsRtlPrepareMdlWriteDev возвращает один или несколько списков дескрипторов памяти (MDLs), указывающих на указанный диапазон байтов. Заблокированные страницы остаются заблокированными, пока вызывающий объект не вызывает FsRtlMdlWriteCompleteDev.

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

Даже если вызов FsRtlPrepareMdlWriteDev завершается ошибкой, возможно, выделено одно или несколько многомерных выражений. Вызывающий объект может проверить значение IoStatus.Information, чтобы определить, произошло ли это. Если он есть, вызывающий объект должен вызвать FsRtlMdlWriteCompleteDev, чтобы освободить выделенные многомерные выражения.

Требования

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

См. также

FsRtlMdlWriteCompleteDev

FsRtlCopyWrite

MmGetSystemAddressForMdlSafe