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

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

None

Remarks

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

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

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

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

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

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая 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