- implement support for KSPROPSETID_General

svn path=/trunk/; revision=72999
This commit is contained in:
Johannes Anderwald
2016-10-20 20:02:43 +00:00
parent 38933ca790
commit 3b8ab07631
4 changed files with 105 additions and 42 deletions
+58 -3
View File
@@ -45,6 +45,7 @@ const GUID IID_IKsControl = {0x28F54685L, 0x06FD, 0x11D2, {0xB2, 0x7A, 0x00, 0xA
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(
@@ -53,10 +54,11 @@ 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[] =
{
@@ -73,6 +75,13 @@ KSPROPERTY_SET FilterPropertySet[] =
(const KSPROPERTY_ITEM*)&IKsFilterPinSet,
0,
NULL
},
{
&KSPROPSETID_General,
sizeof(IKsFilterGeneralSet) / sizeof(KSPROPERTY_ITEM),
(const KSPROPERTY_ITEM*)&IKsFilterGeneralSet,
0,
NULL
}
};
@@ -906,6 +915,39 @@ FilterTopologyPropertyHandler(
}
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
@@ -977,6 +1019,7 @@ IKsFilter_DispatchDeviceIoControl(
UNICODE_STRING GuidString;
PKSPROPERTY Property;
ULONG SetCount = 0;
//PKSP_NODE NodeProperty;
/* obtain filter from object header */
Status = IKsFilter_GetFilterFromIrp(Irp, &Filter);
@@ -1024,8 +1067,20 @@ IKsFilter_DispatchDeviceIoControl(
{
const KSPROPERTY_SET *PropertySet = NULL;
ULONG PropertyItemSize = 0;
#if 0
/* check if the driver supports method sets */
if (Property->Flags & KSPROPERTY_TYPE_TOPOLOGY)
{
NodeProperty = (PKSP_NODE)Property;
if (FilterInstance->Descriptor->NodeDescriptors[NodeProperty->NodeId].AutomationTable != NULL)
{
SetCount = FilterInstance->Descriptor->NodeDescriptors[NodeProperty->NodeId].AutomationTable->PropertySetsCount;
PropertySet = FilterInstance->Descriptor->NodeDescriptors[NodeProperty->NodeId].AutomationTable->PropertySets;
PropertyItemSize = 0;
}
} else
#endif
if (FilterInstance->Descriptor->AutomationTable->PropertySetsCount)
{
SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount;
@@ -1267,7 +1322,7 @@ IKsFilter_CopyFilterDescriptor(
/* setup filter property sets */
AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM);
AutomationTable.PropertySetsCount = 2;
AutomationTable.PropertySetsCount = 3;
AutomationTable.PropertySets = FilterPropertySet;
/* merge filter automation table */
+3 -3
View File
@@ -1466,7 +1466,7 @@ KsStreamPointerUnlock(
{
PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer);
DPRINT("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject);
DPRINT1("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject);
Pointer->Irp = NULL;
}
@@ -1483,7 +1483,7 @@ KsStreamPointerAdvanceOffsetsAndUnlock(
IN ULONG OutUsed,
IN BOOLEAN Eject)
{
DPRINT("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject);
DPRINT1("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject);
DbgBreakPoint();
UNIMPLEMENTED
}
@@ -2636,8 +2636,8 @@ KspCreatePin(
{
/* failed to create pin, release resources */
IKsFilter_RemovePin(Filter->lpVtbl->GetStruct(Filter), &This->Pin);
KsFreeObjectHeader((KSOBJECT_HEADER)This->ObjectHeader);
KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag);
KsFreeObjectHeader((KSOBJECT_HEADER)This->ObjectHeader);
FreeItem(This);
/* return failure code */
+5
View File
@@ -33,6 +33,11 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\
DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\
}
#define DEFINE_KSPROPERTY_GENEREAL_COMPONENTID(PinSet,\
PropGeneral)\
DEFINE_KSPROPERTY_TABLE(PinSet) {\
DEFINE_KSPROPERTY_ITEM_GENERAL_COMPONENTID(PropGeneral)\
}
#define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\
PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\
+39 -36
View File
@@ -30,6 +30,8 @@ FindPropertyHandler(
OUT PKSPROPERTY_ITEM *PropertyItem)
{
ULONG Index, ItemIndex;
PULONG Flags;
PKSPROPERTY_DESCRIPTION Description;
for(Index = 0; Index < PropertySetCount; Index++)
{
@@ -39,46 +41,16 @@ FindPropertyHandler(
{
for(ItemIndex = 0; ItemIndex < PropertySet[Index].PropertiesCount; ItemIndex++)
{
/* store property set */
*Set = (PKSPROPERTY_SET)&PropertySet[Index];
*PropertyItem = (PKSPROPERTY_ITEM)&PropertySet[Index].PropertyItem[ItemIndex];
if (PropertySet[Index].PropertyItem[ItemIndex].PropertyId == Property->Id)
{
if (PropertySet[Index].PropertyItem[ItemIndex].MinProperty > InputBufferLength)
{
/* too small input buffer */
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinProperty;
return STATUS_INVALID_PARAMETER;
}
if (PropertySet[Index].PropertyItem[ItemIndex].MinData > OutputBufferLength)
{
/* too small output buffer */
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
return STATUS_MORE_ENTRIES;
}
/* store property set */
*Set = (PKSPROPERTY_SET)&PropertySet[Index];
*PropertyItem = (PKSPROPERTY_ITEM)&PropertySet[Index].PropertyItem[ItemIndex];
if (Property->Flags & KSPROPERTY_TYPE_SET)
{
/* store property handler */
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
return STATUS_SUCCESS;
}
if (Property->Flags & KSPROPERTY_TYPE_GET)
{
/* store property handler */
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
return STATUS_SUCCESS;
}
if (Property->Flags & KSPROPERTY_TYPE_BASICSUPPORT)
{
PULONG Flags;
PKSPROPERTY_DESCRIPTION Description;
if (sizeof(ULONG) > OutputBufferLength)
{
/* too small buffer */
@@ -123,6 +95,37 @@ FindPropertyHandler(
}
return STATUS_SUCCESS;
}
if (PropertySet[Index].PropertyItem[ItemIndex].MinProperty > InputBufferLength)
{
/* too small input buffer */
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinProperty;
return STATUS_INVALID_PARAMETER;
}
if (PropertySet[Index].PropertyItem[ItemIndex].MinData > OutputBufferLength)
{
/* too small output buffer */
IoStatus->Information = PropertySet[Index].PropertyItem[ItemIndex].MinData;
return STATUS_MORE_ENTRIES;
}
if (Property->Flags & KSPROPERTY_TYPE_SET)
{
/* store property handler */
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].SetPropertyHandler;
return STATUS_SUCCESS;
}
if (Property->Flags & KSPROPERTY_TYPE_GET)
{
/* store property handler */
*PropertyHandler = PropertySet[Index].PropertyItem[ItemIndex].GetPropertyHandler;
return STATUS_SUCCESS;
}
}
}
}