Función FsRtlCopyRead (ntifs.h)
La rutina FsRtlCopyRead copia los 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
Se establece en TRUE si el autor de la llamada puede colocarse en un estado de espera hasta que se copien todos los datos; de lo contrario, false.
[in] LockKey
Valor asociado al intervalo de bytes que se va a bloquear. Si el intervalo para 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 intervalo que ya está bloqueado de forma noclusiva, el valor de este parámetro debe ser la clave para ese bloqueo noclusivo El bloqueo debe mantenerse en el proceso primario del subproceso que realiza la 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 la solicitud de copia se completó, 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 indica 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.
Comentarios
En lugar de implementar una rutina de lectura rápida de E/S 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 de E/S rápidas. Esto requiere que la rutina DriverEntry 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:
Para cada archivo en el que se pueda realizar 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 de FSRTL_COMMON_FCB_HEADER normalmente se asigna desde el grupo paginado.
Para cada archivo en el que se pueda realizar E/S rápida, el sistema de archivos debe vincular los objetos de archivo del archivo a la estructura de FSRTL_COMMON_FCB_HEADER. Esto se hace estableciendo el miembro FsContext de cada objeto de archivo para que apunte a esta estructura (o 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 miembro IsFastIoPossible de la estructura FSRTL_COMMON_FCB_HEADER del archivo en un valor adecuado. Este valor debe actualizarse según sea necesario siempre que el archivo permanezca almacenado en caché.
En concreto, los sistemas de archivos deben establecer el miembro IsFastIoPossible de la estructura de FSRTL_COMMON_FCB_HEADER en FastIoIsQuestionable en cuanto exista un bloqueo de intervalo de bytes exclusivo en el archivo almacenado en caché.
Si Wait es TRUE, se garantiza que FsRtlCopyRead complete la solicitud de copia y devuelva 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 son residentes, el autor de la llamada se colocará en un estado de espera hasta que todas las páginas necesarias se hayan hecho residentes y se puedan copiar los datos.
Si Wait es FALSE, FsRtlCopyRead se negará a 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 FastIoCheckIfPossible 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 soporte técnico FsRtlXxxLockYyy para administrar bloqueos de intervalo de bytes, esto se puede lograr llamando a FsRtlFastCheckLockForRead desde la rutina FastIoCheckIfPossible antes de llamar a FsRtlCopyRead.
Para almacenar en caché un archivo, use la rutina CcInitializeCacheMap .
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Encabezado | ntifs.h (incluya Ntifs.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Reglas de cumplimiento de DDI | PowerIrpDDis(wdm) |