Métodos para acessar buffers de dados

Uma das principais responsabilidades das pilhas de driver é 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 os buffers de dados:

E/s em buffer
O sistema operacional cria um buffer de sistema não paginável, igual em tamanho para o buffer do aplicativo. Para operações de gravação, o Gerenciador de e/s copia os dados do usuário no buffer do sistema antes de chamar a pilha do driver. Para operações de leitura, o Gerenciador de e/s copia dados do buffer do sistema para o buffer do aplicativo depois que a pilha do driver conclui a operação solicitada.

Para obter mais informações, consulte usando e/s em buffer.

E/s direta
O sistema operacional bloqueia o buffer do aplicativo na memória. Em seguida, ele cria uma MDL (lista de descritores de memória) que identifica as páginas de memória bloqueadas e passa o MDL para a pilha de driver. Os drivers acessam as páginas bloqueadas por meio do MDL.

Para obter mais informações, consulte usando e/s direta.

Nenhuma e/s de buffer nem direta
O sistema operacional passa o endereço e o tamanho de inicialização virtual do buffer de aplicativo para a pilha de drivers. O buffer só é acessível a partir de drivers que são executados no contexto de thread do aplicativo.

Para obter mais informações, consulte usando nenhuma e/s de buffer nem direta.

Para solicitações de IRP_MJ_READ e IRP_MJ_WRITE , os drivers especificam o método de e/s usando sinalizadores em cada estrutura de DEVICE_OBJECT . Para obter mais informações, consulte inicializando um objeto de dispositivo.

Para solicitações de IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL , o método de e/s é determinado pelo valor de transfertype que está contido em cada valor de IOCTL. Para obter mais informações, consulte definindo códigos de controle de e/s.

Todos os drivers em uma pilha de drivers devem usar o mesmo método de acesso de buffer para cada solicitação, exceto possivelmente para o driver de nível mais alto (que pode usar o método "nenhum", independentemente do método usado por drivers inferiores).