Compartilhar via


Determinando o método de buffer para uma operação de E/S

Assim como os drivers de dispositivo, os sistemas de arquivos são responsáveis por transferir dados entre aplicativos de modo de usuário e dispositivos de um sistema. O sistema operacional fornece os três métodos a seguir para acessar buffers de dados:

  • Em E/S em buffer, o gerenciador de E/S aloca um buffer do sistema para a operação do pool nãopagado. O gerenciador de E/S copia dados desse buffer do sistema para o buffer de usuário do aplicativo e vice-versa, no contexto do thread que iniciou a operação de E/S.

  • Em E/S direta, o gerenciador de E/S investiga e bloqueia o buffer do usuário. Em seguida, ele cria uma MDL (lista de descritores de memória) para mapear o buffer bloqueado. O gerenciador de E/S acessa o buffer no contexto do thread que iniciou a operação de E/S.

  • Em E/S não armazenada em buffer nem direta, o gerenciador de E/S não aloca um buffer do sistema e não bloqueia nem mapeia o buffer do usuário. Em vez disso, ele simplesmente passa o endereço virtual de espaço de usuário original do buffer para a pilha do sistema de arquivos. Os drivers são responsáveis por garantir que eles estejam sendo executados no contexto do thread inicial e que os endereços de buffer sejam válidos.

    Os drivers de minifiltro devem validar qualquer endereço no espaço do usuário antes de tentar usá-lo. O gerenciador de E/S e o gerenciador de filtros não validam esses endereços e não validam ponteiros inseridos em buffers que são passados para drivers de minifiltro.

Todos os sistemas de arquivos padrão da Microsoft não usam E/S em buffer nem direta para a maioria dos processamentos de E/S.

Para obter mais informações sobre métodos de buffer, consulte Métodos para acessar buffers de dados.

Para operações de E/S baseadas em IRP, o método de buffer usado é específico da operação e é determinado pelos seguintes fatores:

  • O tipo de operação de E/S que está sendo executada

  • O valor do membro Flags da estrutura DEVICE_OBJECT para o volume do sistema de arquivos

  • Para operações de controle de E/S (IOCTL) e FSCTL (controle do sistema de arquivos), o valor do parâmetro TransferType que foi passado para a macro CTL_CODE quando o IOCTL ou FSCTL foi definido

As operações de E/S rápidas que têm buffers sempre não usam buffer nem E/S direta.

As operações de retorno de chamada do sistema de arquivos não têm buffers.

Esta seção inclui:

Operações que podem ser IRP-Based ou E/S rápida

Operações de E/S baseadas em IRP que obedecem aos sinalizadores de objeto do dispositivo

Operações de E/S baseadas em IRP que sempre usam E/S em buffer

Operações de E/S baseadas em IRP que sempre usam E/S direta nem em buffer

Operações IOCTL e FSCTL baseadas em IRP

Operações de E/S baseadas em IRP que não têm buffers