}
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI
ACCESS_MASK
KsQueryObjectAccessMask(
IN KSOBJECT_HEADER Header)
{
- UNIMPLEMENTED;
- return STATUS_UNSUCCESSFUL;
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
+
+ /* return access mask */
+ return ObjectHeader->AccessMask;
+
}
/*
/*
- @unimplemented
+ @implemented
*/
KSDDKAPI
PKSOBJECT_CREATE_ITEM
KsQueryObjectCreateItem(
IN KSOBJECT_HEADER Header)
{
- UNIMPLEMENTED;
- return NULL;
+ PKSIOBJECT_HEADER ObjectHeader = (PKSIOBJECT_HEADER)Header;
+ return ObjectHeader->OriginalCreateItem;
}
NTSTATUS
/* 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;
return STATUS_UNSUCCESSFUL;
}
+
/* 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);
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);
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);
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);