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