IRP_MJ_READ (controladores de filtro y FS)

Cuándo se envió

El Administrador de E/S o un controlador del sistema de archivos envía la solicitud de IRP_MJ_READ. Esta solicitud se puede enviar, por ejemplo, cuando una aplicación en modo de usuario ha llamado a una función Win32, como ReadFile, o cuando un componente en modo kernel ha llamado ZwReadFile.

Operación: controladores del sistema de archivos

El controlador del sistema de archivos debe extraer y descodificar el objeto de archivo para determinar los parámetros y el código de función secundaria.

Para las solicitudes de lectura de lista de descriptores de memoria (MDL), el sistema de archivos debe comprobar el código de función secundaria para determinar qué operación se solicita. A continuación se muestran los códigos de función secundaria válidos, que solo se pueden usar para E/S de archivos almacenados en caché:

  • IRP_MN_COMPLETE
  • IRP_MN_COMPLETE_MDL
  • IRP_MN_COMPLETE_MDL_DPC
  • IRP_MN_COMPRESSED
  • IRP_MN_DPC
  • IRP_MN_MDL
  • IRP_MN_MDL_DPC
  • IRP_MN_NORMAL

Para obtener más información sobre cómo controlar este IRP, estudie los ejemplos de CDFS y FASTFAT que se incluyen en el Kit de controladores de Windows (WDK).

Operación: controladores de filtro del sistema de archivos heredados

El controlador de filtro debe realizar cualquier procesamiento necesario y, dependiendo de la naturaleza del filtro, debe realizar una de las siguientes acciones:

  • Complete o produzca un error en el IRP, o bien
  • Pase el IRP hacia abajo hasta el controlador siguiente inferior de la pila.

Parámetros

Un controlador de filtro o sistema de archivos llama a IoGetCurrentIrpStackLocation para que el IRP determinado obtenga un puntero a su propia ubicación de pila en el IRP. En los parámetros siguientes, Irp apunta al IRP e IrpSp apunta al IO_STACK_LOCATION. El controlador puede usar la información establecida en los siguientes miembros del IRP y la ubicación de la pila irP para procesar una solicitud de lectura:

  • DeviceObject es un puntero al objeto de dispositivo de destino.

  • Irp->AssociatedIrp.SystemBuffer apunta a un búfer proporcionado por el sistema que se usará como búfer intermedio del sistema, si la marca de DO_BUFFERED_IO está establecida en DeviceObject-Flags>. De lo contrario, este miembro se establece en NULL.

  • Irp->IoStatus apunta a una estructura de IO_STATUS_BLOCK que recibe el estado de finalización final e información sobre la operación solicitada. Para obtener más información, consulte la descripción del parámetro IoStatusBlock en ZwReadFile.

  • Irp->MdlAddress es la dirección de una lista de descriptores de memoria (MDL) que describe las páginas que contienen los datos que se van a leer.

  • *Irp->UserBuffer apunta a un búfer de salida proporcionado por el autor de la llamada que recibe los datos leídos del archivo.

  • IrpSp->FileObject apunta al objeto de archivo asociado a DeviceObject. Si la marca de FO_SYNCHRONOUS_IO se establece en IrpSp-FileObject-Flags>>, el objeto de archivo se abrió para E/S sincrónica.

    El parámetro IrpSp-FileObject> contiene un puntero al campo RelatedFileObject, que también es una estructura de FILE_OBJECT. El campo RelatedFileObject de la estructura FILE_OBJECT no es válido durante el procesamiento de IRP_MJ_READ y no se debe usar.

  • IrpSp->MajorFunction se establece en IRP_MJ_READ.

  • IrpSp->MinorFunction especifica la operación que se solicita y contiene uno de los valores siguientes:

  • IRP_MN_COMPLETE

  • IRP_MN_COMPLETE_MDL

  • IRP_MN_COMPLETE_MDL_DPC

  • IRP_MN_COMPRESSED

  • IRP_MN_DPC

  • IRP_MN_MDL

  • IRP_MN_MDL_DPC

  • IRP_MN_NORMAL

  • IrpSp->Parameters.Read.ByteOffset es una variable de LARGE_INTEGER que especifica el desplazamiento de bytes inicial dentro del archivo de los datos que se van a leer.

  • IrpSp->Parameters.Read.Keyes el valor de clave asociado a un bloqueo de intervalo de bytes en el archivo de destino.

  • IrpSp->Parameters.Read.Length es la longitud en bytes de los datos que se van a leer. Si la operación de lectura se realiza correctamente, el número de bytes leídos se devuelve en el miembro Information de la estructura de IO_STATUS_BLOCK a la que apunta Irp-IoStatus>.

Comentarios

Los sistemas de archivos redondeen las operaciones de escritura y lectura al final del archivo hasta un múltiplo del tamaño del sector del dispositivo de almacenamiento de archivos subyacente. Cuando los filtros procesan operaciones de lectura previa o preescritura, esos filtros que asignan y intercambian búferes deben redondear el tamaño de un búfer asignado a un múltiplo del tamaño del sector del dispositivo asociado. Si no lo hacen, la longitud de los datos transferidos desde el sistema de archivos subyacente superará la longitud asignada del búfer. Para obtener más información sobre el intercambio de búferes, consulte swapBuffers Minifilter Sample( Ejemplo de minifiltro de swapBuffers).

Consulte también

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (referencia del kernel de WDK)

IRP_MJ_WRITE

ZwReadFile