IRP_MJ_READ (FS e drivers de filtro)

Quando é enviado

O gerenciador de E/S ou um driver do sistema de arquivos envia a solicitação IRP_MJ_READ. Essa solicitação pode ser enviada, por exemplo, depois que um aplicativo do modo de usuário chama uma função Win32, como ReadFile, ou depois que um componente do modo kernel chama ZwReadFile.

Operação: drivers do sistema de arquivos

O driver do sistema de arquivos deve extrair e decodificar o objeto do arquivo para determinar os parâmetros e o código de função secundária.

Para solicitações de leitura da lista de descritores de memória (MDL), o sistema de arquivos deve verificar o código de função secundária a fim de determinar qual operação está sendo solicitada. Veja a seguir os códigos de função secundária válidos, que só podem ser utilizados para E/S de arquivo armazenado em cache:

  • 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 obter mais informações sobre como lidar com esse IRP, analise os exemplos de CDFS e FASTFAT incluídos no Kit de Driver do Windows (WDK).

Operação: drivers de filtro do sistema de arquivos herdados

O driver de filtro deve executar todo processamento necessário e, dependendo da natureza do filtro, também deve executar uma destas ações:

  • concluir ou reprovar o IRP;
  • enviar o IRP para o próximo driver de nível inferior na pilha.

Parâmetros

Um sistema de arquivos ou driver de filtro chama IoGetCurrentIrpStackLocation para o IRP fornecido a fim de obter um ponteiro para seu próprio local de pilha no IRP. Nos parâmetros a seguir, Irp aponta para IRP e IrpSp aponta para IO_STACK_LOCATION. O driver pode utilizar as informações que estão definidas nos membros do IRP a seguir e o local da pilha do IRP para processar uma solicitação de leitura:

  • DeviceObject é um ponteiro para o objeto do dispositivo de destino.

  • Irp->AssociatedIrp.SystemBuffer aponta para um buffer fornecido pelo sistema que será usado como um buffer de sistema intermediário, se o sinalizador DO_BUFFERED_IO estiver definido em DeviceObject->Flags. Caso contrário, esse membro será definido como NULL.

  • Irp->IoStatus aponta para uma estrutura IO_STATUS_BLOCK que recebe o status de conclusão final e as informações sobre a operação solicitada. Para obter mais informações, consulte a descrição do parâmetro IoStatusBlock para ZwReadFile.

  • Irp->MdlAddress é o endereço de uma lista de descritores de memória (MDL) que descreve as páginas que contêm os dados que serão lidos.

  • Irp->UserBuffer aponta para um buffer de saída fornecido pelo autor da chamada que recebe os dados lidos do arquivo.

  • IrpSp->FileObject aponta para o objeto do arquivo associado a DeviceObject. Se o sinalizador FO_SYNCHRONOUS_IO estiver definido em IrpSp->FileObject->Flags, o objeto do arquivo terá sido aberto para E/S síncrona.

    O parâmetro IrpSp->FileObject contém um ponteiro para o campo RelatedFileObject, que também é uma estrutura FILE_OBJECT. O campo RelatedFileObject da estrutura FILE_OBJECT não é válido durante o processamento de IRP_MJ_READ e não deve ser utilizado.

  • IrpSp->MajorFunction é definido como IRP_MJ_READ.

  • IrpSp->MinorFunction especifica a operação que está sendo solicitada e também contém um dos valores a seguir. Se não for especificado nenhum código de função secundária, a operação será uma leitura padrão (equivalente a IRP_MN_NORMAL).

    MinorFunction Descrição
    IRP_MN_NORMAL A solicitação de leitura é destinada a uma operação de leitura padrão.
    IRP_MN_DPC A solicitação de leitura é proveniente de uma rotina de DPC.
    IRP_MN_MDL Retorna uma MDL que descreve os dados do arquivo armazenados em cache em Irp->MdlAddress. O autor da chamada usa essa MDL para ler dados diretamente do cache.
    IRP_MN_COMPLETE Indica a conclusão de uma operação de leitura padrão.
    IRP_MN_COMPRESSED A solicitação de leitura é destinada a um arquivo compactado.
    IRP_MN_MDL_DPC A solicitação de leitura é proveniente de uma rotina de DPC e retorna uma MDL que descreve os dados do arquivo armazenados em cache em Irp->MdlAddress.
    IRP_MN_COMPLETE_MDL Indica que o autor da chamada, que utilizou a MDL para ler dados diretamente do cache, terminou de usar a MDL.
    IRP_MN_COMPLETE_MDL_DPC Indica que o autor da chamada, que utilizou a MDL para ler dados diretamente do cache, terminou de usar a MDL. A solicitação de leitura é proveniente de uma rotina de DPC.
  • IrpSp->Parameters.Read.ByteOffset é uma variável LARGE_INTEGER que define o deslocamento do byte inicial no arquivo dos dados que serão lidos.

  • IrpSp->Parameters.Read.Key é o valor de chave associado a um bloqueio de intervalo de bytes no arquivo de destino.

  • IrpSp->Parameters.Read.Length é o comprimento em bytes dos dados que serão lidos. Se a operação de leitura for bem-sucedida, será retornada a quantidade de bytes lidos no membro Information da estrutura IO_STATUS_BLOCK apontada por Irp->IoStatus.

Comentários

Os sistemas de arquivos arredondam as operações de gravação e leitura no final do arquivo para um múltiplo do tamanho do setor do dispositivo de armazenamento de arquivos subjacente. Quando os filtros processam operações de pré-leitura ou de pré-gravação, esses filtros que alocam e trocam buffers precisam arredondar o tamanho de um buffer alocado para um múltiplo do tamanho do setor do dispositivo associado. Se não fizerem isso, o comprimento dos dados transferidos do sistema de arquivos subjacente vai exceder o comprimento alocado do buffer. Para obter mais informações sobre como trocar buffers, confira um exemplo do minifiltro swapBuffers.

Confira também

CcMdlRead

CcMdlReadComplete

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_READ (referência de kernel do WDK)

IRP_MJ_WRITE

ZwReadFile