Partilhar via


Encaminhando solicitações de E/S

Quando um driver recebe uma solicitação de E/S que não pode processar, ele geralmente faz o seguinte:

  • Ele encaminha a solicitação recebida para outro motorista.

  • Ele cria solicitações adicionais e as envia para outro driver.

Os drivers baseados em estrutura encaminham solicitações usando destinos de E/S, que representam outros drivers no sistema. Os drivers podem usar qualquer uma das seguintes técnicas para encaminhar uma solicitação para um destino de E/S:

  • Um driver pode encaminhar solicitações de E/S para o próximo driver inferior chamando WdfDeviceGetIoTarget, seguido por WdfRequestFormatRequestUsingCurrentType e, finalmente, WdfRequestSend.

    Esta técnica só é útil se o controlador receber um pedido que não precisa modificar antes de reencaminhar.

  • Um driver pode chamar WdfFdoInitSetFilter para se registar como um driver de filtro.

    Se um driver de filtro não fornecer uma fila de E/S para um tipo específico de solicitação de E/S, a estrutura encaminhará automaticamente solicitações desse tipo para o driver inferior seguinte.

  • Normalmente, um driver de função examina o conteúdo de cada solicitação de E/S. Se um driver de função não puder processar uma solicitação, ele poderá modificá-la e encaminhá-la para um destino de E/S. Ou, ele pode criar uma ou mais novas solicitações e enviá-las para um destino de E/S.

    O objeto de destino de E/S da estrutura define vários métodos para enviar solicitações de E/S para outros drivers. Por exemplo, um driver pode chamar WdfIoTargetFormatRequestForRead, seguido por WdfRequestSend, para enviar uma solicitação de leitura para um destino de E/S. Para obter mais informações sobre destinos de I/O, consulte Using I/O Targets.

    Raramente, um escritor de drivers pode querer especificar o conteúdo do local da pilha I/O WDM subjacente de uma solicitação antes de enviar uma solicitação a um alvo de E/S. Para esses casos, o driver pode chamar WdfRequestWdmFormatUsingStackLocation antes de chamar WdfRequestSend.

Às vezes, um driver deve enviar a mesma solicitação para vários destinos de E/S, normalmente porque o driver deve enviar um único comando para todos os seus dispositivos. Antes de enviar uma solicitação para um destino de E/S, o driver pode chamar WdfRequestChangeTarget para verificar se o destino de E/S está acessível.

O driver deve, por fim, concluir todas as solicitações que encaminha para um alvo de I/O, a menos que configure o sinalizador WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET ao chamar WdfRequestSend.

Observe que, quando um driver encaminha uma solicitação, o sistema não transfere literalmente o objeto de solicitação do framework do driver de envio para o driver de receção. Em vez disso, a estrutura cria um novo objeto de solicitação no driver que recebe a solicitação. Somente o pacote de solicitação de E/S (IRP) subjacente da solicitação é transferido de um driver para outro.