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 de IRP_MJ_READ. Essa solicitação pode ser enviada, por exemplo, quando um aplicativo de modo de usuário tiver chamado uma função Win32, como ReadFile, ou quando um componente do modo kernel tiver chamado ZwReadFile.

Operação: Drivers do sistema de arquivos

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

Para solicitações de leitura da MDL (lista de descritores de memória), o sistema de arquivos deve marcar o código de função secundária para determinar qual operação é solicitada. Estes são os códigos de função secundária válidos, que podem ser usados apenas 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, estude os exemplos de CDFS e FASTFAT incluídos no WDK (Kit de Driver do Windows).

Operação: Drivers de filtro do sistema de arquivos herdado

O driver de filtro deve executar qualquer processamento necessário e, dependendo da natureza do filtro, deve executar uma das seguintes ações:

  • Concluir ou falhar o IRP ou
  • Passe o IRP para baixo para o próximo driver inferior na pilha.

Parâmetros

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

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

  • Irp->AssociatedIrp.SystemBuffer aponta para um buffer fornecido pelo sistema a 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 a status de conclusão final e 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 MDL (lista de descritores de memória) que descreve as páginas que contêm os dados a serem lidos.

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

  • IrpSp->FileObject aponta para o objeto de arquivo associado a DeviceObject. Se o sinalizador FO_SYNCHRONOUS_IO estiver definido em IrpSp-FileObject-Flags>>, o objeto de arquivo foi 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 usado.

  • IrpSp->MajorFunction é definido como IRP_MJ_READ.

  • IrpSp->MinorFunction especifica a operação que está sendo solicitada e contém um dos seguintes valores:

  • 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 é uma variável LARGE_INTEGER que especifica o deslocamento de bytes inicial dentro do arquivo dos dados a serem 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 a serem lidos. Se a operação de leitura for bem-sucedida, o número de bytes lidos será retornado no membro Informações da estrutura IO_STATUS_BLOCK apontada por Irp-IoStatus>.

Comentários

Sistemas de arquivos arredondam operações de gravação e leitura no final do arquivo até um múltiplo do tamanho do setor do dispositivo de armazenamento de arquivos subjacente. Quando os filtros processam operações de pré-leitura ou 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 o fizerem, o comprimento dos dados transferidos do sistema de arquivos subjacente excederá o comprimento alocado do buffer. Para obter mais informações sobre como trocar buffers, consulte SwapBuffers Minifilter Sample.

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