Partilhar via


Locais de pilha de E/S

O gestor de E/S fornece a cada driver numa cadeia de drivers estratificados uma posição na pilha de E/S para cada IRP estabelecido. Cada local de pilha de E/S consiste em uma estrutura IO_STACK_LOCATION .

O gestor de E/S cria uma matriz de locais de pilha de entrada/saída para cada IRP, com um elemento da matriz correspondente a cada controlador numa cadeia de controladores em camadas. Cada driver possui uma das localizações de pilha no pacote e chama IoGetCurrentIrpStackLocation para obter informações específicas do driver acerca da operação de E/S.

Cada driver numa tal cadeia é responsável por chamar IoGetNextIrpStackLocation e, em seguida, configurar a localização da pilha de E/S do driver imediatamente inferior. Qualquer local de pilha de E/S do driver de nível superior também pode ser usado para armazenar contexto sobre uma operação para que a rotina IoCompletion do driver possa executar suas operações de limpeza.

A figura Processamento de IRPs em Controladores em Camadas mostra dois pontos de pilha de E/S no IRP original porque apresenta dois controladores: um controlador de sistema de arquivos e um controlador de dispositivo de armazenamento em massa. Os IRPs alocados pelo driver na figura Processamento de IRPs de Drivers em Camadas não têm uma posição na pilha para o FSD (Driver do Sistema de Arquivos) que os criou. Qualquer driver de nível superior que aloca IRPs para drivers de nível inferior também determina quantas posições de pilha de E/S os novos IRPs devem ter, de acordo com o valor StackSize do objeto de dispositivo do driver de nível imediatamente inferior.

A figura a seguir mostra o conteúdo do IRP com mais detalhes.

Diagrama ilustrando o conteúdo da localização da pilha de E/S em um IRP.

Como mostrado na figura, cada local de pilha de E/S específico do driver em um IRP contém as seguintes informações gerais:

  • O código de função principal (IRP_MJ_XXX), que indica a operação básica que o condutor deve efetuar

  • Para alguns códigos de função principais manipulados por FSDs, drivers SCSI de nível superior e todos os drivers PnP, um código de função secundária (IRP_MN_XXX), indicando qual subcase da operação básica o driver deve realizar

  • Um conjunto de argumentos específicos da operação, como o comprimento e o local inicial de um buffer para o qual ou a partir do qual o driver transfere dados

  • Um ponteiro para o objeto de dispositivo criado pelo driver, representando o dispositivo de destino (físico, lógico ou virtual) para a operação solicitada

  • Um ponteiro para o objeto de arquivo, representando um arquivo, dispositivo, diretório ou volume aberto

    Um driver de sistema de ficheiros acede ao objeto de ficheiro através da sua posição na pilha de E/S nos Pacotes de Solicitação de Entrada/Saída (IRPs). Outros drivers geralmente ignoram o objeto de arquivo.

O conjunto de códigos de função principais e secundárias IRP que um driver específico manipula pode ser específico do tipo de dispositivo. No entanto, drivers de nível mais baixo e drivers intermediários (incluindo função PnP e drivers de filtro) geralmente lidam com o seguinte conjunto de solicitações básicas:

  • IRP_MJ_CREATE — abra o objeto do dispositivo de destino, indicando que ele está presente e disponível para operações de E/S

  • IRP_MJ_READ — transferir dados do dispositivo

  • IRP_MJ_WRITE — transferir dados para o dispositivo

  • IRP_MJ_DEVICE_CONTROL — configurar (ou repor) o dispositivo, de acordo com um código de controlo de E/S específico do tipo de dispositivo (IOCTL) definido pelo sistema

  • IRP_MJ_CLOSE — Feche o objeto do dispositivo de destino

  • IRP_MJ_PNP — execute uma operação Plug and Play no dispositivo. Uma solicitação IRP_MJ_PNP é enviada pelo gestor de PnP através do gestor de E/S.

  • IRP_MJ_POWER — execute uma operação de energia no dispositivo. Uma solicitação IRP_MJ_POWER é enviada pelo gestor de energia através do gestor de Entrada/Saída.

Para obter mais informações sobre os principais códigos de função IRP que os drivers são obrigados a manipular, consulte IRP Major Function Codes.

Em geral, o gestor de E/S envia IRPs com pelo menos duas localizações de pilha de E/S para drivers de dispositivos de armazenamento de massa porque um sistema de arquivos é estruturado em camadas sobre outros drivers para dispositivos de armazenamento de massa. O gerenciador de E/S envia IRPs com um único local de pilha para qualquer driver que não tenha nenhum outro driver em camadas acima dele.

No entanto, o gerenciador de E/S fornece suporte para adicionar um novo driver a qualquer cadeia de drivers existentes no sistema. Por exemplo, um driver de espelho intermediário que faz backup de dados em uma determinada partição de disco pode ser inserido entre um par de drivers, como o driver do sistema de arquivos e o driver de nível mais baixo mostrado na figura Processando IRPs em Layered Drivers . Quando esse novo driver se conecta à pilha de dispositivos, o gerenciador de E/S ajusta o número de locais de pilha de E/S em todos os IRPs que envia para o sistema de arquivos, espelho e drivers de nível mais baixo. Cada IRP alocado pelo sistema de arquivos na figura de processamento de IRPs em drivers em camadas também conteria outro local de pilha de E/S para esse novo driver espelho.

Observe que esse suporte para adicionar novos drivers a uma cadeia existente implica certas restrições no acesso de qualquer driver específico aos locais da pilha de E/S em IRPs:

  • Um driver de nível superior numa cadeia de drivers em camadas pode acessar com segurança apenas os locais de pilha de E/S do seu próprio driver e do próximo driver de nível inferior em qualquer IRP. Esse driver deve configurar o local da pilha de E/S para o próximo driver de nível inferior em IRPs. No entanto, ao projetar um driver de nível mais alto, você não pode prever quando (ou se) um novo driver será adicionado à cadeia existente logo abaixo do seu driver.

    Portanto, deve assumir que qualquer driver adicionado posteriormente manipulará os mesmos códigos de função principal IRP (IRP_MJ_XXX) que o driver de nível inferior deslocado manipulava.

  • O controlador de nível mais baixo numa cadeia de controladores por camadas pode acessar com segurança apenas a sua própria localização na pilha de E/S em qualquer IRP. Ao projetar tal driver, você não pode prever quando (ou se) um novo driver será adicionado à cadeia existente acima do driver de dispositivo.

    Ao projetar um driver de nível mais baixo, suponha que o driver pode continuar a processar IRPs usando as informações passadas em seu próprio local de pilha de E/S, seja qual for a fonte de origem de um determinado IRP e quantos drivers estejam em camadas acima dele.