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


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

Подпрограмма CcPinMappedData закрепляет указанный диапазон байтов кэшированного файла.

Синтаксис

BOOLEAN CcPinMappedData(
  [in]      PFILE_OBJECT   FileObject,
  [in]      PLARGE_INTEGER FileOffset,
  [in]      ULONG          Length,
  [in]      ULONG          Flags,
  [in, out] PVOID          *Bcb
);

Параметры

[in] FileObject

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

[in] FileOffset

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

[in] Length

Длина в байтах данных для закрепления.

[in] Flags

Битовая маска флагов, указывающая, как выполняется операция закрепления. Сочетание ORed одного или нескольких из следующих значений:

Флаг Значение
PIN_WAIT Вызывающий объект можно поместить в состояние ожидания до тех пор, пока данные не будут закреплены.
PIN_EXCLUSIVE Блок управления буфером (BCB) должен быть приобретен исключительно. Если этот флаг задан, PIN_WAIT также необходимо задать.
PIN_NO_READ Необходимо закрепить только страницы, которые уже находятся в памяти. Если этот флаг задан, PIN_WAIT также необходимо задать.
PIN_IF_BCB Данные должны быть закреплены только в том случае, если BCB уже существует. В противном случае пин-код завершается ошибкой и Bcb имеет значение NULL.

[in, out] Bcb

При первом вызове возвращает указатель на блок управления буфером (BCB). Этот указатель должен быть предоставлен в качестве входных данных для всех последующих вызовов этого буфера.

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

CcPinMappedData возвращает TRUE, если данные кэшированного файла были успешно закреплены, FALSE в противном случае.

Замечания

Успешный возврат из CcPinMappedData гарантирует безопасное изменение данных, сопоставленных в вызове CcMapData, в кэше и данных в указанном диапазоне. Если вызывающий объект впоследствии изменяет данные, закрепленные CcPinMappedData, он также должен вызывать CcSetDirtyPinnedData, чтобы измененные данные в конечном итоге записывалися на диск.

CcPinMappedData не может закреплять данные через границы представления в диспетчере кэша. Диспетчер кэша управляет файлами в системе в 256 КБ в выровненных представлениях. (Размер представления диспетчера кэша определяется системной константой VACB_MAPPING_GRANULARITY, которая имеет значение 256 КБ в ntifs.h.) Закрепленные регионы не могут охватывать более одного представления 256 КБ. Таким образом, самый большой регион, который можно закрепить, составляет 256 КБ, начиная с смещения с выравниванием 256 КБ в файле.

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

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

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

Не обязательно вызывать CcUnpinData после вызова CcPinMappedData, так как ссылка на закрепление соответствует CcMapData.

Требования

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

См. также

CcInitializeCacheMap

CcMapData

CcPinRead

CcPreparePinWrite

CcSetDirtyPinnedData

CcUnpinData