const GUID IID_IKsFilter = {0x3ef6ee44L, 0x0D41, 0x11d2, {0xbe, 0xDA, 0x00, 0xc0, 0x4f, 0x8e, 0xF4, 0x57}};
const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
+const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
VOID
IKsFilter_RemoveFilterFromFilterFactory(
NTSTATUS NTAPI FilterTopologyPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
NTSTATUS NTAPI FilterPinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
-
+NTSTATUS NTAPI FilterGeneralComponentIdHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data);
DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, FilterTopologyPropertyHandler);
DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, FilterPinPropertyHandler, FilterPinPropertyHandler, FilterPinPropertyHandler);
+DEFINE_KSPROPERTY_GENEREAL_COMPONENTID(IKsFilterGeneralSet, FilterGeneralComponentIdHandler);
KSPROPERTY_SET FilterPropertySet[] =
{
(const KSPROPERTY_ITEM*)&IKsFilterPinSet,
0,
NULL
+ },
+ {
+ &KSPROPSETID_General,
+ sizeof(IKsFilterGeneralSet) / sizeof(KSPROPERTY_ITEM),
+ (const KSPROPERTY_ITEM*)&IKsFilterGeneralSet,
+ 0,
+ NULL
}
};
}
+NTSTATUS
+NTAPI
+FilterGeneralComponentIdHandler(
+ IN PIRP Irp,
+ IN PKSIDENTIFIER Request,
+ IN OUT PVOID Data)
+{
+ PIO_STACK_LOCATION IoStack;
+ IKsFilterImpl * This;
+
+ /* get filter implementation */
+ This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
+
+ /* sanity check */
+ ASSERT(This);
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(KSCOMPONENTID));
+
+ if (This->Filter.Descriptor->ComponentId != NULL)
+ {
+ RtlMoveMemory(Data, This->Filter.Descriptor->ComponentId, sizeof(KSCOMPONENTID));
+ Irp->IoStatus.Information = sizeof(KSCOMPONENTID);
+ return STATUS_SUCCESS;
+ }
+ else
+ {
+ /* not valid */
+ return STATUS_NOT_FOUND;
+ }
+
+}
NTSTATUS
NTAPI
UNICODE_STRING GuidString;
PKSPROPERTY Property;
ULONG SetCount = 0;
+ PKSP_NODE NodeProperty;
+ PKSNODE_DESCRIPTOR NodeDescriptor;
/* obtain filter from object header */
Status = IKsFilter_GetFilterFromIrp(Irp, &Filter);
ULONG PropertyItemSize = 0;
/* check if the driver supports method sets */
- if (FilterInstance->Descriptor->AutomationTable->PropertySetsCount)
+ if (Property->Flags & KSPROPERTY_TYPE_TOPOLOGY)
+ {
+ ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSP_NODE));
+ NodeProperty = (PKSP_NODE)Property;
+ NodeDescriptor = (PKSNODE_DESCRIPTOR)((ULONG_PTR)FilterInstance->Descriptor->NodeDescriptors + FilterInstance->Descriptor->NodeDescriptorSize * NodeProperty->NodeId);
+ if (NodeDescriptor->AutomationTable != NULL)
+ {
+ SetCount = NodeDescriptor->AutomationTable->PropertySetsCount;
+ PropertySet = NodeDescriptor->AutomationTable->PropertySets;
+ PropertyItemSize = 0;
+ }
+ }
+ else if (FilterInstance->Descriptor->AutomationTable->PropertySetsCount)
{
SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount;
PropertySet = FilterInstance->Descriptor->AutomationTable->PropertySets;
/* setup filter property sets */
AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM);
- AutomationTable.PropertySetsCount = 2;
+ AutomationTable.PropertySetsCount = 3;
AutomationTable.PropertySets = FilterPropertySet;
/* merge filter automation table */