From 1ad4db139c43680bd7c13344a7637ad73546f391 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Thu, 23 Jul 2009 00:47:21 +0000 Subject: [PATCH] - Implement KsQueryObjectAccessMask, KsQueryObjectCreateItem - Use KSQUEUE_SPINLOCK_IRP_STORAGE macro for access the stored spin lock svn path=/trunk/; revision=42150 --- reactos/drivers/ksfilter/ks/api.c | 23 +++++++++++++++++------ reactos/drivers/ksfilter/ks/irp.c | 25 ++++++++----------------- reactos/drivers/ksfilter/ks/kstypes.h | 2 ++ 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/reactos/drivers/ksfilter/ks/api.c b/reactos/drivers/ksfilter/ks/api.c index 8a34ac8d008..9c568c3b719 100644 --- a/reactos/drivers/ksfilter/ks/api.c +++ b/reactos/drivers/ksfilter/ks/api.c @@ -245,7 +245,7 @@ KsQueryDevicePnpObject( } /* - @unimplemented + @implemented */ KSDDKAPI ACCESS_MASK @@ -253,8 +253,11 @@ NTAPI KsQueryObjectAccessMask( IN KSOBJECT_HEADER Header) { - UNIMPLEMENTED; - return STATUS_UNSUCCESSFUL; + PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header; + + /* return access mask */ + return ObjectHeader->AccessMask; + } /* @@ -402,7 +405,7 @@ KsSetPowerDispatch( /* - @unimplemented + @implemented */ KSDDKAPI PKSOBJECT_CREATE_ITEM @@ -410,8 +413,8 @@ NTAPI KsQueryObjectCreateItem( IN KSOBJECT_HEADER Header) { - UNIMPLEMENTED; - return NULL; + PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header; + return ObjectHeader->OriginalCreateItem; } NTSTATUS @@ -649,6 +652,13 @@ KsAllocateObjectHeader( /* store parent device */ ObjectHeader->ParentDeviceObject = IoGetRelatedDeviceObject(IoStack->FileObject); + /* store originating create item */ + ObjectHeader->OriginalCreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); + + /* FIXME store access mask see KsQueryObjectAccessMask */ + ObjectHeader->AccessMask = IoStack->Parameters.Create.SecurityContext->DesiredAccess; + + /* store result */ *Header = ObjectHeader; @@ -1145,3 +1155,4 @@ KsCacheMedium( return STATUS_UNSUCCESSFUL; } + diff --git a/reactos/drivers/ksfilter/ks/irp.c b/reactos/drivers/ksfilter/ks/irp.c index 5d5b0a343dd..a4ed7174dc9 100644 --- a/reactos/drivers/ksfilter/ks/irp.c +++ b/reactos/drivers/ksfilter/ks/irp.c @@ -830,10 +830,8 @@ KsReleaseIrpOnCancelableQueue( /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* get internal queue lock - * see KsAddIrpToCancelableQueue - */ - SpinLock = (PKSPIN_LOCK)Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink; + /* get internal queue lock */ + SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp); /* acquire spinlock */ KeAcquireSpinLock(SpinLock, &OldLevel); @@ -993,10 +991,8 @@ KsRemoveSpecificIrpFromCancelableQueue( PKSPIN_LOCK SpinLock; KIRQL OldLevel; - /* get internal queue lock - * see KsAddIrpToCancelableQueue - */ - SpinLock = (PKSPIN_LOCK)Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink; + /* get internal queue lock */ + SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp); /* acquire spinlock */ KeAcquireSpinLock(SpinLock, &OldLevel); @@ -1053,11 +1049,8 @@ KsAddIrpToCancelableQueue( InsertHeadList(QueueHead, &Irp->Tail.Overlay.ListEntry); } - /* store the spinlock in the device queue list entry, - * as other fields may have been internally been used - * used in KsCancelRoutine - */ - Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink = (PLIST_ENTRY)SpinLock; + /* store internal queue lock */ + KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) = SpinLock; /* now set the cancel routine */ OldDriverCancel = IoSetCancelRoutine(Irp, DriverCancel); @@ -1093,10 +1086,8 @@ KsCancelRoutine( PKSPIN_LOCK SpinLock; KIRQL OldLevel; - /* get internal queue lock - * see KsAddIrpToCancelableQueue - */ - SpinLock = (PKSPIN_LOCK)Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink; + /* get internal queue lock */ + SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp); /* acquire spinlock */ KeAcquireSpinLock(SpinLock, &OldLevel); diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 8fdca6d5763..e7583414e80 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -20,6 +20,8 @@ typedef struct PFNKSCONTEXT_DISPATCH PowerDispatch; PVOID PowerContext; LIST_ENTRY PowerDispatchEntry; + PKSOBJECT_CREATE_ITEM OriginalCreateItem; + ACCESS_MASK AccessMask; }KSIOBJECT_HEADER, *PKSIOBJECT_HEADER;