mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-29 12:23:30 +00:00
[KS]
- implement support for KSPROPSETID_General svn path=/trunk/; revision=72999
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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)\
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user