Функция CcPinRead (ntifs.h)
Подпрограмма CcPinRead закрепляет указанный диапазон байтов кэшированного файла и считывает закрепленные данные в буфер в памяти.
Синтаксис
BOOLEAN CcPinRead(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] ULONG Flags,
[out] PVOID *Bcb,
[out] PVOID *Buffer
);
Параметры
[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. |
[out] Bcb
При первом вызове возвращается указатель на блок управления буфером (BCB). Этот указатель должен быть указан в качестве входных данных для всех последующих вызовов этого буфера.
[out] Buffer
Указатель на буфер, содержащий закрепленные данные.
Возвращаемое значение
CcPinRead возвращает значение TRUE , если данные для кэшированного файла были закреплены и считаны успешно, в противном случае — FALSE .
Комментарии
Если установлен флаг PIN_WAIT, CcPinRead гарантированно завершит запрос на закрепление и возвратит значение TRUE. Если необходимые страницы кэшированного файла уже находятся в памяти, данные закрепляются немедленно и блокировка не возникает. Если какие-либо необходимые страницы не являются резидентами, вызывающий объект переводится в состояние ожидания до тех пор, пока все необходимые страницы не будут резидентированы, и данные могут быть закреплены. Если флаг PIN_WAIT не задан, но данные не могут быть закреплены немедленно, CcPinRead возвращает значение FALSE, а значения выходных параметров не имеют смысла.
Если вызывающий объект впоследствии изменяет данные, считываемые CcPinRead, он также должен вызвать CcSetDirtyPinnedData , чтобы измененные данные в конечном итоге были записаны на диск.
Каждый успешный вызов CcPinRead должен соответствовать последующему вызову CcUnpinData.
Указатель, возвращаемый в buffer , действителен до вызова CcUnpinData . Если вызывается CcPinMappedData , пока этот указатель по-прежнему действителен, указатель остается действительным после вызова CcPinMappedData (но только до вызова CcUnpinData ).
CcPinRead не может закрепить данные через границы представления в диспетчере кэша. Диспетчер кэша управляет файлами в системе в представлениях, выровненных по 256 КБ. (Размер представления диспетчера кэша определяется системной константой VACB_MAPPING_GRANULARITY, которая имеет значение 256 КБ в ntifs.h.) Закрепленные области не могут охватывать более одного представления размером 256 КБ. Таким образом, самая большая область, которая может быть закреплена, составляет 256 КБ, начиная со смещения в 256 КБ в файле.
Закрепление диапазона байтов в кэшированном файле не гарантирует, что страницы остаются в памяти. Пока страницы закреплены, диапазон байтов гарантированно будет сопоставляться с виртуальным адресным пространством системного кэша, но диспетчер памяти может выгружать физические страницы по мере потребности системы в памяти.
При возникновении какого-либо сбоя CcPinRead создает исключение состояния для этого конкретного сбоя. Например, если происходит сбой выделения пула, CcPinRead вызывает исключение STATUS_INSUFFICIENT_RESOURCES. При возникновении ошибки ввода-вывода CcPinRead вызывает исключение состояния ошибки ввода-вывода. Таким образом, чтобы получить контроль в случае сбоя, драйвер должен заключить вызов CcPinRead в оператор try-except или try-finally .
Чтобы сопоставить данные для кэшированного файла, используйте подпрограмму CcMapData . Чтобы кэшировать файл, используйте CcInitializeCacheMap.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по