diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 2e1713f3b72..ceee766c1c6 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -513,6 +513,11 @@ KsAllocateDeviceHeader( /* initialize create item list */ InitializeListHead(&Header->ItemList); + /* initialize basic header */ + Header->BasicHeader.Type = KsObjectTypeDevice; + Header->BasicHeader.KsDevice = &Header->KsDevice; + Header->BasicHeader.Parent.KsDevice = &Header->KsDevice; + /* are there any create items provided */ if (ItemsCount && ItemsList) { diff --git a/reactos/drivers/ksfilter/ks/device.c b/reactos/drivers/ksfilter/ks/device.c index fd8adb5c4b8..1ae81a651c6 100644 --- a/reactos/drivers/ksfilter/ks/device.c +++ b/reactos/drivers/ksfilter/ks/device.c @@ -653,7 +653,6 @@ KsInitializeDevice( KsSetDevicePnpAndBaseObject(Header, PhysicalDeviceObject, NextDeviceObject); /* initialize IKsDevice interface */ Header->lpVtblIKsDevice = &vt_IKsDevice; - Header->Type = KsObjectTypeDevice; Header->ref = 1; /* FIXME Power state */ diff --git a/reactos/drivers/ksfilter/ks/filter.c b/reactos/drivers/ksfilter/ks/filter.c index 2cb42a737f0..5b86c3cc6e8 100644 --- a/reactos/drivers/ksfilter/ks/filter.c +++ b/reactos/drivers/ksfilter/ks/filter.c @@ -865,6 +865,7 @@ KspCreateFilter( This->FilterFactory = iface; This->FileObject = IoStack->FileObject; This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; + This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface); This->Header.Type = KsObjectTypeFilter; /* allocate the stream descriptors */ @@ -919,6 +920,7 @@ KspCreateFilter( This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->ObjectHeader->Type = KsObjectTypeFilter; This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl; + This->ObjectHeader->ObjectType = (PVOID)&This->Filter; /* completed initialization */ diff --git a/reactos/drivers/ksfilter/ks/filterfactory.c b/reactos/drivers/ksfilter/ks/filterfactory.c index 91c86e9e332..24a48343911 100644 --- a/reactos/drivers/ksfilter/ks/filterfactory.c +++ b/reactos/drivers/ksfilter/ks/filterfactory.c @@ -185,6 +185,7 @@ IKsFilterFactory_fnInitialize( This->FilterFactory.FilterDescriptor = Descriptor; This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->Header.Type = KsObjectTypeFilterFactory; + This->Header.Parent.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->DeviceHeader = DeviceExtension->DeviceHeader; InitializeListHead(&This->SymbolicLinkList); diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index f8935906a47..faba9f84cfb 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -28,6 +28,7 @@ typedef struct UNICODE_STRING ObjectClass; PUNKNOWN Unknown; + PVOID ObjectType; PDEVICE_OBJECT TargetDevice; LIST_ENTRY TargetDeviceListEntry; @@ -55,11 +56,17 @@ typedef struct { KSOBJECTTYPE Type; PKSDEVICE KsDevice; + union + { + PKSDEVICE KsDevice; + PKSFILTERFACTORY KsFilterFactory; + PKSFILTER KsFilter; + }Parent; }KSBASIC_HEADER, *PKSBASIC_HEADER; typedef struct { - KSOBJECTTYPE Type; + KSBASIC_HEADER BasicHeader; KSDEVICE KsDevice; IKsDeviceVtbl *lpVtblIKsDevice; diff --git a/reactos/drivers/ksfilter/ks/misc.c b/reactos/drivers/ksfilter/ks/misc.c index b7af2bc67b2..14f78c03de3 100644 --- a/reactos/drivers/ksfilter/ks/misc.c +++ b/reactos/drivers/ksfilter/ks/misc.c @@ -140,7 +140,7 @@ KspCopyCreateRequest( } /* - @unimplemented + @implemented */ KSDDKAPI PVOID @@ -148,12 +148,17 @@ NTAPI KsGetObjectFromFileObject( IN PFILE_OBJECT FileObject) { - UNIMPLEMENTED - return NULL; + PKSIOBJECT_HEADER ObjectHeader; + + /* get object header */ + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + + /* return associated object */ + return ObjectHeader->ObjectType; } /* - @unimplemented + @implemented */ KSDDKAPI KSOBJECTTYPE @@ -161,20 +166,31 @@ NTAPI KsGetObjectTypeFromFileObject( IN PFILE_OBJECT FileObject) { - UNIMPLEMENTED - return (KSOBJECTTYPE)-1; + PKSIOBJECT_HEADER ObjectHeader; + + /* get object header */ + ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext; + /* return type */ + return ObjectHeader->Type; } /* - @unimplemented + @implemented */ KSOBJECTTYPE NTAPI KsGetObjectTypeFromIrp( IN PIRP Irp) { - UNIMPLEMENTED - return (KSOBJECTTYPE)-1; + PKSIOBJECT_HEADER ObjectHeader; + PIO_STACK_LOCATION IoStack; + + /* get current irp stack */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + /* get object header */ + ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext; + /* return type */ + return ObjectHeader->Type; } /* @@ -191,7 +207,7 @@ KsGetOuterUnknown( } /* - @unimplemented + @implemented */ KSDDKAPI PVOID @@ -199,8 +215,11 @@ NTAPI KsGetParent( IN PVOID Object) { - UNIMPLEMENTED - return NULL; + PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); + /* sanity check */ + ASSERT(BasicHeader->Parent.KsDevice != NULL); + /* return object type */ + return (PVOID)BasicHeader->Parent.KsDevice; }