Функция 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 |
См. также
mmInitializeMdl
mmProbeAndLockPages