/*++ Copyright (c) 1999 Microsoft Corporation Module Name: ObjDesc.cpp Abstract: Static object description data structures. This file includes initial descriptors for all filter, pin, and node objects exposed by this driver. It also include descriptors for the properties, methods, and events on those objects. --*/ #include "casamp.h" #ifdef ALLOC_DATA_PRAGMA #pragma const_seg("PAGECONST") #endif // ALLOC_DATA_PRAGMA #ifdef ALLOC_PRAGMA #pragma code_seg("PAGE") #endif // ALLOC_PRAGMA //=========================================================================== // // Node definitions // // Nodes are special in that, though they are defined at the filter level, // they are actually associated with a pin type. The filter's node // descriptor list is actually a list of node types. // // You will notice that the dispatch routines actually point to // pin specific methods. This is because the context data associated with // a node is stored in the pin context. // // Node properties and methods should only be used on the appropriate // pin. // //=========================================================================== // This filter's node topology: // // |-------------| // Transport In Pin ----| ECMMap Node |---- Transport Out Pin // |-------------| // // This node is meant to follow a tuner/demod filter in a BDA topology //=========================================================================== // // Our ECM Mapper Node definitions // // This structure defines the Properties, Methods, and Events // available on our ECM Mapper. // // The properties are used to set the PIDs of the streams carrying the // keys and the encrypted data that needs to be decrypted with those keys. // // This node is associated with an transport output pin and thus the node // properties should be set/put using the transport output pin. // //=========================================================================== // // ECM Mapper // // Defines the dispatch routines for the ECM Map Properties // on the ECM Mapper // DEFINE_KSPROPERTY_TABLE(OurECMMapperNodeECMMapProperties) { DEFINE_KSPROPERTY_ITEM_BDA_ECMMAP_EMM_PID( NULL, CTransportOutputPin::PutECMMapEMMPID ), DEFINE_KSPROPERTY_ITEM_BDA_ECMMAP_MAP_LIST( CTransportOutputPin::GetECMMapList, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_ECMMAP_UPDATE_MAP( NULL, CTransportOutputPin::PutECMMapUpdateMap ), DEFINE_KSPROPERTY_ITEM_BDA_ECMMAP_REMOVE_MAP( NULL, CTransportOutputPin::PutECMMapRemoveMap ), DEFINE_KSPROPERTY_ITEM_BDA_ECMMAP_UPDATE_ES_DESCRIPTOR( NULL, CTransportOutputPin::PutECMMapUpdateESDescriptor ), DEFINE_KSPROPERTY_ITEM_BDA_ECMMAP_UPDATE_PROGRAM_DESCRIPTOR( NULL, CTransportOutputPin::PutECMMapUpdateProgramDescriptor ) }; // // ECM Mapper // // Defines the dispatch routines for the CA Properties // on the ECM Mapper // DEFINE_KSPROPERTY_TABLE(OurECMMapperNodeCAProperties) { DEFINE_KSPROPERTY_ITEM_BDA_ECM_MAP_STATUS( CTransportOutputPin::GetECMMapStatus, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_CA_MODULE_STATUS( CTransportOutputPin::GetCAModuleStatus, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_CA_SMART_CARD_STATUS( CTransportOutputPin::GetCASmartCardStatus, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_CA_MODULE_UI( CTransportOutputPin::GetCAModuleUI, NULL ) }; // // Our ECM Mapper Node Property Sets supported // // This table defines all property sets supported by the // Our ECM Mapper Node associated with the transport output pin. // DEFINE_KSPROPERTY_SET_TABLE(OurECMMapperNodePropertySets) { DEFINE_KSPROPERTY_SET ( &KSPROPSETID_BdaEcmMap, // Set SIZEOF_ARRAY(OurECMMapperNodeECMMapProperties), // PropertiesCount OurECMMapperNodeECMMapProperties, // PropertyItems 0, // FastIoCount NULL // FastIoTable ), DEFINE_KSPROPERTY_SET ( &KSPROPSETID_BdaCA, // Set SIZEOF_ARRAY(OurECMMapperNodeCAProperties), // PropertiesCount OurECMMapperNodeCAProperties, // PropertyItems 0, // FastIoCount NULL // FastIoTable ) }; DEFINE_KSEVENT_TABLE(OurECMMapperNodeCAEvents) { DEFINE_KSEVENT_BDA_ECM_MAP_STATUS_CHANGED ( NULL, NULL, NULL ), DEFINE_KSEVENT_BDA_CA_MODULE_STATUS_CHANGED ( NULL, NULL, NULL ), DEFINE_KSEVENT_BDA_CA_SMART_CARD_STATUS_CHANGED ( NULL, NULL, NULL ), DEFINE_KSEVENT_BDA_CA_MODULE_UI_REQUESTED ( NULL, NULL, NULL ) }; DEFINE_KSEVENT_SET_TABLE(OurECMMapperNodeEventsSets) { DEFINE_KSEVENT_SET ( &KSEVENTSETID_BdaCAEvent, SIZEOF_ARRAY(OurECMMapperNodeCAEvents), OurECMMapperNodeCAEvents ) }; // // Our ECM Mapper Node Automation Table // // DEFINE_KSAUTOMATION_TABLE(OurECMMapperNodeAutomation) { //SHOULD BE: // //DEFINE_KSAUTOMATION_PROPERTIES(OurECMMapperNodePropertySets), //DEFINE_KSAUTOMATION_METHODS_NULL, //DEFINE_KSAUTOMATION_EVENTS(OurECMMapperNodeEventsSets) // //but KSPROXY does not yet aggregate node automation tables with pin //automation tables so we will do it manually, for now leaving no //automation on this node DEFINE_KSAUTOMATION_PROPERTIES_NULL, DEFINE_KSAUTOMATION_METHODS_NULL, DEFINE_KSAUTOMATION_EVENTS_NULL }; //=========================================================================== // // Transport Input Pin Definitions // //=========================================================================== // // Transport Input Pin Automation Table // // Lists all Property, Method, and Event Set tables for the transport pin // DEFINE_KSAUTOMATION_TABLE(TransportInputAutomation) { DEFINE_KSAUTOMATION_PROPERTIES_NULL, DEFINE_KSAUTOMATION_METHODS_NULL, DEFINE_KSAUTOMATION_EVENTS_NULL }; // // Dispatch Table for the ATSC transport Output pin. // // Since data on the transport is actually delivered to the // PCI bridge in hardware, this pin does not need to process // data. // // Connection of, and state transitions on, this pin help the // driver to determine when to allocate hardware resources for // the tuner and demodulator. // const KSPIN_DISPATCH TransportInputPinDispatch = { CTransportInputPin::PinCreate, // Create CTransportInputPin::PinClose, // Close NULL, // Process NULL, // Reset NULL, // SetDataFormat PinSetDeviceState, // SetDeviceState NULL, // Connect NULL, // Disconnect NULL, // Clock NULL // Allocator }; // // Format of an ATSC Transport Stream Connection // // Used to connect the Transport Stream output pin to the // Capture Filter. // #ifdef NEW_BDA_TRANSPORT_FORMAT const KS_DATARANGE_BDA_TRANSPORT TransportInputPinRange = { // KSDATARANGE { sizeof( KS_DATARANGE_BDA_TRANSPORT), // FormatSize 0, // Flags - (N/A) 0, // SampleSize - (N/A) 0, // Reserved { STATIC_KSDATAFORMAT_TYPE_STREAM }, // MajorFormat { STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT }, // SubFormat { STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT } // Specifier }, // BDA_TRANSPORT_INFO { 188, // ulcbPhyiscalPacket 312 * 188, // ulcbPhyiscalFrame 0, // ulcbPhyiscalFrameAlignment (no requirement) 0 // AvgTimePerFrame (not known) } }; #else const KS_DATARANGE_ANALOGVIDEO TransportInputPinRange = { // KS_DATARANGE_ANALOGVIDEO { sizeof (KS_DATARANGE_ANALOGVIDEO), // FormatSize 0, // Flags sizeof (KS_TVTUNER_CHANGE_INFO), // SampleSize 0, // Reserved STATIC_KSDATAFORMAT_TYPE_ANALOGVIDEO, // aka MEDIATYPE_AnalogVideo STATIC_KSDATAFORMAT_SUBTYPE_NONE, STATIC_KSDATAFORMAT_SPECIFIER_ANALOGVIDEO, // aka FORMAT_AnalogVideo }, // KS_ANALOGVIDEOINFO { 0, 0, 720, 480, // rcSource; 0, 0, 720, 480, // rcTarget; 720, // dwActiveWidth; 480, // dwActiveHeight; 0, // REFERENCE_TIME AvgTimePerFrame; } }; #endif // NEW_BDA_TRANSPORT_FORMAT // Format Ranges of Transport Output Pin. // static PKSDATAFORMAT TransportInputPinRanges[] = { (PKSDATAFORMAT) &TransportInputPinRange, // Add more formats here if additional transport formats are supported. // }; //=========================================================================== // // Transport Output Pin Definitions // //=========================================================================== // // Transport Output Pin Automation Table // // Lists all Property, Method, and Event Set tables for the transport pin // DEFINE_KSAUTOMATION_TABLE(TransportOutputAutomation) { //SHOULD BE: // //DEFINE_KSAUTOMATION_PROPERTIES_NULL, //DEFINE_KSAUTOMATION_METHODS_NULL, //DEFINE_KSAUTOMATION_EVENTS_NULL // //but KSPROXY does not yet aggregate node automation tables with pin //automation tables so we will do it manually, for now we will manually //move node automation to this pin DEFINE_KSAUTOMATION_PROPERTIES(OurECMMapperNodePropertySets), DEFINE_KSAUTOMATION_METHODS_NULL, DEFINE_KSAUTOMATION_EVENTS(OurECMMapperNodeEventsSets) }; // // Dispatch Table for the ATSC transport Output pin. // // Since data on the transport is actually delivered to the // PCI bridge in hardware, this pin does not need to process // data. // // Connection of, and state transitions on, this pin help the // driver to determine when to allocate hardware resources for // the tuner and demodulator. // const KSPIN_DISPATCH TransportOutputPinDispatch = { CTransportOutputPin::PinCreate, // Create CTransportOutputPin::PinClose, // Close NULL, // Process NULL, // Reset NULL, // SetDataFormat PinSetDeviceState, // SetDeviceState NULL, // Connect NULL, // Disconnect NULL, // Clock NULL // Allocator }; // // Format of an ATSC Transport Stream Connection // // Used to connect the Transport Stream output pin to the // Capture Filter. // #ifdef NEW_BDA_TRANSPORT_FORMAT const KS_DATARANGE_BDA_TRANSPORT TransportOutputPinRange = { // KSDATARANGE { sizeof( KS_DATARANGE_BDA_TRANSPORT), // FormatSize 0, // Flags - (N/A) 0, // SampleSize - (N/A) 0, // Reserved { STATIC_KSDATAFORMAT_TYPE_STREAM }, // MajorFormat { STATIC_KSDATAFORMAT_TYPE_MPEG2_TRANSPORT }, // SubFormat { STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT } // Specifier }, // BDA_TRANSPORT_INFO { 188, // ulcbPhyiscalPacket 312 * 188, // ulcbPhyiscalFrame 0, // ulcbPhyiscalFrameAlignment (no requirement) 0 // AvgTimePerFrame (not known) } }; #else const KS_DATARANGE_ANALOGVIDEO TransportOutputPinRange = { // KS_DATARANGE_ANALOGVIDEO { sizeof (KS_DATARANGE_ANALOGVIDEO), // FormatSize 0, // Flags sizeof (KS_TVTUNER_CHANGE_INFO), // SampleSize 0, // Reserved STATIC_KSDATAFORMAT_TYPE_ANALOGVIDEO, // aka MEDIATYPE_AnalogVideo STATIC_KSDATAFORMAT_SUBTYPE_NONE, STATIC_KSDATAFORMAT_SPECIFIER_ANALOGVIDEO, // aka FORMAT_AnalogVideo }, // KS_ANALOGVIDEOINFO { 0, 0, 720, 480, // rcSource; 0, 0, 720, 480, // rcTarget; 720, // dwActiveWidth; 480, // dwActiveHeight; 0, // REFERENCE_TIME AvgTimePerFrame; } }; #endif // NEW_BDA_TRANSPORT_FORMAT // Format Ranges of Transport Output Pin. // static PKSDATAFORMAT TransportOutputPinRanges[] = { (PKSDATAFORMAT) &TransportOutputPinRange, // Add more formats here if additional transport formats are supported. // }; //=========================================================================== // // Filter definitions // //=========================================================================== // // Template Node Descriptors // // This array describes all Node Types available in the template // topology of the filter. // const KSNODE_DESCRIPTOR NodeDescriptors[] = { { &OurECMMapperNodeAutomation, // PKSAUTOMATION_TABLE AutomationTable; &KSNODE_BDA_OUR_ECMMAPER, // Type NULL // Name } }; // // Initial Pin Descriptors // // This data structure defines the pins that will appear on the filer // when it is first created. // const KSPIN_DESCRIPTOR_EX InitialPinDescriptors[] = { // Tranport Input Pin // { &TransportInputPinDispatch, &TransportInputAutomation, // TransportPinAutomation { 0, // Interfaces NULL, 0, // Mediums NULL, SIZEOF_ARRAY(TransportInputPinRanges), TransportInputPinRanges, KSPIN_DATAFLOW_IN, KSPIN_COMMUNICATION_BOTH, (GUID *) &PINNAME_BDA_TRANSPORT, // Name (GUID *) &PINNAME_BDA_TRANSPORT, // Category 0 }, KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT | KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING | KSPIN_FLAG_FIXED_FORMAT, 1, 1, // InstancesNecessary NULL, // Allocator Framing CTransportInputPin::IntersectDataFormat // PinIntersectHandler } }; // // Template Pin Descriptors // // This data structure defines the pin types available in the filters // template topology. These structures will be used to create a // KSPinFactory for a pin type when BdaCreatePin is called. // const KSPIN_DESCRIPTOR_EX TemplatePinDescriptors[] = { // Tranport Input Pin // { &TransportInputPinDispatch, &TransportInputAutomation, // TransportPinAutomation { 0, // Interfaces NULL, 0, // Mediums NULL, SIZEOF_ARRAY(TransportInputPinRanges), TransportInputPinRanges, KSPIN_DATAFLOW_IN, KSPIN_COMMUNICATION_BOTH, (GUID *) &PINNAME_BDA_TRANSPORT, // Name (GUID *) &PINNAME_BDA_TRANSPORT, // Category 0 }, KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT | KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING | KSPIN_FLAG_FIXED_FORMAT, 1, 1, // InstancesNecessary NULL, // Allocator Framing CTransportInputPin::IntersectDataFormat // PinIntersectHandler }, // Tranport Output Pin // { &TransportOutputPinDispatch, &TransportOutputAutomation, // TransportPinAutomation { 0, // Interfaces NULL, 0, // Mediums NULL, SIZEOF_ARRAY(TransportOutputPinRanges), TransportOutputPinRanges, KSPIN_DATAFLOW_OUT, KSPIN_COMMUNICATION_BOTH, (GUID *) &PINNAME_BDA_TRANSPORT, // Name (GUID *) &PINNAME_BDA_TRANSPORT, // Category 0 }, KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT | KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING | KSPIN_FLAG_FIXED_FORMAT, 1, 0, // InstancesNecessary NULL, // Allocator Framing CTransportOutputPin::IntersectDataFormat // PinIntersectHandler } }; // // BDA Device Topology Property Set // // Defines the dispatch routines for the filter level // topology properties // DEFINE_KSPROPERTY_TABLE(FilterTopologyProperties) { DEFINE_KSPROPERTY_ITEM_BDA_NODE_TYPES( BdaPropertyNodeTypes, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_PIN_TYPES( BdaPropertyPinTypes, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_TEMPLATE_CONNECTIONS( BdaPropertyTemplateConnections, NULL ), DEFINE_KSPROPERTY_ITEM_BDA_CONTROLLING_PIN_ID( BdaPropertyGetControllingPinId, NULL ) }; // // Filter Level Property Sets supported // // This table defines all property sets supported by the // tuner filter exposed by this driver. // DEFINE_KSPROPERTY_SET_TABLE(FilterPropertySets) { DEFINE_KSPROPERTY_SET ( &KSPROPSETID_BdaTopology, // Set SIZEOF_ARRAY(FilterTopologyProperties), // PropertiesCount FilterTopologyProperties, // PropertyItems 0, // FastIoCount NULL // FastIoTable ) }; // // BDA Change Sync Method Set // // Defines the dispatch routines for the filter level // Change Sync methods // DEFINE_KSMETHOD_TABLE(BdaChangeSyncMethods) { DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES( CFilter::StartChanges, NULL ), DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES( CFilter::CheckChanges, NULL ), DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES( CFilter::CommitChanges, NULL ), DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE( CFilter::GetChangeState, NULL ) }; // // 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 ) }; // // Filter Level Method Sets supported // // This table defines all method sets supported by the // tuner filter exposed by this driver. // DEFINE_KSMETHOD_SET_TABLE(FilterMethodSets) { DEFINE_KSMETHOD_SET ( &KSMETHODSETID_BdaChangeSync, // Set SIZEOF_ARRAY(BdaChangeSyncMethods), // PropertiesCount BdaChangeSyncMethods, // PropertyItems 0, // FastIoCount NULL // FastIoTable ), DEFINE_KSMETHOD_SET ( &KSMETHODSETID_BdaDeviceConfiguration, // Set SIZEOF_ARRAY(BdaDeviceConfigurationMethods),// PropertiesCount BdaDeviceConfigurationMethods, // PropertyItems 0, // FastIoCount NULL // FastIoTable ) }; // // Filter Automation Table // // Lists all Property, Method, and Event Set tables for the filter // DEFINE_KSAUTOMATION_TABLE(FilterAutomation) { DEFINE_KSAUTOMATION_PROPERTIES(FilterPropertySets), DEFINE_KSAUTOMATION_METHODS(FilterMethodSets), DEFINE_KSAUTOMATION_EVENTS_NULL }; // // Filter Dispatch Table // // Lists the dispatch routines for major events at the filter // level. // const KSFILTER_DISPATCH FilterDispatch = { CFilter::Create, // Create CFilter::FilterClose, // Close NULL, // Process NULL // Reset }; // // Filter Factory Descriptor for the tuner filter // // This structure brings together all of the structures that define // the tuner filter as it appears when it is first instanciated. // Note that not all of the template pin and node types may be exposed as // pin and node factories when the filter is first instanciated. // DEFINE_KSFILTER_DESCRIPTOR(InitialTunerFilterDescriptor) { &FilterDispatch, // Dispatch &FilterAutomation, // AutomationTable KSFILTER_DESCRIPTOR_VERSION, // Version 0, // Flags &KSNAME_Filter, // ReferenceGuid DEFINE_KSFILTER_PIN_DESCRIPTORS(InitialPinDescriptors), // PinDescriptorsCount // PinDescriptorSize // PinDescriptors DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_RECEIVER_COMPONENT),// CategoriesCount // Categories DEFINE_KSFILTER_NODE_DESCRIPTORS_NULL, // NodeDescriptorsCount // NodeDescriptorSize // NodeDescriptors DEFINE_KSFILTER_DEFAULT_CONNECTIONS, // ConnectionsCount // Connections NULL // ComponentId }; //=========================================================================== // // Filter Template Topology definitions // //=========================================================================== // // Our Node index number (zero because its the only node) // #define OUR_ECMMAPPER_NODE_NUMBER 0 // // BDA Template Topology Connections // // Lists the Connections that are possible between pin types and // node types. This, together with the Template Filter Descriptor, and // the Pin Pairings, describe how topologies can be created in the filter. // const KSTOPOLOGY_CONNECTION TemplateFilterConnections[] = { { KSFILTER_NODE, 0, OUR_ECMMAPPER_NODE_NUMBER, 0}, { OUR_ECMMAPPER_NODE_NUMBER, 1, KSFILTER_NODE, 1} }; // // Template Joints between the Antenna and Transport Pin Types. // // Lists the template joints between the Antenna Input Pin Type and // the Transport Output Pin Type. // const ULONG TransportJoints[] = { 0 }; // // Template Pin Parings. // // These are indexes into the template connections structure that // are used to determine which nodes get duplicated when more than // one output pin type is connected to a single input pin type or when // more that one input pin type is connected to a single output pin // type. // const BDA_PIN_PAIRING TemplateTunerPinPairings[] = { // Antenna to Transport Topology Joints // { 0, // ulInputPin 1, // ulOutputPin 1, // ulcMaxInputsPerOutput 1, // ulcMinInputsPerOutput 1, // ulcMaxOutputsPerInput 1, // ulcMinOutputsPerInput SIZEOF_ARRAY(TransportJoints), // ulcTopologyJoints TransportJoints // pTopologyJoints } }; // // Filter Factory Descriptor for the tuner filter template topology // // This structure brings together all of the structures that define // the topologies that the tuner filter can assume as a result of // pin factory and topology creation methods. // Note that not all of the template pin and node types may be exposed as // pin and node factories when the filter is first instanciated. // DEFINE_KSFILTER_DESCRIPTOR(TemplateTunerFilterDescriptor) { &FilterDispatch, // Dispatch &FilterAutomation, // AutomationTable KSFILTER_DESCRIPTOR_VERSION, // Version 0, // Flags &KSNAME_Filter, // ReferenceGuid DEFINE_KSFILTER_PIN_DESCRIPTORS(TemplatePinDescriptors),// PinDescriptorsCount // PinDescriptorSize // PinDescriptors DEFINE_KSFILTER_CATEGORY(KSCATEGORY_BDA_RECEIVER_COMPONENT),// CategoriesCount // Categories DEFINE_KSFILTER_NODE_DESCRIPTORS(NodeDescriptors), // NodeDescriptorsCount // NodeDescriptorSize // NodeDescriptors DEFINE_KSFILTER_CONNECTIONS(TemplateFilterConnections), // ConnectionsCount // Connections NULL // ComponentId }; // // BDA Template Topology Descriptor for the filter. // // This structure define the pin and node types that may be created // on the filter. // const BDA_FILTER_TEMPLATE TunerBdaFilterTemplate = { &TemplateTunerFilterDescriptor, SIZEOF_ARRAY(TemplateTunerPinPairings), TemplateTunerPinPairings }; //=========================================================================== // // Device definitions // //=========================================================================== // // Array containing descriptors for all of the filter factories // that are available on the device. // // Note! This only used when dynamic topology is not desired. // (i.e. filters and pins are fixed, usually there is also no // network provider in this case) // DEFINE_KSFILTER_DESCRIPTOR_TABLE(FilterDescriptors) { &TemplateTunerFilterDescriptor }; // // Device Dispatch Table // // Lists the dispatch routines for the major events in the life // of 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 all data structures that define the device and // the intial filter factories that can be created on it. // Note that this structure does not include the template topology // structures as they are specific to BDA. // extern const KSDEVICE_DESCRIPTOR DeviceDescriptor = { &DeviceDispatch, // Dispatch #ifdef DYNAMIC_TOPOLOGY 0, // SIZEOF_ARRAY( FilterDescriptors), // FilterDescriptorsCount NULL // FilterDescriptors // FilterDescriptors #else SIZEOF_ARRAY( FilterDescriptors), // FilterDescriptorsCount FilterDescriptors // FilterDescriptors #endif // DYNAMIC_TOPOLOGY };