Функция 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 |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по