- 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
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;
}

View 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);

View 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;