Инициализация минидрайвера BDA

Минидрайвер BDA инициализируется аналогично другим минидрайверам AVStream. Функция DriverEntry minidriver BDA вызывает функцию AVStream KsInitializeDriver для инициализации объекта драйвера minidriver BDA. В этом вызове минидрайвер BDA передает указатель на структуру KSDEVICE_DESCRIPTOR, указывающую характеристики устройства, которые могут включать:

  • Указатель на структуру KSDEVICE_DISPATCH , содержащую таблицу отправки для устройства BDA. По крайней мере минидрайвер BDA должен предоставлять подпрограммы, которые создают и запускают устройство, и указывает эти подпрограммы в элементах Add и Start соответственно структуры KSDEVICE_DISPATCH. Создающая процедура минидрайвера BDA должна выделять память для класса устройства и присвоить указатель на структуру KSDEVICE этого класса для устройства BDA. Подпрограмма запуска минидрайвера BDA должна получить сведения об устройстве из реестра, установить сведений об устройстве, а затем зарегистрировать группу статических шаблонных структур в библиотеке поддержки BDA. Дополнительные сведения см. в статье "Запуск минидрайвера BDA".

  • Массив структур KSFILTER_DESCRIPTOR для отдельных типов фильтров, поддерживаемых этим устройством. Этот тип структуры описывает характеристики фильтра, созданного заданной фабрикой фильтров. При создании минидрайвера BDA необходимо указать элементы структур этого типа в этом массиве, чтобы не использовать библиотеку поддержки BDA (Bdasup.lib) для работы с наборами свойств и методов вашего минидрайвера BDA. Если вы создаете минидрайвер BDA, чтобы он использовал библиотеку поддержки BDA, то ваш минидрайвер BDA должен вместо этого вызвать поддерживающую функцию BdaCreateFilterFactory, чтобы добавить дескрипторы фабрики фильтров (структуры KSFILTER_DESCRIPTOR) для вашего устройства. Дополнительные сведения см. в статье "Запуск минидрайвера BDA".

В следующем фрагменте кода показаны примеры массива дескрипторов фильтров, таблицы отправки для устройства BDA и дескриптора для устройства BDA:

//
//  Array containing descriptors for all filter factories
//  available on the device.
//
//  Note!  Only used when dynamic topology is not used (that is, 
//         only when filters and pins are fixed). Typically, this 
//         is when the network provider is not present.
//
DEFINE_KSFILTER_DESCRIPTOR_TABLE(FilterDescriptors)
{
    &TemplateTunerFilterDescriptor
};
//
//  Device Dispatch Table
//
//  Lists the dispatch routines for the major events related to 
//  the underlying device.
//
extern
const
KSDEVICE_DISPATCH
DeviceDispatch =
{
    CDevice::Create,    // Add
    CDevice::Start,     // Start
    NULL,               // PostStart
    NULL,               // QueryStop
    NULL,               // CancelStop
    NULL,               // Stop
    NULL,               // QueryRemove
    NULL,               // CancelRemove
    NULL,               // Remove
    NULL,               // QueryCapabilities
    NULL,               // SurpriseRemoval
    NULL,               // QueryPower
    NULL                // SetPower
};
//
//  Device Descriptor
//
//  Brings together the data structures that define the device and
//  the initial filter factories that can be created on it.
//  Note that because template topology structures are specific 
//  to BDA, the device descriptor does not include them.
//  Note also that if BDA dynamic topology is used, the device 
//  descriptor does not specify a list of filter factory descriptors.
//  If BDA dynamic topology is used, the BDA minidriver calls 
//  BdaCreateFilterFactory to add filter factory descriptors. 
extern
const
KSDEVICE_DESCRIPTOR
DeviceDescriptor =
{
    &DeviceDispatch,    // Dispatch
#ifdef DYNAMIC_TOPOLOGY // network provider is present
    0,    // FilterDescriptorsCount
    NULL, // FilterDescriptors
#else     // network provider is not present
    SIZEOF_ARRAY( FilterDescriptors), // FilterDescriptorsCount
    FilterDescriptors                 // FilterDescriptors
#endif // DYNAMIC_TOPOLOGY