Compartir a través de


Función FsRtlCopyRead (ntifs.h)

El FsRtlCopyRead rutina copia datos de un archivo almacenado en caché en un búfer de usuario.

Sintaxis

BOOLEAN FsRtlCopyRead(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  BOOLEAN          Wait,
  [in]  ULONG            LockKey,
  [out] PVOID            Buffer,
  [out] PIO_STATUS_BLOCK IoStatus,
  [in]  PDEVICE_OBJECT   DeviceObject
);

Parámetros

[in] FileObject

Puntero a un objeto de archivo para el archivo almacenado en caché desde el que se van a leer los datos.

[in] FileOffset

Desplazamiento de bytes inicial dentro del archivo almacenado en caché.

[in] Length

Longitud en bytes de los datos que se van a leer.

[in] Wait

Establézcalo en TRUE si el autor de la llamada se puede colocar en un estado de espera hasta que se hayan copiado todos los datos, FALSE de lo contrario.

[in] LockKey

Valor asociado al intervalo de bytes que se va a bloquear. Si el intervalo que se va a bloquear se superpone a otro intervalo que ya está bloqueado con un bloqueo noclusivo, o si el intervalo que se va a leer es un subrango de otro rango que ya está bloqueado de forma noclusiva, el valor de este parámetro debe ser la clave para ese bloqueo noclusivo El bloqueo debe ser mantenido por el proceso primario del subproceso de llamada. De lo contrario, este parámetro no tiene ningún efecto.

[out] Buffer

Puntero a un búfer en el que se van a copiar los datos.

[out] IoStatus

Puntero a una estructura asignada por el autor de la llamada que recibe el estado de finalización final e información sobre la operación. Si los datos se copian correctamente, ioStatus.Status contiene STATUS_SUCCESS. Si no todos los datos se copian correctamente, ioStatus.Information contiene el número real de bytes que se copiaron.

[in] DeviceObject

Objeto de dispositivo para el dispositivo que contiene los datos del archivo.

Valor devuelto

FsRtlCopyRead devuelve TRUE si se completó la solicitud de copia, FALSE en caso contrario. Tenga en cuenta que un valor devuelto de TRUE no significa necesariamente que la operación de copia se haya realizado correctamente.

Si FsRtlCopyRead devuelve FALSE, o si el contenido de IoStatus indicar que se produjo un error en la operación de copia, el autor de la llamada debe asignar un IRP de lectura en lugar de llamar a FsRtlCopyRead.

Observaciones

En lugar de implementar una rutina de lectura rápida específica del sistema de archivos, los desarrolladores de sistemas de archivos que admiten el almacenamiento en caché de archivos deben considerar el uso de FsRtlCopyRead como punto de entrada del sistema de archivos para procesar solicitudes de lectura rápidas de E/S. Esto requiere que el DriverEntry rutina del sistema de archivos establezca el punto de entrada FastIoRead en FsRtlCopyRead en la estructura FAST_IO_DISPATCH del objeto de controlador del sistema de archivos. Además, el sistema de archivos debe hacer lo siguiente:

  1. Para cada archivo en el que se pueda realizar una E/S rápida, el sistema de archivos debe asignar e inicializar una estructura de FSRTL_COMMON_FCB_HEADER.

    En la mayoría de los sistemas de archivos, esto se logra mediante la inclusión de la estructura FSRTL_COMMON_FCB_HEADER en un bloque de control de archivos (FCB) o una estructura comparable que se usa para mantener el estado de un archivo abierto.

    El almacenamiento de la estructura FSRTL_COMMON_FCB_HEADER se asigna normalmente desde el grupo paginado.

  2. Para cada archivo en el que se pueda realizar una E/S rápida, el sistema de archivos debe vincular cualquier objeto de archivo para el archivo a la estructura de FSRTL_COMMON_FCB_HEADER. Para ello, establezca el miembro FsCon text de cada objeto de archivo para que apunte a esta estructura (o a la FCB u otra estructura que contenga la estructura FSRTL_COMMON_FCB_HEADER).

  3. Al almacenar en caché un archivo, el sistema de archivos debe establecer el IsFastIoPossible miembro de la estructura FSRTL_COMMON_FCB_HEADER del archivo en un valor adecuado. Este valor debe actualizarse según sea necesario mientras el archivo permanezca almacenado en caché.

    En concreto, los sistemas de archivos deben establecer el isFastIoPossible miembro de la estructura FSRTL_COMMON_FCB_HEADER en FastIoIsQuestionable tan pronto como exista un bloqueo de intervalo de bytes exclusivo en el archivo almacenado en caché.

Si de espera es TRUE, se garantiza FsRtlCopyRead para completar la solicitud de copia y devolver TRUE. Si las páginas necesarias del archivo almacenado en caché ya residen en la memoria, los datos se copiarán inmediatamente y no se producirá ningún bloqueo. Si las páginas necesarias no están residentes, el autor de la llamada se pondrá en un estado de espera hasta que se hayan hecho residentes todas las páginas necesarias y se puedan copiar los datos.

Si wait es FALSE, FsRtlCopyRead rechazará bloquear y devolverá FALSE, si no puede adquirir el recurso principal del archivo o si las páginas necesarias del archivo almacenado en caché aún no residen en la memoria.

La rutina FastIoCheckIfPoss ible del sistema de archivos es responsable de garantizar que el intervalo de bytes definido por FileOffset y Length no incluya ningún intervalo de bytes bloqueado exclusivamente para el que el autor de la llamada no pase el valor LockKey adecuado. Si el sistema de archivos usa las rutinas de FsRtlXxxLockYyyy admiten rutinas para administrar bloqueos de intervalo de bytes, se puede realizar mediante una llamada a FsRtlFastCheckLockForRead desde la rutina FastIoCheckIfPossible antes de llamar a FsRtlCopyRead.

Para almacenar en caché un archivo, use la rutina 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 PASSIVE_LEVEL
reglas de cumplimiento de DDI PowerIrpDDis(wdm)

Consulte también

ccInitializeCacheMap

FsRtlCopyWrite

FsRtlFastCheckLockForRead