Partilhar via


Uma única rotina DispatchCreateClose

Muitos motoristas, particularmente drivers de nível inferior em uma cadeia de drivers em camadas, simplesmente precisam estabelecer sua existência no recebimento de uma solicitação de criação e apenas precisam reconhecer o recebimento de uma solicitação próxima .

Por exemplo, um driver de porta para um controlador de dispositivo com um ou mais drivers de classe acoplados de perto que chamam IoGetDeviceObjectPointer pode ter uma rotina de DispatchCreateClose mínima. A rotina pode não fazer nada além de concluir o IRP da seguinte maneira:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

Essa rotina mínima DispatchCreateClose define o membro Information do bloco de status de E/S como zero, indicando que o objeto de arquivo está aberto para uma solicitação de criação; As informações não têm significado para uma solicitação próxima. A rotina define o membro Status como STATUS_SUCCESS e também retorna esse valor status, indicando que o driver está pronto para aceitar solicitações de E/S.

Essa rotina de DispatchCreateClose mínima conclui a criação de IRP sem aumentar a prioridade do originador do IRP (IO_NO_INCREMENT), pois supõe-se que o originador aguarde um intervalo indeterminado, mas muito pequeno, para que a solicitação seja concluída.

O trabalho que uma rotina DispatchCreateClose faz depende em parte da natureza do dispositivo do driver ou do dispositivo subjacente e, em parte, do design do driver. Se um driver executar operações muito diferentes para criar e fechar solicitações, ele deverá lidar com essas solicitações em rotinas separadas DispatchCreate e DispatchClose.

Para manipular uma solicitação de criação para abrir um objeto de arquivo que representa um dispositivo lógico ou físico, um driver de nível mais alto deve fazer o seguinte:

  1. Chame IoGetCurrentIrpStackLocation para obter um ponteiro para o local da pilha de E/S no IRP.

  2. Verifique FileObject. FileName no local da pilha de E/S e conclua o IRP com STATUS_SUCCESS se a cadeia de caracteres Unicode em FileName tiver um comprimento zero; caso contrário, conclua o IRP com STATUS_INVALID_PARAMETER.

Seguir as etapas anteriores garante que nenhuma tentativa de abrir um pseudofile em um dispositivo possa causar problemas posteriormente. Por exemplo, isso impede tentativas de abrir um \\device\parallel0\temp.dat inexistente.