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.