Partilhar via


Métodos para acessar buffers de dados

Uma das principais responsabilidades das pilhas de drivers é transferir dados entre aplicações em modo utilizador e os dispositivos de um sistema. O sistema operacional fornece os seguintes três métodos para acessar buffers de dados:

E/S em buffer
O sistema operacional cria um buffer de sistema não paginado, igual em tamanho ao 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 de drivers. Para operações de leitura, o gestor de E/S copia os dados do buffer do sistema para o buffer da aplicação depois que a pilha de drivers conclui a operação solicitada.

Para obter mais informações, consulte Usando E/S em buffer.

E/S diretas
O sistema operacional bloqueia o buffer do aplicativo na memória. Em seguida, cria uma lista de descritores de memória (MDL) que identifica as páginas de memória bloqueadas e passa o MDL para a stack de controladores. Os drivers acessam as páginas bloqueadas através do MDL.

Para obter mais informações, consulte Usando E/S direta.

Sem utilização de E/S bufferizada nem E/S direta
O sistema operacional passa o endereço inicial virtual e o tamanho do buffer de aplicativos 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 Usar sem buffer nem E/S 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 DEVICE_OBJECT . Para obter mais informações, consulte "Inicializar um Objeto de Dispositivo".

Para solicitações IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL , o método de E/S é determinado pelo valor TransferType contido em cada valor IOCTL. Para obter mais informações, consulte Definição de Códigos de Controle de E/S.

Todos os drivers numa 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).