IRP_MJ_READ (controladores de filtro y sistema de archivos)

Cuándo se envía

El Administrador de E/S o un controlador del sistema de archivos envía la solicitud 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 a 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 para controladores de Windows (WDK).

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

El controlador de filtro debe realizar cualquier procesamiento necesario y, en función de la naturaleza del filtro, debe realizar una de las siguientes acciones:

  • Completar o generar un error en IRP, o bien
  • Pasar el IRP al controlador siguiente inferior de la pila.

Parámetros

Un sistema de archivos o un controlador de filtro llama a IoGetCurrentIrpStackLocation para que el IRP especificado obtenga un puntero a su propia ubicación de pila en el IRP. En los parámetros siguientes, Irp apunta a IRP e IrpSp apunta a IO_STACK_LOCATION. El controlador puede usar la información establecida en los siguientes miembros del IRP y la ubicación de la pila de 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 DO_BUFFERED_IO está establecida en DeviceObject->Flags. De lo contrario, este miembro se establece en NULL.

  • Irp->IoStatus apunta a una estructura 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 llamador que recibe los datos leídos del archivo.

  • IrpSp->FileObject apunta al objeto de archivo asociado a DeviceObject. Si la marca FO_SYNCHRONOUS_IO está establecida en IrpSp->FileObject->Flags, significa que 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 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. Si no se especifica un código de función secundaria, la operación es una lectura estándar (equivalente a IRP_MN_NORMAL).

    MinorFunction Descripción
    IRP_MN_NORMAL La solicitud de lectura es para una operación de lectura estándar.
    IRP_MN_DPC La solicitud de lectura procede de una rutina DPC.
    IRP_MN_MDL Devuelve una MDL que describe los datos almacenados en caché del archivo en Irp->MdlAddress; el llamador usa esta MDL para leer datos directamente en la memoria caché.
    IRP_MN_COMPLETE Indica la finalización de una operación de lectura estándar.
    IRP_MN_COMPRESSED La solicitud de lectura es para un archivo comprimido
    IRP_MN_MDL_DPC La solicitud de lectura procede de una rutina DPC y devuelve una MDL que describe los datos almacenados en caché del archivo en Irp->MdlAddress
    IRP_MN_COMPLETE_MDL Indica que el llamador, que usó la MDL para leer datos directamente en la memoria caché, ha terminado de usar la MDL.
    IRP_MN_COMPLETE_MDL_DPC Indica que el llamador, que usó la MDL para leer datos directamente en la memoria caché, ha terminado de usar la MDL; la solicitud de lectura procede de una rutina DPC.
  • IrpSp->Parameters.Read.ByteOffset es una variable LARGE_INTEGER que especifica el desplazamiento de bytes inicial dentro del archivo de los datos que se van a leer.

  • IrpSp->Parameters.Read.Key es 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 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 prelectura o preescritura, esos filtros que asignan e 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 Muestra de minifilro 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