2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/ksfilter/ks/api.c
5 * PURPOSE: KS API functions
6 * PROGRAMMER: Johannes Anderwald
21 OUT KSRESET
* ResetValue
)
24 return STATUS_UNSUCCESSFUL
;
33 KsAcquireDeviceSecurityLock(
34 IN KSDEVICE_HEADER DevHeader
,
38 PKSIDEVICE_HEADER Header
= (PKSIDEVICE_HEADER
)DevHeader
;
40 KeEnterCriticalRegion();
44 Status
= ExAcquireResourceExclusiveLite(&Header
->SecurityLock
, TRUE
);
48 Status
= ExAcquireResourceSharedLite(&Header
->SecurityLock
, TRUE
);
58 KsReleaseDeviceSecurityLock(
59 IN KSDEVICE_HEADER DevHeader
)
61 PKSIDEVICE_HEADER Header
= (PKSIDEVICE_HEADER
)DevHeader
;
63 ExReleaseResourceLite(&Header
->SecurityLock
);
64 KeLeaveCriticalRegion();
74 IN PDEVICE_OBJECT DeviceObject
,
77 PDEVICE_EXTENSION DeviceExtension
;
78 PKSIDEVICE_HEADER DeviceHeader
;
79 PIO_STACK_LOCATION IoStack
;
80 PDEVICE_OBJECT PnpDeviceObject
;
84 /* get current irp stack */
85 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
87 /* caller wants to add the target device */
88 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
90 /* get device header */
91 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
93 /* backup PnpBaseObject */
94 PnpDeviceObject
= DeviceHeader
->PnpDeviceObject
;
97 /* backup minor function code */
98 MinorFunction
= IoStack
->MinorFunction
;
100 if(MinorFunction
== IRP_MN_REMOVE_DEVICE
)
102 /* remove the device */
103 KsFreeDeviceHeader((KSDEVICE_HEADER
)DeviceHeader
);
106 /* skip current irp stack */
107 IoSkipCurrentIrpStackLocation(Irp
);
109 /* call attached pnp device object */
110 Status
= IoCallDriver(PnpDeviceObject
, Irp
);
112 if (MinorFunction
== IRP_MN_REMOVE_DEVICE
)
115 IoDetachDevice(PnpDeviceObject
);
117 IoDeleteDevice(DeviceObject
);
129 KsDefaultDispatchPower(
130 IN PDEVICE_OBJECT DeviceObject
,
133 PDEVICE_EXTENSION DeviceExtension
;
134 PKSIDEVICE_HEADER DeviceHeader
;
135 PKSIOBJECT_HEADER ObjectHeader
;
136 PIO_STACK_LOCATION IoStack
;
137 PLIST_ENTRY ListEntry
;
140 /* get current irp stack */
141 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
143 /* caller wants to add the target device */
144 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
146 /* get device header */
147 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
151 /* loop our power dispatch list and call registered notification functions */
152 ListEntry
= DeviceHeader
->PowerDispatchList
.Flink
;
154 while(ListEntry
!= &DeviceHeader
->PowerDispatchList
)
156 /* get object header */
157 ObjectHeader
= (PKSIOBJECT_HEADER
)CONTAINING_RECORD(ListEntry
, KSIOBJECT_HEADER
, PowerDispatchEntry
);
159 /* does it have still a cb */
160 if (ObjectHeader
->PowerDispatch
)
162 /* call the power cb */
163 Status
= ObjectHeader
->PowerDispatch(ObjectHeader
->PowerContext
, Irp
);
164 ASSERT(NT_SUCCESS(Status
));
167 /* iterate to next entry */
168 ListEntry
= ListEntry
->Flink
;
171 /* start next power irp */
172 PoStartNextPowerIrp(Irp
);
174 /* skip current irp stack location */
175 IoSkipCurrentIrpStackLocation(Irp
);
178 Status
= PoCallDriver(DeviceHeader
->PnpDeviceObject
, Irp
);
191 IN PDEVICE_OBJECT DeviceObject
,
194 PDEVICE_EXTENSION DeviceExtension
;
195 PKSIDEVICE_HEADER DeviceHeader
;
196 PIO_STACK_LOCATION IoStack
;
199 /* get current irp stack */
200 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
202 /* caller wants to add the target device */
203 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
205 /* get device header */
206 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
208 /* forward the request to the PDO */
209 Status
= IoCallDriver(DeviceHeader
->PnpDeviceObject
, Irp
);
220 KsSetDevicePnpAndBaseObject(
221 IN KSDEVICE_HEADER Header
,
222 IN PDEVICE_OBJECT PnpDeviceObject
,
223 IN PDEVICE_OBJECT BaseDevice
)
225 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)Header
;
227 DeviceHeader
->PnpDeviceObject
= PnpDeviceObject
;
228 DeviceHeader
->BaseDevice
= BaseDevice
;
237 KsQueryDevicePnpObject(
238 IN KSDEVICE_HEADER Header
)
240 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)Header
;
242 /* return PnpDeviceObject */
243 return DeviceHeader
->PnpDeviceObject
;
253 KsQueryObjectAccessMask(
254 IN KSOBJECT_HEADER Header
)
257 return STATUS_UNSUCCESSFUL
;
266 KsRecalculateStackDepth(
267 IN KSDEVICE_HEADER Header
,
268 IN BOOLEAN ReuseStackLocation
)
281 IN KSOBJECT_HEADER Header
,
282 IN KSTARGET_STATE TargetState
)
284 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)Header
;
286 /* set target state */
287 DeviceHeader
->TargetState
= TargetState
;
296 KsSetTargetDeviceObject(
297 IN KSOBJECT_HEADER Header
,
298 IN PDEVICE_OBJECT TargetDevice OPTIONAL
)
300 PDEVICE_EXTENSION DeviceExtension
;
301 PKSIDEVICE_HEADER DeviceHeader
;
302 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
)Header
;
304 if(ObjectHeader
->TargetDevice
)
306 /* there is already a target device set */
309 /* caller wants to remove the target device */
310 DeviceExtension
= (PDEVICE_EXTENSION
)ObjectHeader
->TargetDevice
->DeviceExtension
;
312 /* get device header */
313 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
316 KsAcquireDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
, FALSE
);
319 RemoveEntryList(&ObjectHeader
->TargetDeviceListEntry
);
321 /* remove device pointer */
322 ObjectHeader
->TargetDevice
= NULL
;
325 KsReleaseDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
);
330 /* no target device yet set */
333 /* caller wants to add the target device */
334 DeviceExtension
= (PDEVICE_EXTENSION
)TargetDevice
->DeviceExtension
;
336 /* get device header */
337 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
340 KsAcquireDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
, FALSE
);
342 /* insert list entry */
343 InsertTailList(&DeviceHeader
->TargetDeviceList
, &ObjectHeader
->TargetDeviceListEntry
);
345 /* store target device */
346 ObjectHeader
->TargetDevice
= TargetDevice
;
349 KsReleaseDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
);
362 IN KSOBJECT_HEADER Header
,
363 IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL
,
364 IN PVOID PowerContext OPTIONAL
)
366 PDEVICE_EXTENSION DeviceExtension
;
367 PKSIDEVICE_HEADER DeviceHeader
;
368 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
)Header
;
370 /* caller wants to add the target device */
371 DeviceExtension
= (PDEVICE_EXTENSION
)ObjectHeader
->ParentDeviceObject
->DeviceExtension
;
373 /* get device header */
374 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
377 KsAcquireDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
, FALSE
);
381 /* add power dispatch entry */
382 InsertTailList(&DeviceHeader
->PowerDispatchList
, &ObjectHeader
->PowerDispatchEntry
);
384 /* store function and context */
385 ObjectHeader
->PowerDispatch
= PowerDispatch
;
386 ObjectHeader
->PowerContext
= PowerContext
;
390 /* remove power dispatch entry */
391 RemoveEntryList(&ObjectHeader
->PowerDispatchEntry
);
393 /* store function and context */
394 ObjectHeader
->PowerDispatch
= NULL
;
395 ObjectHeader
->PowerContext
= NULL
;
400 KsReleaseDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
);
408 PKSOBJECT_CREATE_ITEM
410 KsQueryObjectCreateItem(
411 IN KSOBJECT_HEADER Header
)
423 KsAllocateDeviceHeader(
424 OUT KSDEVICE_HEADER
* OutHeader
,
426 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
)
429 PKSIDEVICE_HEADER Header
;
432 return STATUS_INVALID_PARAMETER
;
434 /* allocate a device header */
435 Header
= ExAllocatePoolWithTag(PagedPool
, sizeof(KSIDEVICE_HEADER
), TAG_DEVICE_HEADER
);
437 /* check for success */
439 return STATUS_INSUFFICIENT_RESOURCES
;
441 /* clear all memory */
442 RtlZeroMemory(Header
, sizeof(KSIDEVICE_HEADER
));
444 /* initialize spin lock */
445 KeInitializeSpinLock(&Header
->ItemListLock
); //FIXME
447 /* initialize device mutex */
448 KeInitializeMutex(&Header
->DeviceMutex
, 0);
450 /* initialize target device list */
451 InitializeListHead(&Header
->TargetDeviceList
);
452 /* initialize power dispatch list */
453 InitializeListHead(&Header
->PowerDispatchList
);
455 /* are there any create items provided */
456 if (ItemsCount
&& ItemsList
)
458 /* allocate space for device item list */
459 Header
->ItemList
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(DEVICE_ITEM
) * ItemsCount
, TAG_DEVICE_HEADER
);
460 if (!Header
->ItemList
)
462 ExFreePoolWithTag(Header
, TAG_DEVICE_HEADER
);
463 return STATUS_INSUFFICIENT_RESOURCES
;
465 RtlZeroMemory(Header
->ItemList
, sizeof(DEVICE_ITEM
) * ItemsCount
);
467 for(Index
= 0; Index
< ItemsCount
; Index
++)
469 /* store provided create items */
470 Header
->ItemList
[Index
].CreateItem
= &ItemsList
[Index
];
472 Header
->MaxItems
= ItemsCount
;
478 return STATUS_SUCCESS
;
488 IN KSDEVICE_HEADER DevHeader
)
490 PKSIDEVICE_HEADER Header
;
492 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
497 ExFreePoolWithTag(Header
->ItemList
, TAG_DEVICE_HEADER
);
498 ExFreePoolWithTag(Header
, TAG_DEVICE_HEADER
);
507 KsAllocateObjectHeader(
508 OUT KSOBJECT_HEADER
*Header
,
510 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
,
512 IN KSDISPATCH_TABLE
* Table
)
514 PIO_STACK_LOCATION IoStack
;
515 PDEVICE_EXTENSION DeviceExtension
;
516 PKSIDEVICE_HEADER DeviceHeader
;
517 PKSIOBJECT_HEADER ObjectHeader
;
520 return STATUS_INVALID_PARAMETER_1
;
523 return STATUS_INVALID_PARAMETER_4
;
526 return STATUS_INVALID_PARAMETER_5
;
528 /* get current stack location */
529 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
530 /* get device extension */
531 DeviceExtension
= (PDEVICE_EXTENSION
)IoStack
->DeviceObject
->DeviceExtension
;
532 /* get device header */
533 DeviceHeader
= DeviceExtension
->DeviceHeader
;
536 ASSERT(IoStack
->FileObject
);
537 /* check for an file object */
539 /* allocate the object header */
540 ObjectHeader
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(KSIOBJECT_HEADER
), TAG_DEVICE_HEADER
);
542 return STATUS_INSUFFICIENT_RESOURCES
;
544 /* initialize object header */
545 RtlZeroMemory(ObjectHeader
, sizeof(KSIOBJECT_HEADER
));
547 /* do we have a name */
548 if (IoStack
->FileObject
->FileName
.Buffer
)
550 /* copy object class */
551 ObjectHeader
->ObjectClass
.MaximumLength
= IoStack
->FileObject
->FileName
.MaximumLength
;
552 ObjectHeader
->ObjectClass
.Buffer
= ExAllocatePoolWithTag(NonPagedPool
, ObjectHeader
->ObjectClass
.MaximumLength
, TAG_DEVICE_HEADER
);
553 if (!ObjectHeader
->ObjectClass
.Buffer
)
555 ExFreePoolWithTag(ObjectHeader
, TAG_DEVICE_HEADER
);
556 return STATUS_INSUFFICIENT_RESOURCES
;
558 RtlCopyUnicodeString(&ObjectHeader
->ObjectClass
, &IoStack
->FileObject
->FileName
);
561 /* copy dispatch table */
562 RtlCopyMemory(&ObjectHeader
->DispatchTable
, Table
, sizeof(KSDISPATCH_TABLE
));
563 /* store create items */
564 if (ItemsCount
&& ItemsList
)
566 ObjectHeader
->ItemCount
= ItemsCount
;
567 ObjectHeader
->CreateItem
= ItemsList
;
570 /* store the object in the file object */
571 ASSERT(IoStack
->FileObject
->FsContext
== NULL
);
572 IoStack
->FileObject
->FsContext
= ObjectHeader
;
574 /* the object header is for a audio filter */
575 ASSERT(DeviceHeader
->DeviceIndex
< DeviceHeader
->MaxItems
);
577 /* store parent device */
578 ObjectHeader
->ParentDeviceObject
= IoGetRelatedDeviceObject(IoStack
->FileObject
);
581 *Header
= ObjectHeader
;
585 DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectHeader
->ObjectClass
.Buffer
, IoStack
->FileObject
, ObjectHeader
);
587 return STATUS_SUCCESS
;
600 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
) Header
;
602 if (ObjectHeader
->ObjectClass
.Buffer
)
604 /* release object class buffer */
605 ExFreePoolWithTag(ObjectHeader
->ObjectClass
.Buffer
, TAG_DEVICE_HEADER
);
608 if (ObjectHeader
->Unknown
)
610 /* release associated object */
611 ObjectHeader
->Unknown
->lpVtbl
->Release(ObjectHeader
->Unknown
);
614 /* FIXME free create items */
616 /* free object header */
617 ExFreePoolWithTag(ObjectHeader
, TAG_DEVICE_HEADER
);
627 KsAddObjectCreateItemToDeviceHeader(
628 IN KSDEVICE_HEADER DevHeader
,
629 IN PDRIVER_DISPATCH Create
,
631 IN PWCHAR ObjectClass
,
632 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
634 PKSIDEVICE_HEADER Header
;
635 ULONG FreeIndex
, Index
;
637 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
639 DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
641 /* check if a device header has been provided */
643 return STATUS_INVALID_PARAMETER_1
;
645 /* check if a create item has been provided */
647 return STATUS_INVALID_PARAMETER_2
;
649 /* check if a object class has been provided */
651 return STATUS_INVALID_PARAMETER_4
;
653 FreeIndex
= (ULONG
)-1;
654 /* now scan the list and check for a free item */
655 for(Index
= 0; Index
< Header
->MaxItems
; Index
++)
657 ASSERT(Header
->ItemList
[Index
].CreateItem
);
659 if (Header
->ItemList
[Index
].CreateItem
->Create
== NULL
)
665 if (!wcsicmp(ObjectClass
, Header
->ItemList
[Index
].CreateItem
->ObjectClass
.Buffer
))
667 /* the same object class already exists */
668 return STATUS_OBJECT_NAME_COLLISION
;
671 /* found a free index */
672 if (FreeIndex
== (ULONG
)-1)
674 /* no empty space found */
675 return STATUS_ALLOTTED_SPACE_EXCEEDED
;
678 /* initialize create item */
679 Header
->ItemList
[FreeIndex
].CreateItem
->Create
= Create
;
680 Header
->ItemList
[FreeIndex
].CreateItem
->Context
= Context
;
681 RtlInitUnicodeString(&Header
->ItemList
[FreeIndex
].CreateItem
->ObjectClass
, ObjectClass
);
682 Header
->ItemList
[FreeIndex
].CreateItem
->SecurityDescriptor
= SecurityDescriptor
;
685 return STATUS_SUCCESS
;
694 KsAddObjectCreateItemToObjectHeader(
695 IN KSOBJECT_HEADER Header
,
696 IN PDRIVER_DISPATCH Create
,
698 IN PWCHAR ObjectClass
,
699 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
702 return STATUS_UNSUCCESSFUL
;
711 KsAllocateObjectCreateItem(
712 IN KSDEVICE_HEADER DevHeader
,
713 IN PKSOBJECT_CREATE_ITEM CreateItem
,
714 IN BOOLEAN AllocateEntry
,
715 IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
)
717 PKSIDEVICE_HEADER Header
;
718 PKSOBJECT_CREATE_ITEM Item
;
719 PDEVICE_ITEM ItemList
;
722 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
725 return STATUS_INVALID_PARAMETER_1
;
728 return STATUS_INVALID_PARAMETER_2
;
730 /* acquire list lock */
731 KeAcquireSpinLock(&Header
->ItemListLock
, &OldLevel
);
733 ItemList
= ExAllocatePool(NonPagedPool
, sizeof(DEVICE_ITEM
) * (Header
->MaxItems
+ 1));
736 return STATUS_INSUFFICIENT_RESOURCES
;
741 if (!ItemFreeCallback
)
743 /* caller must be notified */
744 ExFreePool(ItemList
);
746 KeReleaseSpinLock(&Header
->ItemListLock
, OldLevel
);
748 return STATUS_INVALID_PARAMETER_4
;
750 /* allocate create item */
751 Item
= ExAllocatePool(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
755 ExFreePool(ItemList
);
757 KeReleaseSpinLock(&Header
->ItemListLock
, OldLevel
);
759 return STATUS_INSUFFICIENT_RESOURCES
;
762 /* initialize descriptor */
763 Item
->Context
= CreateItem
->Context
;
764 Item
->Create
= CreateItem
->Create
;
765 Item
->Flags
= CreateItem
->Flags
;
766 Item
->SecurityDescriptor
= CreateItem
->SecurityDescriptor
;
767 Item
->ObjectClass
.Length
= 0;
768 Item
->ObjectClass
.MaximumLength
= CreateItem
->ObjectClass
.MaximumLength
;
770 /* copy object class */
771 Item
->ObjectClass
.Buffer
= ExAllocatePool(NonPagedPool
, Item
->ObjectClass
.MaximumLength
);
772 if (!Item
->ObjectClass
.Buffer
)
774 /* release resources */
776 ExFreePool(ItemList
);
779 KeReleaseSpinLock(&Header
->ItemListLock
, OldLevel
);
781 return STATUS_INSUFFICIENT_RESOURCES
;
784 RtlCopyUnicodeString(&Item
->ObjectClass
, &CreateItem
->ObjectClass
);
788 if (ItemFreeCallback
)
790 /* callback is only accepted when the create item is copied */
791 ExFreePool(ItemList
);
793 KeReleaseSpinLock(&Header
->ItemListLock
, OldLevel
);
795 return STATUS_INVALID_PARAMETER_4
;
802 if (Header
->MaxItems
)
804 /* copy old create items */
805 RtlMoveMemory(ItemList
, Header
->ItemList
, sizeof(DEVICE_ITEM
) * Header
->MaxItems
);
808 /* initialize item entry */
809 ItemList
[Header
->MaxItems
].CreateItem
= Item
;
810 ItemList
[Header
->MaxItems
].ItemFreeCallback
= ItemFreeCallback
;
813 /* free old item list */
814 ExFreePool(Header
->ItemList
);
816 Header
->ItemList
= ItemList
;
820 KeReleaseSpinLock(&Header
->ItemListLock
, OldLevel
);
822 return STATUS_SUCCESS
;
827 KspObjectFreeCreateItems(
828 IN KSDEVICE_HEADER Header
,
829 IN PKSOBJECT_CREATE_ITEM CreateItem
)
832 return STATUS_NOT_IMPLEMENTED
;
841 KsFreeObjectCreateItem(
842 IN KSDEVICE_HEADER Header
,
843 IN PUNICODE_STRING CreateItem
)
845 KSOBJECT_CREATE_ITEM Item
;
847 RtlZeroMemory(&Item
, sizeof(KSOBJECT_CREATE_ITEM
));
848 RtlInitUnicodeString(&Item
.ObjectClass
, CreateItem
->Buffer
);
850 return KspObjectFreeCreateItems(Header
, &Item
);
860 KsFreeObjectCreateItemsByContext(
861 IN KSDEVICE_HEADER Header
,
864 KSOBJECT_CREATE_ITEM Item
;
866 RtlZeroMemory(&Item
, sizeof(KSOBJECT_CREATE_ITEM
));
868 Item
.Context
= Context
;
870 return KspObjectFreeCreateItems(Header
, &Item
);
879 KsCreateDefaultSecurity(
880 IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL
,
881 OUT PSECURITY_DESCRIPTOR
* DefaultSecurity
)
883 PGENERIC_MAPPING Mapping
;
884 SECURITY_SUBJECT_CONTEXT SubjectContext
;
887 /* start capturing security context of calling thread */
888 SeCaptureSubjectContext(&SubjectContext
);
889 /* get generic mapping */
890 Mapping
= IoGetFileObjectGenericMapping();
891 /* build new descriptor */
892 Status
= SeAssignSecurity(ParentSecurity
, NULL
, DefaultSecurity
, FALSE
, &SubjectContext
, Mapping
, NonPagedPool
);
893 /* release security descriptor */
894 SeReleaseSubjectContext(&SubjectContext
);
907 IN PFILE_OBJECT FileObject
,
908 IN BOOLEAN ReuseStackLocation
)
911 return STATUS_UNSUCCESSFUL
;
921 KsForwardAndCatchIrp(
922 IN PDEVICE_OBJECT DeviceObject
,
924 IN PFILE_OBJECT FileObject
,
925 IN KSSTACK_USE StackUse
)
928 return STATUS_UNSUCCESSFUL
;
934 KspSynchronousIoControlDeviceCompletion(
935 IN PDEVICE_OBJECT DeviceObject
,
939 PIO_STATUS_BLOCK IoStatusBlock
= (PIO_STATUS_BLOCK
)Context
;
941 IoStatusBlock
->Information
= Irp
->IoStatus
.Information
;
942 IoStatusBlock
->Status
= Irp
->IoStatus
.Status
;
944 return STATUS_SUCCESS
;
953 KsSynchronousIoControlDevice(
954 IN PFILE_OBJECT FileObject
,
955 IN KPROCESSOR_MODE RequestorMode
,
961 OUT PULONG BytesReturned
)
963 PKSIOBJECT_HEADER ObjectHeader
;
964 PDEVICE_OBJECT DeviceObject
;
967 IO_STATUS_BLOCK IoStatusBlock
;
968 PIO_STACK_LOCATION IoStack
;
971 /* check for valid file object */
973 return STATUS_INVALID_PARAMETER
;
975 /* get device object to send the request to */
976 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
978 return STATUS_UNSUCCESSFUL
;
981 /* get object header */
982 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext
;
984 /* check if there is fast device io function */
985 if (ObjectHeader
&& ObjectHeader
->DispatchTable
.FastDeviceIoControl
)
987 IoStatusBlock
.Status
= STATUS_UNSUCCESSFUL
;
988 IoStatusBlock
.Information
= 0;
990 /* it is send the request */
991 Status
= ObjectHeader
->DispatchTable
.FastDeviceIoControl(FileObject
, TRUE
, InBuffer
, InSize
, OutBuffer
, OutSize
, IoControl
, &IoStatusBlock
, DeviceObject
);
992 /* check if the request was handled */
993 DPRINT("Handled %u Status %x Length %u\n", Status
, IoStatusBlock
.Status
, IoStatusBlock
.Information
);
996 /* store bytes returned */
997 *BytesReturned
= IoStatusBlock
.Information
;
999 return IoStatusBlock
.Status
;
1003 /* initialize the event */
1004 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
1006 /* create the irp */
1007 Irp
= IoBuildDeviceIoControlRequest(IoControl
, DeviceObject
, InBuffer
, InSize
, OutBuffer
, OutSize
, FALSE
, &Event
, &IoStatusBlock
);
1010 IoStack
= IoGetNextIrpStackLocation(Irp
);
1011 IoStack
->FileObject
= FileObject
;
1013 IoSetCompletionRoutine(Irp
, KspSynchronousIoControlDeviceCompletion
, (PVOID
)&IoStatusBlock
, TRUE
, TRUE
, TRUE
);
1015 Status
= IoCallDriver(DeviceObject
, Irp
);
1016 if (Status
== STATUS_PENDING
)
1018 KeWaitForSingleObject(&Event
, Executive
, RequestorMode
, FALSE
, NULL
);
1019 Status
= IoStatusBlock
.Status
;
1022 *BytesReturned
= IoStatusBlock
.Information
;
1032 KsUnserializeObjectPropertiesFromRegistry(
1033 IN PFILE_OBJECT FileObject
,
1034 IN HANDLE ParentKey OPTIONAL
,
1035 IN PUNICODE_STRING RegistryPath OPTIONAL
)
1038 return STATUS_NOT_IMPLEMENTED
;
1049 IN PUNICODE_STRING SymbolicLink
,
1050 IN PKSPIN_MEDIUM Medium
,
1051 IN ULONG PinDirection
)
1054 return STATUS_UNSUCCESSFUL
;