- Implement KsQueryObjectAccessMask, KsQueryObjectCreateItem

- Use KSQUEUE_SPINLOCK_IRP_STORAGE macro for access the stored spin lock

svn path=/trunk/; revision=42150
This commit is contained in:
Johannes Anderwald 2009-07-23 00:47:21 +00:00
parent db1215455b
commit 1ad4db139c
3 changed files with 27 additions and 23 deletions

View file

@ -245,7 +245,7 @@ KsQueryDevicePnpObject(
} }
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
ACCESS_MASK ACCESS_MASK
@ -253,8 +253,11 @@ NTAPI
KsQueryObjectAccessMask( KsQueryObjectAccessMask(
IN KSOBJECT_HEADER Header) IN KSOBJECT_HEADER Header)
{ {
UNIMPLEMENTED; PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
return STATUS_UNSUCCESSFUL;
/* return access mask */
return ObjectHeader->AccessMask;
} }
/* /*
@ -402,7 +405,7 @@ KsSetPowerDispatch(
/* /*
@unimplemented @implemented
*/ */
KSDDKAPI KSDDKAPI
PKSOBJECT_CREATE_ITEM PKSOBJECT_CREATE_ITEM
@ -410,8 +413,8 @@ NTAPI
KsQueryObjectCreateItem( KsQueryObjectCreateItem(
IN KSOBJECT_HEADER Header) IN KSOBJECT_HEADER Header)
{ {
UNIMPLEMENTED; PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
return NULL; return ObjectHeader->OriginalCreateItem;
} }
NTSTATUS NTSTATUS
@ -649,6 +652,13 @@ KsAllocateObjectHeader(
/* store parent device */ /* store parent device */
ObjectHeader->ParentDeviceObject = IoGetRelatedDeviceObject(IoStack->FileObject); 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 */ /* store result */
*Header = ObjectHeader; *Header = ObjectHeader;
@ -1145,3 +1155,4 @@ KsCacheMedium(
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }

View file

@ -830,10 +830,8 @@ KsReleaseIrpOnCancelableQueue(
/* get current irp stack */ /* get current irp stack */
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
/* get internal queue lock /* get internal queue lock */
* see KsAddIrpToCancelableQueue SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
*/
SpinLock = (PKSPIN_LOCK)Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink;
/* acquire spinlock */ /* acquire spinlock */
KeAcquireSpinLock(SpinLock, &OldLevel); KeAcquireSpinLock(SpinLock, &OldLevel);
@ -993,10 +991,8 @@ KsRemoveSpecificIrpFromCancelableQueue(
PKSPIN_LOCK SpinLock; PKSPIN_LOCK SpinLock;
KIRQL OldLevel; KIRQL OldLevel;
/* get internal queue lock /* get internal queue lock */
* see KsAddIrpToCancelableQueue SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
*/
SpinLock = (PKSPIN_LOCK)Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink;
/* acquire spinlock */ /* acquire spinlock */
KeAcquireSpinLock(SpinLock, &OldLevel); KeAcquireSpinLock(SpinLock, &OldLevel);
@ -1053,11 +1049,8 @@ KsAddIrpToCancelableQueue(
InsertHeadList(QueueHead, &Irp->Tail.Overlay.ListEntry); InsertHeadList(QueueHead, &Irp->Tail.Overlay.ListEntry);
} }
/* store the spinlock in the device queue list entry, /* store internal queue lock */
* as other fields may have been internally been used KSQUEUE_SPINLOCK_IRP_STORAGE(Irp) = SpinLock;
* used in KsCancelRoutine
*/
Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink = (PLIST_ENTRY)SpinLock;
/* now set the cancel routine */ /* now set the cancel routine */
OldDriverCancel = IoSetCancelRoutine(Irp, DriverCancel); OldDriverCancel = IoSetCancelRoutine(Irp, DriverCancel);
@ -1093,10 +1086,8 @@ KsCancelRoutine(
PKSPIN_LOCK SpinLock; PKSPIN_LOCK SpinLock;
KIRQL OldLevel; KIRQL OldLevel;
/* get internal queue lock /* get internal queue lock */
* see KsAddIrpToCancelableQueue SpinLock = KSQUEUE_SPINLOCK_IRP_STORAGE(Irp);
*/
SpinLock = (PKSPIN_LOCK)Irp->Tail.Overlay.DeviceQueueEntry.DeviceListEntry.Flink;
/* acquire spinlock */ /* acquire spinlock */
KeAcquireSpinLock(SpinLock, &OldLevel); KeAcquireSpinLock(SpinLock, &OldLevel);

View file

@ -20,6 +20,8 @@ typedef struct
PFNKSCONTEXT_DISPATCH PowerDispatch; PFNKSCONTEXT_DISPATCH PowerDispatch;
PVOID PowerContext; PVOID PowerContext;
LIST_ENTRY PowerDispatchEntry; LIST_ENTRY PowerDispatchEntry;
PKSOBJECT_CREATE_ITEM OriginalCreateItem;
ACCESS_MASK AccessMask;
}KSIOBJECT_HEADER, *PKSIOBJECT_HEADER; }KSIOBJECT_HEADER, *PKSIOBJECT_HEADER;