IRP_MJ_QUERY_INFORMATION (FS e drivers de filtro)

Quando enviado

O Gerenciador de E/S, outros componentes do sistema operacional e outros drivers de modo kernel enviam IRP_MJ_QUERY_INFORMATION solicitações. Essa solicitação pode ser enviada, por exemplo, quando um aplicativo de modo de usuário tiver chamado uma função Win32, como GetFileInformationByHandle ou quando um componente do modo kernel tiver chamado ZwQueryInformationFile.

Operação: Drivers do sistema de arquivos

O driver do sistema de arquivos deve extrair e decodificar o objeto de arquivo para determinar se ele representa um usuário aberto de um arquivo ou diretório. Se isso acontecer, o driver deverá processar a consulta e concluir o IRP. Caso contrário, o driver deverá concluir o IRP conforme apropriado sem processar a consulta.

Os tipos de informações de arquivo e diretório que podem ser consultadas dependem do sistema de arquivos, mas geralmente incluem os seguintes valores:

  • FileAllInformation
  • FileAlternateNameInformation
  • FileAttributeTagInformation
  • FileBasicInformation
  • FileCompressionInformation
  • FileEaInformation
  • FileInternalInformation
  • FileNameInformation
  • FileNetworkOpenInformation
  • FilePositionInformation
  • FileStandardInformation
  • FileStreamInformation
  • FileHardLinkInformation

Embora os tipos de informações FileAccessInformation, FileAlignmentInformation e FileModeInformation também possam ser passados como um parâmetro para ZwQueryInformationFile, essas informações são independentes do sistema de arquivos. Portanto, ZwQueryInformationFile fornece essas informações diretamente, sem enviar uma solicitação de IRP_MJ_QUERY_INFORMATION para o sistema de arquivos.

Para obter uma lista de todos os tipos de informações possíveis, consulte a enumeração FILE_INFORMATION_CLASS em ntifs.h.

Operação: Drivers de Redirecionador de Rede

Um driver de redirecionador de rede não baseado em RDBSS que recebe uma solicitação IRP_MJ_QUERY_INFORMATION para FileAllInformation ou FileNameInformation deve responder com o caminho completo "\server\share\file" para o nome do arquivo com uma única barra invertida à esquerda antes do nome do servidor. Esse formato para informações de nome deve ser retornado para um arquivo acessado como um nome UNC (Convenção Universal de Nomenclatura) (\\server\share\folder\filename.txt, por exemplo) ou um arquivo localizado em uma unidade mapeada (x:\folder\filename.txt, por exemplo).

Para um driver de minidiretório de rede (um driver que se vincula dinamicamente a rdbss.sys ou que vincula estaticamente com rdbsslib.lib), o RDBSS manipula uma solicitação de IRP_MJ_QUERY_INFORMATION para FileNameInformation e retorna as informações de nome corretas. Para um driver de minidiretório de rede, o RDBSS manipula uma solicitação de IRP_MJ_QUERY_INFORMATION para FileAllInformation para a parte de informações de nome da solicitação. As outras partes da solicitação FileAllInformation são enviadas como solicitações separadas para o driver de minidiretório de rede para resolve.

Um redirecionador de rede que recebe uma solicitação IRP_MJ_QUERY_INFORMATION para FileAlternateNameInformation deve responder com o nome curto (8,3 caracteres) para o arquivo sem nenhuma informação de caminho, se houver um nome curto para o arquivo.

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

O driver de filtro deve passar esse IRP para o driver mais baixo 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 informações do arquivo de consulta:

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

  • Irp->AssociatedIrp.SystemBuffer aponta para o buffer de saída em que as informações de arquivo ou diretório devem ser retornadas. Essas informações são armazenadas em uma das seguintes estruturas:

  • FILE_ALL_INFORMATION

  • FILE_ATTRIBUTE_TAG_INFORMATION

  • FILE_BASIC_INFORMATION

  • FILE_COMPRESSION_INFORMATION

  • FILE_EA_INFORMATION

  • FILE_INTERNAL_INFORMATION

  • FILE_NAME_INFORMATION

  • FILE_NETWORK_OPEN_INFORMATION

  • FILE_POSITION_INFORMATION

  • FILE_STANDARD_INFORMATION

  • FILE_STREAM_INFORMATION

  • FILE_LINKS_INFORMATION

  • 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 no ZwQueryInformationFile. Rotina.

  • Irp->UserBuffer é um ponteiro opcional para um buffer de saída fornecido pelo chamador no qual o conteúdo de Irp-AssociatedIrp.SystemBuffer> é copiado durante a conclusão de E/S pelo gerente de E/S. Os drivers não usam esse buffer para retornar dados para a solicitação.

  • IrpSp->FileObject aponta para o objeto de arquivo associado a DeviceObject.

    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_QUERY_INFORMATION e não deve ser usado.

  • IrpSp->MajorFunction está definido como IRP_MJ_QUERY_INFORMATION.

  • IrpSp->Parameters.QueryFile.FileInformationClass é o tipo de informação de arquivo a ser consultada. Esse membro pode ser um dos valores a seguir.

    Valor Significado
    FileAllInformation Retornar uma estrutura de FILE_ALL_INFORMATION para o arquivo.
    FileAttributeTagInformation Retornar uma estrutura de FILE_ATTRIBUTE_TAG_INFORMATION para o arquivo.
    FileBasicInformation Retornar uma estrutura de FILE_BASIC_INFORMATION para o arquivo.
    FileCompressionInformation Retornar uma estrutura de FILE_COMPRESSION_INFORMATION para o arquivo.
    FileEaInformation Retornar uma estrutura de FILE_EA_INFORMATION para o arquivo.
    FileInternalInformation Retornar uma estrutura de FILE_INTERNAL_INFORMATION para o arquivo.
    FileNameInformation Retornar uma estrutura de FILE_NAME_INFORMATION para o arquivo.
    FileNetworkOpenInformation Retornar uma única estrutura FILE_NETWORK_OPEN_INFORMATION para o arquivo.
    FilePositionInformation Retornar uma única estrutura de FILE_POSITION_INFORMATION para o arquivo.
    FileStandardInformation Retornar uma única estrutura de FILE_STANDARD_INFORMATION para o arquivo.
    FileStreamInformation Retornar uma única estrutura de FILE_STREAM_INFORMATION para o arquivo.
    FileHardLinkInformation Retornar uma estrutura de FILE_LINKS_INFORMATION para o arquivo.
  • IrpSp->Parameters.QueryFile.Length é o comprimento, em bytes, do buffer apontado por Irp-AssociatedIrp.SystemBuffer>.

Comentários

O gerenciador de E/S sempre armazena em buffer a operação de IRP_MJ_QUERY_INFORMATION. O Gerenciador de E/S aloca da memória do pool não paginado o Irp-AssociatedIrp.SystemBuffer> que é usado para retornar as informações de arquivo ou diretório solicitadas. Como resultado, o Irp-AssociatedIrp.SystemBuffer> retornado pelo sistema operacional sempre é um endereço válido para o comprimento especificado em IrpSp-Parameters.QueryFile.Length>.

O Irp-AssociatedIrp.UserBuffer> é usado internamente pelo gerenciador de E/S e não deve ser usado por drivers de filtro do sistema de arquivos ou do sistema de arquivos.

Confira também

FILE_ALIGNMENT_INFORMATION

FILE_ATTRIBUTE_TAG_INFORMATION

FILE_BASIC_INFORMATION

FILE_INTERNAL_INFORMATION

FILE_NAME_INFORMATION

FILE_NETWORK_OPEN_INFORMATION

FILE_POSITION_INFORMATION

FILE_STANDARD_INFORMATION

FILE_STREAM_INFORMATION

FILE_LINKS_INFORMATION

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCheckEaBufferValidity

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_SET_INFORMATION

ZwQueryInformationFile