- Implement KsQueryObjectAccessMask, KsQueryObjectCreateItem
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 23 Jul 2009 00:47:21 +0000 (00:47 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 23 Jul 2009 00:47:21 +0000 (00:47 +0000)
- Use KSQUEUE_SPINLOCK_IRP_STORAGE macro for access the stored spin lock

svn path=/trunk/; revision=42150

reactos/drivers/ksfilter/ks/api.c
reactos/drivers/ksfilter/ks/irp.c
reactos/drivers/ksfilter/ks/kstypes.h

index 8a34ac8..9c568c3 100644 (file)
@@ -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;
 }
 
+
index 5d5b0a3..a4ed717 100644 (file)
@@ -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);
index 8fdca6d..e758341 100644 (file)
@@ -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;