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
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.
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).
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.