Encaminhando solicitações de E/S

Quando um driver recebe uma solicitação de E/S que não pode processar, ele normalmente faz um dos seguintes procedimentos:

  • 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 técnicas a seguir para encaminhar uma solicitação para um destino de E/S:

  • Um driver pode encaminhar solicitações de E/S para o driver mais baixo chamando WdfDeviceGetIoTarget, seguido por WdfRequestFormatRequestUsingCurrentType e, por fim, WdfRequestSend.

    Essa técnica só será útil se o driver receber uma solicitação que não precisa modificar antes de encaminhar.

  • 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 solicitações desse tipo para o driver mais baixo.

  • 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á modificar a solicitação e encaminhá-la para um destino de E/S. Ou pode criar uma ou mais solicitações novas 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 E/S, consulte Usando destinos de E/S.

    Raramente, um gravador de driver pode querer especificar o conteúdo do local de pilha de E/S de WDM subjacente de uma solicitação 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 ele 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 receptor. Em vez disso, a estrutura cria um novo objeto de solicitação no driver que recebe a solicitação. Somente o IRP (pacote de solicitação de E/S) subjacente da solicitação é transferido de um driver para outro.