Función FsRtlCopyWrite (ntifs.h)
El FsRtlCopyWrite rutina copia datos de un búfer de usuario en un archivo almacenado en caché.
Sintaxis
BOOLEAN FsRtlCopyWrite(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[in] BOOLEAN Wait,
[in] ULONG LockKey,
[in] 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é al que se van a escribir los datos.
[in] FileOffset
Puntero a una variable que especifica el desplazamiento de bytes inicial dentro del archivo almacenado en caché.
[in] Length
Longitud en bytes de los datos que se van a escribir.
[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.
[in] Buffer
Puntero al búfer desde 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
Puntero al objeto de dispositivo para el volumen montado que contiene los datos del archivo.
Valor devuelto
FsRtlCopyWrite 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 FsRtlCopyWrite 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 escritura en lugar de llamar a FsRtlCopyWrite.
Observaciones
En lugar de implementar una rutina de escritura 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 FsRtlCopyWrite como punto de entrada del sistema de archivos para procesar solicitudes de escritura rápidas de E/S. Esto requiere que la rutina de DriverEntry del sistema de archivos establezca el punto de entrada FastIoWrite en FsRtlCopyWrite 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 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 miembro
IsFastIoPossible 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 wait es TRUE, se garantiza FsRtlCopyWrite para copiar los datos 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, FsRtlCopyWrite 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 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 el FsRtlXxxLockYyyy las rutinas de soporte técnico para administrar bloqueos de intervalo de bytes, esto se puede lograr llamando a FsRtlFastCheckLockForWrite desde la rutina de 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 | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm) |