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


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

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

Синтаксис

void CcPrepareMdlWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

Параметры

[in] FileObject

Указатель на объект файла для кэшированного файла.

[in] FileOffset

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

[in] Length

Длина в байтах данных, записываемых в системный кэш.

[out] MdlChain

Цепочка из одного или нескольких списков дескриптора памяти (MDL), описывающая страницы, на которые записываются данные.

[out] IoStatus

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

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

Никакой

Замечания

CcPrepareMdlWrite аналогично CcCopyWrite, за исключением того, что данные не копируются в кэшированный файл. Вместо этого физические страницы, которые необходимо перезаписать в системном кэше, блокируются в памяти, и CcPrepareMdlWrite возвращает один или несколько списков дескрипторов памяти (MDL), описывающих указанный диапазон байтов. Эти страницы остаются заблокированными в памяти, пока CcMdlWriteComplete или CcMdlWriteAbort. Таким образом, каждый вызов CcPrepareMdlWrite должен следовать вызову CcMdlWriteComplete или CcMdlWriteAbort.

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

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

Если произойдет сбой, CcPrepareMdlWrite вызывает исключение состояния для конкретного сбоя. Например, если возникает сбой выделения пула, CcPrepareMdlWrite вызывает исключение STATUS_INSUFFICIENT_RESOURCES; Если возникает ошибка ввода-вывода, CcPrepareMdlWrite вызывает исключение состояния ошибки ввода-вывода. Таким образом, чтобы получить контроль при возникновении сбоя, драйвер должен упаковать вызов CcPrepareMdlWrite в , кроме или инструкции try-finally.

Чтобы кэшировать файл, используйте CcInitializeCacheMap.

Требования

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

См. также

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

mmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

mmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages