Configurando um filtro BDA

Um minidriver BDA processa solicitações de método do método KSMETHODSETID_BdaDeviceConfiguration definido para configurar uma instância de filtro para o minidriver no grafo de filtro atual.

No snippet de código a seguir, dois dos métodos do conjunto de métodos KSMETHODSETID_BdaDeviceConfiguration são enviados diretamente para a biblioteca de suporte do BDA e o método restante é interceptado primeiro pelo minidriver BDA antes de expedir para a biblioteca de suporte do BDA.

//
//  BDA Device Configuration Method Set
//
//  Defines the dispatch routines for the filter level
//  topology configuration methods
//
DEFINE_KSMETHOD_TABLE(BdaDeviceConfigurationMethods)
{
    DEFINE_KSMETHOD_ITEM_BDA_CREATE_PIN_FACTORY(
        BdaMethodCreatePin,
        NULL
        ),
    DEFINE_KSMETHOD_ITEM_BDA_DELETE_PIN_FACTORY(
        BdaMethodDeletePin,
        NULL
        ),
    DEFINE_KSMETHOD_ITEM_BDA_CREATE_TOPOLOGY(
        CFilter::CreateTopology,
        NULL
        )
};
/*
** CreateTopology()
**
** Keeps track of topology association between input and output pins
**
*/
NTSTATUS
CFilter::
CreateTopology(
    IN PIRP         pIrp,
    IN PKSMETHOD    pKSMethod,
    PVOID           pvIgnored
    )
{
    NTSTATUS            Status = STATUS_SUCCESS;
    CFilter *           pFilter;
    ULONG               ulPinType;
    PKSFILTER           pKSFilter;

    ASSERT( pIrp);
    ASSERT( pKSMethod);

    //  Obtain a "this" pointer for the method.
    //
    //  Because this function is called directly from the property 
    //  dispatch table, get pointer to the underlying object.
    //
    pFilter = FilterFromIRP( pIrp);
    ASSERT( pFilter);
    if (!pFilter)
    {
        Status = STATUS_INVALID_PARAMETER;
        goto errExit;
    }

    //  Let the BDA support library create the standard topology.
    //  It will also validate the method, instance count, etc.
    //
    Status = BdaMethodCreateTopology( pIrp, pKSMethod, pvIgnored);
    if (Status != STATUS_SUCCESS)
    {
        goto errExit;
    }

    //  This is where the filter can keep track of associated pins.
    //
errExit:
    return Status;
}

A solicitação do método KSMETHOD_BDA_CREATE_TOPOLOGY chama o método CFilter::CreateTopology do minidriver. Esse método chama a função de biblioteca de suporte BdaMethodCreateTopology do BDA para criar uma topologia entre os pinos de filtro. Essa função realmente cria uma estrutura de topologia no Anel 3, que reflete, para outros conjuntos de propriedades, as conexões conhecidas do filtro. Um minidriver BDA deve interceptar a solicitação de método KSMETHOD_BDA_CREATE_TOPOLOGY conforme mostrado no snippet de código anterior se esse minidriver precisar enviar instruções especiais para o hardware ao conectar determinados tipos de pino, por exemplo, se o dispositivo BDA executar demultiplexing de hardware e criar um número arbitrário de pinos de saída com um único pino de entrada.