Encaminhando solicitações de e/s

Quando um driver recebe uma solicitação de e/s que não pode processar, normalmente faz um dos seguintes:

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

  • 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 anterior chamando WdfDeviceGetIoTarget, seguido por WdfRequestFormatRequestUsingCurrentTypee, finalmente, WdfRequestSend.

    Essa técnica será útil somente se o driver receber uma solicitação que não precisa ser modificada antes do encaminhamento.

  • Um driver pode chamar WdfFdoInitSetFilter para se registrar 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 as solicitações desse tipo para o próximo driver mais baixo.

  • Normalmente, um driver de função examina cada conteúdo da solicitação de e/s. Se um driver de função não puder processar uma solicitação, ele poderá modificar a solicitação e encaminhá-la a um destino de e/s. Ou, ele pode criar uma ou mais solicitações novas e enviá-las a 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 e/s, consulte usando destinos de e/s.

    Raramente, um gravador de driver pode querer especificar o conteúdo de um local de pilha de e/s de WDM subjacente antes de enviar uma solicitação para um destino 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 eventualmente concluir todas as solicitações que encaminha para um destino de e/s, a menos que ele defina o sinalizador WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET ao chamar WdfRequestSend.

Observe que, quando um driver encaminha uma solicitação, a estrutura não transfere literalmente o objeto de solicitação de estrutura do driver de envio para o driver de recebimento. 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 subjacente da solicitação (IRP) é transferido de um driver para outro.