Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Программа CcPreparePinWrite закрепляет указанный диапазон байтов кэшированного файла для доступа на запись.
Синтаксис
BOOLEAN CcPreparePinWrite(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] BOOLEAN Zero,
[in] ULONG Flags,
[out] PVOID *Bcb,
[out] PVOID *Buffer
);
Параметры
[in] FileObject
Указатель на объект файла для кэшированного файла, в который записываются данные.
[in] FileOffset
Указатель на переменную, указывающую начальное смещение байтов в файле, в котором записываются данные.
[in] Length
Длина требуемых данных в байтах.
[in] Zero
Задайте значение TRUE, если буфер должен быть нолен при возврате. Этот параметр игнорируется, если флаг PIN_CALLER_TRACKS_DIRTY_DATA задан в параметре Flags.
[in] Flags
Битовая маска флагов, указывающая, как выполняется операция закрепления. Сочетание ORed одного или нескольких из следующих значений:
| Ценность | Значение |
|---|---|
| PIN_WAIT | Вызывающий объект можно поместить в состояние ожидания до тех пор, пока данные не будут закреплены. |
| PIN_EXCLUSIVE | Блок управления буфером (BCB) должен быть приобретен исключительно. |
| PIN_NO_READ | Необходимо закрепить только страницы, которые уже находятся в памяти. Если этот флаг задан, PIN_WAIT также необходимо задать. |
| PIN_IF_BCB | Данные должны быть закреплены только в том случае, если BCB уже существует. В противном случае пин-код завершается ошибкой и не возвращается BCB. |
| PIN_CALLER_TRACKS_DIRTY_DATA | Вызывающий отвечает за отслеживание грязных страниц. Если этот флаг задан, все остальные флаги игнорируются. Этот флаг доступен в Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий. |
[out] Bcb
Непрозрачный указатель на закрепленный блок управления буфером (BCB). Этот указатель должен быть предоставлен в качестве входных данных для всех последующих вызовов CcPreparePinWrite или CcUnpinData для этого буфера.
[out] Buffer
Возвращает указатель на нужные данные, допустимый до тех пор, пока буфер не будет откреплен или освобожден.
Возвращаемое значение
CcPreparePinWrite возвращает TRUE, если кэшированный файл был успешно закреплен, FALSE в противном случае.
Замечания
CcPreparePinWrite закрепляет указанные страницы файлов в системном кэше. Страницы, которые должны быть полностью перезаписаны, могут быть удовлетворены страницами нуля.
Если установлен флаг PIN_WAIT, CcPreparePinWrite гарантированно завершит запрос на подготовку и возврат TRUE. Если все страницы могут быть подготовлены немедленно, блокировка не возникает. Если все необходимые страницы не являются резидентами, вызывающий объект помещается в состояние ожидания до тех пор, пока все необходимые страницы не были сделаны резидентами и страницы можно будет подготовить. Если флаг PIN_WAIT не задан, но не все страницы могут быть подготовлены немедленно, CcPreparePinWrite возвращает значение FALSE, а его выходные значения параметров являются бессмысленными.
Microsoft Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий: флаг PIN_CALLER_TRACKS_DIRTY_DATA часто используется в случаях, когда файловая система управляет файлом журнала, записанным в файл журнала, но не считывается. Так как существующие данные файла будут перезаписаны и не считываются, диспетчер кэша может возвращать страницы нуля вместо сбоя на фактических страницах данных файла с диска. Если этот флаг задан, диспетчер кэша не отслеживает грязные страницы. Вызывающий отвечает за отслеживание любых грязных страниц. Обратите внимание, что CcPreparePinWrite следует использовать только для закрепления данных таким образом, если буфер в конечном итоге будет удален на диск. Прежде чем вызывать CcFlushCache для очистки буфера на диск, вызывающий объект должен сначала вызвать MmSetAddressRangeModified, чтобы уведомить диспетчер памяти о том, что указанные страницы в буфере кэша системы грязны и должны быть записаны.
Каждый успешный вызов CcPreparePinWrite должен соответствовать последующему вызову CcUnpinData. Если CcPreparePinWrite вызывается несколько раз для одних и того же данных, CcUnpinData необходимо вызывать одинаковое количество раз.
Указатель, возвращенный в буфере
CcPreparePinWrite не может закреплять данные через границы представления в диспетчере кэша. Диспетчер кэша управляет файлами в системе в 256 КБ в выровненных представлениях. (Размер представления диспетчера кэша определяется системной константой VACB_MAPPING_GRANULARITY, которая имеет значение 256 КБ в ntifs.h.) Закрепленные регионы не могут охватывать более одного представления 256 КБ. Таким образом, самый большой регион, который можно закрепить, составляет 256 КБ, начиная с смещения с выравниванием 256 КБ в файле.
Закрепление диапазона байтов в кэшированном файле не гарантирует, что страницы остаются в памяти. Если страницы закреплены, диапазон байтов гарантированно сопоставляется с виртуальным адресным пространством кэша системы, но диспетчер памяти может вывести физические страницы в соответствии с требованиями к памяти системы.
Не обязательно вызывать CcSetDirtyPinnedData после вызова CcPreparePinWrite. Если CcPreparePinWrite возвращает TRUE, BCB уже помечен как грязный.
Если возникает сбой, CcPreparePinWrite вызывает исключение состояния для конкретного сбоя. Например, если происходит сбой выделения пула, CcPreparePinWrite вызывает исключение STATUS_INSUFFICIENT_RESOURCES; Если возникает ошибка ввода-вывода, CcPreparePinWrite вызывает исключение состояния ошибки ввода-вывода. Таким образом, чтобы получить контроль при возникновении сбоя, драйвер должен упаковать вызов CcPreparePinWrite в , кроме или инструкции try-finally.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Всеобщий |
| заголовка | ntifs.h (include Ntifs.h) |
| библиотеки |
NtosKrnl.lib |
| DLL | NtosKrnl.exe |
| IRQL | PASSIVE_LEVEL |