Configuración de un filtro BDA

Un minidriver BDA procesa solicitudes de método del método KSMETHODSETID_BdaDeviceConfiguration establecido para configurar una instancia de filtro para el minidriver en el gráfico de filtros actual.

En el siguiente fragmento de código, dos de los métodos del conjunto de métodos de KSMETHODSETID_BdaDeviceConfiguration se envían directamente a la biblioteca de compatibilidad de BDA y el método restante se intercepta primero mediante el minidriver de BDA antes de enviar a la biblioteca de compatibilidad de 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;
}

La solicitud de método KSMETHOD_BDA_CREATE_TOPOLOGY llama al método CFilter::CreateTopology del minidriver. Este método llama a la función de biblioteca de compatibilidad BdaMethodCreateTopology para crear una topología entre patillas de filtro. Esta función crea realmente una estructura de topología en anillo 3, que refleja, para otros conjuntos de propiedades, las conexiones conocidas del filtro. Un minidriver BDA debe interceptar la solicitud de método KSMETHOD_BDA_CREATE_TOPOLOGY tal y como se muestra en el fragmento de código anterior si ese minidriver debe enviar instrucciones especiales al hardware al conectar tipos de patillas concretos, por ejemplo, si el dispositivo BDA realiza la desmultiplexación de hardware y crea un número arbitrario de patillas de salida ramificadas desactivadas desde un único pin de entrada.