Compartir a través de


Función CcPinRead (ntifs.h)

El CcPinRead rutina ancla el intervalo de bytes especificado de un archivo almacenado en caché y lee los datos anclados en un búfer en memoria.

Sintaxis

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

Parámetros

[in] FileObject

Puntero a un objeto de archivo para el archivo almacenado en caché en el que se va a anclar un intervalo de datos.

[in] FileOffset

Puntero a una variable que especifica el desplazamiento de bytes inicial dentro del archivo almacenado en caché donde residen los datos deseados.

[in] Length

Longitud de los datos deseados en bytes.

[in] Flags

Máscara de bits de marcas que especifican cómo se va a realizar la operación de anclaje. Combinación de ORed de uno o varios de los siguientes valores:

Valor Significado
PIN_WAIT El autor de la llamada puede colocarse en un estado de espera hasta que se hayan anclado los datos.
PIN_EXCLUSIVE El bloque de control de búfer (BCB) se va a adquirir exclusivamente. Si se establece esta marca, también se debe establecer PIN_WAIT.
PIN_NO_READ Solo se van a anclar las páginas que ya están residentes en la memoria. Si se establece esta marca, también se debe establecer PIN_WAIT.
PIN_IF_BCB Los datos solo se van a anclar si ya existe un BCB. De lo contrario, se produce un error en el pin y bcb se establece en NULL.

[out] Bcb

En la primera llamada, devuelve un puntero a un bloque de control de búfer (BCB). Este puntero se debe proporcionar como entrada en todas las llamadas posteriores para este búfer.

[out] Buffer

Puntero a un búfer que contiene los datos anclados.

Valor devuelto

CcPinRead devuelve TRUE si los datos del archivo almacenado en caché se anclaron y leen correctamente, FALSE de lo contrario.

Observaciones

Si se establece la marca PIN_WAIT, se garantiza ccPinRead para completar la solicitud de anclaje y devolver TRUE. Si las páginas necesarias del archivo almacenado en caché ya residen en la memoria, los datos se anclan inmediatamente y no se produce ningún bloqueo. Si las páginas necesarias no están residentes, el autor de la llamada se coloca en un estado de espera hasta que se hayan realizado residentes todas las páginas necesarias y se puedan anclar los datos. Si no se establece la marca PIN_WAIT, pero los datos no se pueden anclar inmediatamente, ccPinRead devuelve FALSEy sus valores de parámetro de salida no tienen sentido.

Si el autor de la llamada modifica posteriormente los datos leídos por CcPinRead, también debe llamar a CcSetDirtyPinnedData para que los datos modificados se escriban en el disco.

Cada llamada correcta a ccPinRead debe coincidir con una llamada posterior a CcUnpinData.

El puntero devuelto en buffer es válido hasta que se llama a ccUnpinData. Si se llama a ccPinMappedData mientras este puntero sigue siendo válido, el puntero sigue siendo válido después de la llamada a ccPinMappedData (pero solo hasta que se llama a ccUnpinData).

ccPinRead no pueden anclar datos a través de los límites de vista en el administrador de caché. El administrador de caché administra los archivos del sistema en vistas alineadas con 256 KB. (El tamaño de vista del administrador de caché se especifica mediante la constante definida por el sistema VACB_MAPPING_GRANULARITY, que se establece en 256 KB en ntifs.h). Las regiones ancladas no pueden abarcar más de una vista de 256 KB. Por lo tanto, la región más grande que se puede anclar es de 256 KB, comenzando en un desplazamiento alineado con 256 KB en el archivo.

Anclar un intervalo de bytes en un archivo almacenado en caché no garantiza que las páginas permanezcan residentes en la memoria. Siempre que las páginas estén ancladas, se garantiza que el intervalo de bytes se mantenga asignado al espacio de direcciones virtuales de caché del sistema, pero el administrador de memoria puede paginar las páginas físicas, ya que la demanda de memoria del sistema requiere.

Si se produce algún error, ccPinRead genera una excepción de estado para ese error en particular. Por ejemplo, si se produce un error de asignación de grupo, ccPinRead genera una excepción de STATUS_INSUFFICIENT_RESOURCES; Si se produce un error de E/S, ccPinRead genera la excepción de estado del error de E/S. Por lo tanto, para obtener control si se produce un error, el controlador debe encapsular la llamada a ccPinRead en un try-except o instrucción try-finally.

Para asignar datos para un archivo almacenado en caché, use la rutina CcMapData. Para almacenar en caché un archivo, use CcInitializeCacheMap.

Requisitos

Requisito Valor
de la plataforma de destino de Universal
encabezado de ntifs.h (incluya Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL < DISPATCH_LEVEL

Consulte también

CcInitializeCacheMap

ccMapData de

ccPinMappedData

CcPreparePinWrite

CcSetDirtyPinnedData

CcUnpinData