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
20 OUT KSRESET
* ResetValue
)
22 PIO_STACK_LOCATION IoStack
;
24 NTSTATUS Status
= STATUS_SUCCESS
;
26 /* get current irp stack */
27 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
29 /* check if there is reset value provided */
30 if (IoStack
->Parameters
.DeviceIoControl
.InputBufferLength
< sizeof(KSRESET
))
31 return STATUS_INVALID_PARAMETER
;
33 if (Irp
->RequestorMode
== UserMode
)
35 /* need to probe the buffer */
38 ProbeForRead(IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
, sizeof(KSRESET
), sizeof(UCHAR
));
39 Value
= (KSRESET
*)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
42 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
44 /* Exception, get the error code */
45 Status
= _SEH2_GetExceptionCode();
51 Value
= (KSRESET
*)IoStack
->Parameters
.DeviceIoControl
.Type3InputBuffer
;
64 KsAcquireDeviceSecurityLock(
65 IN KSDEVICE_HEADER DevHeader
,
69 PKSIDEVICE_HEADER Header
= (PKSIDEVICE_HEADER
)DevHeader
;
71 KeEnterCriticalRegion();
75 Status
= ExAcquireResourceExclusiveLite(&Header
->SecurityLock
, TRUE
);
79 Status
= ExAcquireResourceSharedLite(&Header
->SecurityLock
, TRUE
);
89 KsReleaseDeviceSecurityLock(
90 IN KSDEVICE_HEADER DevHeader
)
92 PKSIDEVICE_HEADER Header
= (PKSIDEVICE_HEADER
)DevHeader
;
94 ExReleaseResourceLite(&Header
->SecurityLock
);
95 KeLeaveCriticalRegion();
104 KsDefaultDispatchPnp(
105 IN PDEVICE_OBJECT DeviceObject
,
108 PDEVICE_EXTENSION DeviceExtension
;
109 PKSIDEVICE_HEADER DeviceHeader
;
110 PIO_STACK_LOCATION IoStack
;
111 PDEVICE_OBJECT PnpDeviceObject
;
115 /* get current irp stack */
116 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
118 /* caller wants to add the target device */
119 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
121 /* get device header */
122 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
124 /* backup PnpBaseObject */
125 PnpDeviceObject
= DeviceHeader
->PnpDeviceObject
;
128 /* backup minor function code */
129 MinorFunction
= IoStack
->MinorFunction
;
131 if(MinorFunction
== IRP_MN_REMOVE_DEVICE
)
133 /* remove the device */
134 KsFreeDeviceHeader((KSDEVICE_HEADER
)DeviceHeader
);
137 /* skip current irp stack */
138 IoSkipCurrentIrpStackLocation(Irp
);
140 /* call attached pnp device object */
141 Status
= IoCallDriver(PnpDeviceObject
, Irp
);
143 if (MinorFunction
== IRP_MN_REMOVE_DEVICE
)
146 IoDetachDevice(PnpDeviceObject
);
148 IoDeleteDevice(DeviceObject
);
160 KsDefaultDispatchPower(
161 IN PDEVICE_OBJECT DeviceObject
,
164 PDEVICE_EXTENSION DeviceExtension
;
165 PKSIDEVICE_HEADER DeviceHeader
;
166 PKSIOBJECT_HEADER ObjectHeader
;
167 PIO_STACK_LOCATION IoStack
;
168 PLIST_ENTRY ListEntry
;
171 /* get current irp stack */
172 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
174 /* caller wants to add the target device */
175 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
177 /* get device header */
178 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
182 /* loop our power dispatch list and call registered notification functions */
183 ListEntry
= DeviceHeader
->PowerDispatchList
.Flink
;
185 while(ListEntry
!= &DeviceHeader
->PowerDispatchList
)
187 /* get object header */
188 ObjectHeader
= (PKSIOBJECT_HEADER
)CONTAINING_RECORD(ListEntry
, KSIOBJECT_HEADER
, PowerDispatchEntry
);
190 /* does it have still a cb */
191 if (ObjectHeader
->PowerDispatch
)
193 /* call the power cb */
194 Status
= ObjectHeader
->PowerDispatch(ObjectHeader
->PowerContext
, Irp
);
195 ASSERT(NT_SUCCESS(Status
));
198 /* iterate to next entry */
199 ListEntry
= ListEntry
->Flink
;
202 /* start next power irp */
203 PoStartNextPowerIrp(Irp
);
205 /* skip current irp stack location */
206 IoSkipCurrentIrpStackLocation(Irp
);
209 Status
= PoCallDriver(DeviceHeader
->PnpDeviceObject
, Irp
);
222 IN PDEVICE_OBJECT DeviceObject
,
225 PDEVICE_EXTENSION DeviceExtension
;
226 PKSIDEVICE_HEADER DeviceHeader
;
227 PIO_STACK_LOCATION IoStack
;
230 /* get current irp stack */
231 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
233 /* caller wants to add the target device */
234 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
236 /* get device header */
237 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
239 /* forward the request to the PDO */
240 Status
= IoCallDriver(DeviceHeader
->PnpDeviceObject
, Irp
);
251 KsSetDevicePnpAndBaseObject(
252 IN KSDEVICE_HEADER Header
,
253 IN PDEVICE_OBJECT PnpDeviceObject
,
254 IN PDEVICE_OBJECT BaseDevice
)
256 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)Header
;
258 DeviceHeader
->PnpDeviceObject
= PnpDeviceObject
;
259 DeviceHeader
->BaseDevice
= BaseDevice
;
268 KsQueryDevicePnpObject(
269 IN KSDEVICE_HEADER Header
)
271 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)Header
;
273 /* return PnpDeviceObject */
274 return DeviceHeader
->PnpDeviceObject
;
284 KsQueryObjectAccessMask(
285 IN KSOBJECT_HEADER Header
)
287 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
)Header
;
289 /* return access mask */
290 return ObjectHeader
->AccessMask
;
300 KsRecalculateStackDepth(
301 IN KSDEVICE_HEADER Header
,
302 IN BOOLEAN ReuseStackLocation
)
315 IN KSOBJECT_HEADER Header
,
316 IN KSTARGET_STATE TargetState
)
318 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)Header
;
320 /* set target state */
321 DeviceHeader
->TargetState
= TargetState
;
330 KsSetTargetDeviceObject(
331 IN KSOBJECT_HEADER Header
,
332 IN PDEVICE_OBJECT TargetDevice OPTIONAL
)
334 PDEVICE_EXTENSION DeviceExtension
;
335 PKSIDEVICE_HEADER DeviceHeader
;
336 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
)Header
;
338 if(ObjectHeader
->TargetDevice
)
340 /* there is already a target device set */
343 /* caller wants to remove the target device */
344 DeviceExtension
= (PDEVICE_EXTENSION
)ObjectHeader
->TargetDevice
->DeviceExtension
;
346 /* get device header */
347 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
350 KsAcquireDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
, FALSE
);
353 RemoveEntryList(&ObjectHeader
->TargetDeviceListEntry
);
355 /* remove device pointer */
356 ObjectHeader
->TargetDevice
= NULL
;
359 KsReleaseDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
);
364 /* no target device yet set */
367 /* caller wants to add the target device */
368 DeviceExtension
= (PDEVICE_EXTENSION
)TargetDevice
->DeviceExtension
;
370 /* get device header */
371 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
374 KsAcquireDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
, FALSE
);
376 /* insert list entry */
377 InsertTailList(&DeviceHeader
->TargetDeviceList
, &ObjectHeader
->TargetDeviceListEntry
);
379 /* store target device */
380 ObjectHeader
->TargetDevice
= TargetDevice
;
383 KsReleaseDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
);
396 IN KSOBJECT_HEADER Header
,
397 IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL
,
398 IN PVOID PowerContext OPTIONAL
)
400 PDEVICE_EXTENSION DeviceExtension
;
401 PKSIDEVICE_HEADER DeviceHeader
;
402 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
)Header
;
404 /* caller wants to add the target device */
405 DeviceExtension
= (PDEVICE_EXTENSION
)ObjectHeader
->ParentDeviceObject
->DeviceExtension
;
407 /* get device header */
408 DeviceHeader
= (PKSIDEVICE_HEADER
)DeviceExtension
->DeviceHeader
;
411 KsAcquireDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
, FALSE
);
415 /* add power dispatch entry */
416 InsertTailList(&DeviceHeader
->PowerDispatchList
, &ObjectHeader
->PowerDispatchEntry
);
418 /* store function and context */
419 ObjectHeader
->PowerDispatch
= PowerDispatch
;
420 ObjectHeader
->PowerContext
= PowerContext
;
424 /* remove power dispatch entry */
425 RemoveEntryList(&ObjectHeader
->PowerDispatchEntry
);
427 /* store function and context */
428 ObjectHeader
->PowerDispatch
= NULL
;
429 ObjectHeader
->PowerContext
= NULL
;
434 KsReleaseDeviceSecurityLock((KSDEVICE_HEADER
)DeviceHeader
);
442 PKSOBJECT_CREATE_ITEM
444 KsQueryObjectCreateItem(
445 IN KSOBJECT_HEADER Header
)
447 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
)Header
;
448 return ObjectHeader
->OriginalCreateItem
;
452 KspAddCreateItemToList(
453 OUT PLIST_ENTRY ListHead
,
455 IN PKSOBJECT_CREATE_ITEM ItemsList
)
458 PCREATE_ITEM_ENTRY Entry
;
461 for(Index
= 0; Index
< ItemsCount
; Index
++)
464 Entry
= AllocateItem(NonPagedPool
, sizeof(CREATE_ITEM_ENTRY
));
468 return STATUS_INSUFFICIENT_RESOURCES
;
471 /* initialize entry */
472 InitializeListHead(&Entry
->ObjectItemList
);
473 Entry
->CreateItem
= &ItemsList
[Index
];
474 Entry
->ReferenceCount
= 0;
475 Entry
->ItemFreeCallback
= NULL
;
477 InsertTailList(ListHead
, &Entry
->Entry
);
479 return STATUS_SUCCESS
;
484 PLIST_ENTRY ListHead
)
486 PCREATE_ITEM_ENTRY Entry
;
488 while(!IsListEmpty(ListHead
))
490 /* remove create item from list */
491 Entry
= (PCREATE_ITEM_ENTRY
)CONTAINING_RECORD(RemoveHeadList(ListHead
), CREATE_ITEM_ENTRY
, Entry
);
493 /* caller shouldnt have any references */
494 ASSERT(Entry
->ReferenceCount
== 0);
495 ASSERT(IsListEmpty(&Entry
->ObjectItemList
));
497 /* does the creator wish notification */
498 if (Entry
->ItemFreeCallback
)
501 Entry
->ItemFreeCallback(Entry
->CreateItem
);
504 /* free create item entry */
516 KsAllocateDeviceHeader(
517 OUT KSDEVICE_HEADER
* OutHeader
,
519 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
)
521 NTSTATUS Status
= STATUS_SUCCESS
;
522 PKSIDEVICE_HEADER Header
;
525 return STATUS_INVALID_PARAMETER
;
527 /* allocate a device header */
528 Header
= ExAllocatePoolWithTag(PagedPool
, sizeof(KSIDEVICE_HEADER
), TAG_DEVICE_HEADER
);
530 /* check for success */
532 return STATUS_INSUFFICIENT_RESOURCES
;
534 /* clear all memory */
535 RtlZeroMemory(Header
, sizeof(KSIDEVICE_HEADER
));
537 /* initialize device mutex */
538 KeInitializeMutex(&Header
->DeviceMutex
, 0);
540 /* initialize target device list */
541 InitializeListHead(&Header
->TargetDeviceList
);
542 /* initialize power dispatch list */
543 InitializeListHead(&Header
->PowerDispatchList
);
544 /* initialize object bag lists */
545 InitializeListHead(&Header
->ObjectBags
);
547 /* initialize create item list */
548 InitializeListHead(&Header
->ItemList
);
550 /* initialize basic header */
551 Header
->BasicHeader
.Type
= KsObjectTypeDevice
;
552 Header
->BasicHeader
.KsDevice
= &Header
->KsDevice
;
553 Header
->BasicHeader
.Parent
.KsDevice
= &Header
->KsDevice
;
555 /* are there any create items provided */
556 if (ItemsCount
&& ItemsList
)
558 Status
= KspAddCreateItemToList(&Header
->ItemList
, ItemsCount
, ItemsList
);
560 if (NT_SUCCESS(Status
))
562 /* store item count */
563 Header
->ItemListCount
= ItemsCount
;
567 /* release create items */
568 KspFreeCreateItems(&Header
->ItemList
);
585 IN KSDEVICE_HEADER DevHeader
)
587 PKSIDEVICE_HEADER Header
;
589 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
594 KspFreeCreateItems(&Header
->ItemList
);
595 ExFreePoolWithTag(Header
, TAG_DEVICE_HEADER
);
604 KsAllocateObjectHeader(
605 OUT KSOBJECT_HEADER
*Header
,
607 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
,
609 IN KSDISPATCH_TABLE
* Table
)
611 PIO_STACK_LOCATION IoStack
;
612 PDEVICE_EXTENSION DeviceExtension
;
613 PKSIDEVICE_HEADER DeviceHeader
;
614 PKSIOBJECT_HEADER ObjectHeader
;
615 PKSOBJECT_CREATE_ITEM CreateItem
;
619 return STATUS_INVALID_PARAMETER_1
;
622 return STATUS_INVALID_PARAMETER_4
;
625 return STATUS_INVALID_PARAMETER_5
;
627 /* get current stack location */
628 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
629 /* get device extension */
630 DeviceExtension
= (PDEVICE_EXTENSION
)IoStack
->DeviceObject
->DeviceExtension
;
631 /* get device header */
632 DeviceHeader
= DeviceExtension
->DeviceHeader
;
635 ASSERT(IoStack
->FileObject
);
636 /* check for an file object */
638 /* allocate the object header */
639 ObjectHeader
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(KSIOBJECT_HEADER
), TAG_DEVICE_HEADER
);
641 return STATUS_INSUFFICIENT_RESOURCES
;
643 /* initialize object header */
644 RtlZeroMemory(ObjectHeader
, sizeof(KSIOBJECT_HEADER
));
646 /* initialize create item list */
647 InitializeListHead(&ObjectHeader
->ItemList
);
649 /* get create item */
650 CreateItem
= KSCREATE_ITEM_IRP_STORAGE(Irp
);
652 /* do we have a name */
653 if (IoStack
->FileObject
->FileName
.Buffer
)
655 /* copy object class */
656 ObjectHeader
->ObjectClass
.MaximumLength
= IoStack
->FileObject
->FileName
.MaximumLength
;
657 ObjectHeader
->ObjectClass
.Buffer
= ExAllocatePoolWithTag(NonPagedPool
, ObjectHeader
->ObjectClass
.MaximumLength
, TAG_DEVICE_HEADER
);
658 if (!ObjectHeader
->ObjectClass
.Buffer
)
660 ExFreePoolWithTag(ObjectHeader
, TAG_DEVICE_HEADER
);
661 return STATUS_INSUFFICIENT_RESOURCES
;
663 RtlCopyUnicodeString(&ObjectHeader
->ObjectClass
, &IoStack
->FileObject
->FileName
);
666 /* copy dispatch table */
667 RtlCopyMemory(&ObjectHeader
->DispatchTable
, Table
, sizeof(KSDISPATCH_TABLE
));
669 /* store create items */
670 if (ItemsCount
&& ItemsList
)
672 Status
= KspAddCreateItemToList(&ObjectHeader
->ItemList
, ItemsCount
, ItemsList
);
674 if (NT_SUCCESS(Status
))
676 /* store item count */
677 ObjectHeader
->ItemListCount
= ItemsCount
;
682 KsFreeObjectHeader(ObjectHeader
);
686 /* store the object in the file object */
687 ASSERT(IoStack
->FileObject
->FsContext
== NULL
);
688 IoStack
->FileObject
->FsContext
= ObjectHeader
;
690 /* store parent device */
691 ObjectHeader
->ParentDeviceObject
= IoGetRelatedDeviceObject(IoStack
->FileObject
);
693 /* store originating create item */
694 ObjectHeader
->OriginalCreateItem
= KSCREATE_ITEM_IRP_STORAGE(Irp
);
696 /* FIXME store access mask see KsQueryObjectAccessMask */
697 ObjectHeader
->AccessMask
= IoStack
->Parameters
.Create
.SecurityContext
->DesiredAccess
;
701 *Header
= ObjectHeader
;
703 DPRINT("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectHeader
->ObjectClass
.Buffer
, IoStack
->FileObject
, ObjectHeader
);
705 return STATUS_SUCCESS
;
718 PKSIOBJECT_HEADER ObjectHeader
= (PKSIOBJECT_HEADER
) Header
;
720 if (ObjectHeader
->ObjectClass
.Buffer
)
722 /* release object class buffer */
723 ExFreePoolWithTag(ObjectHeader
->ObjectClass
.Buffer
, TAG_DEVICE_HEADER
);
726 if (ObjectHeader
->Unknown
)
728 /* release associated object */
729 ObjectHeader
->Unknown
->lpVtbl
->Release(ObjectHeader
->Unknown
);
732 /* free create items */
733 KspFreeCreateItems(&ObjectHeader
->ItemList
);
735 /* free object header */
736 ExFreePoolWithTag(ObjectHeader
, TAG_DEVICE_HEADER
);
741 KspAddObjectCreateItemToList(
742 PLIST_ENTRY ListHead
,
743 IN PDRIVER_DISPATCH Create
,
745 IN PWCHAR ObjectClass
,
746 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
749 PCREATE_ITEM_ENTRY CreateEntry
;
751 /* point to first entry */
752 Entry
= ListHead
->Flink
;
754 while(Entry
!= ListHead
)
756 /* get create entry */
757 CreateEntry
= (PCREATE_ITEM_ENTRY
)CONTAINING_RECORD(Entry
, CREATE_ITEM_ENTRY
, Entry
);
758 /* if the create item has no create routine, then it is free to use */
759 if (CreateEntry
->CreateItem
->Create
== NULL
)
762 ASSERT(IsListEmpty(&CreateEntry
->ObjectItemList
));
763 ASSERT(CreateEntry
->ReferenceCount
== 0);
765 CreateEntry
->CreateItem
->Context
= Context
;
766 CreateEntry
->CreateItem
->Create
= Create
;
767 RtlInitUnicodeString(&CreateEntry
->CreateItem
->ObjectClass
, ObjectClass
);
768 CreateEntry
->CreateItem
->SecurityDescriptor
= SecurityDescriptor
;
770 return STATUS_SUCCESS
;
773 if (!wcsicmp(ObjectClass
, CreateEntry
->CreateItem
->ObjectClass
.Buffer
))
775 /* the same object class already exists */
776 return STATUS_OBJECT_NAME_COLLISION
;
779 /* iterate to next entry */
780 Entry
= Entry
->Flink
;
782 return STATUS_ALLOTTED_SPACE_EXCEEDED
;
791 KsAddObjectCreateItemToDeviceHeader(
792 IN KSDEVICE_HEADER DevHeader
,
793 IN PDRIVER_DISPATCH Create
,
795 IN PWCHAR ObjectClass
,
796 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
798 PKSIDEVICE_HEADER Header
;
801 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
803 DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
805 /* check if a device header has been provided */
807 return STATUS_INVALID_PARAMETER_1
;
809 /* check if a create item has been provided */
811 return STATUS_INVALID_PARAMETER_2
;
813 /* check if a object class has been provided */
815 return STATUS_INVALID_PARAMETER_4
;
817 /* let others do the work */
818 Status
= KspAddObjectCreateItemToList(&Header
->ItemList
, Create
, Context
, ObjectClass
, SecurityDescriptor
);
820 if (NT_SUCCESS(Status
))
822 /* increment create item count */
823 InterlockedIncrement(&Header
->ItemListCount
);
835 KsAddObjectCreateItemToObjectHeader(
836 IN KSOBJECT_HEADER ObjectHeader
,
837 IN PDRIVER_DISPATCH Create
,
839 IN PWCHAR ObjectClass
,
840 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
842 PKSIOBJECT_HEADER Header
;
845 Header
= (PKSIOBJECT_HEADER
)ObjectHeader
;
847 DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
849 /* check if a device header has been provided */
851 return STATUS_INVALID_PARAMETER_1
;
853 /* check if a create item has been provided */
855 return STATUS_INVALID_PARAMETER_2
;
857 /* check if a object class has been provided */
859 return STATUS_INVALID_PARAMETER_4
;
862 Status
= KspAddObjectCreateItemToList(&Header
->ItemList
, Create
, Context
, ObjectClass
, SecurityDescriptor
);
864 if (NT_SUCCESS(Status
))
866 /* increment create item count */
867 InterlockedIncrement(&Header
->ItemListCount
);
879 KsAllocateObjectCreateItem(
880 IN KSDEVICE_HEADER DevHeader
,
881 IN PKSOBJECT_CREATE_ITEM CreateItem
,
882 IN BOOLEAN AllocateEntry
,
883 IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
)
885 PCREATE_ITEM_ENTRY CreateEntry
;
886 PKSIDEVICE_HEADER Header
;
887 PKSOBJECT_CREATE_ITEM Item
;
889 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
892 return STATUS_INVALID_PARAMETER_1
;
895 return STATUS_INVALID_PARAMETER_2
;
897 /* first allocate a create entry */
898 CreateEntry
= AllocateItem(NonPagedPool
, sizeof(PCREATE_ITEM_ENTRY
));
900 /* check for allocation success */
903 /* not enough resources */
904 return STATUS_INSUFFICIENT_RESOURCES
;
910 /* allocate create item */
911 Item
= ExAllocatePool(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
915 ExFreePool(CreateEntry
);
916 return STATUS_INSUFFICIENT_RESOURCES
;
919 /* initialize descriptor */
920 Item
->Context
= CreateItem
->Context
;
921 Item
->Create
= CreateItem
->Create
;
922 Item
->Flags
= CreateItem
->Flags
;
923 Item
->SecurityDescriptor
= CreateItem
->SecurityDescriptor
;
924 Item
->ObjectClass
.Length
= 0;
925 Item
->ObjectClass
.MaximumLength
= CreateItem
->ObjectClass
.MaximumLength
;
927 /* copy object class */
928 Item
->ObjectClass
.Buffer
= ExAllocatePool(NonPagedPool
, Item
->ObjectClass
.MaximumLength
);
929 if (!Item
->ObjectClass
.Buffer
)
931 /* release resources */
933 FreeItem(CreateEntry
);
935 return STATUS_INSUFFICIENT_RESOURCES
;
937 RtlCopyUnicodeString(&Item
->ObjectClass
, &CreateItem
->ObjectClass
);
941 if (ItemFreeCallback
)
943 /* callback is only accepted when the create item is copied */
944 ItemFreeCallback
= NULL
;
946 /* use passed create item */
950 /* initialize create item entry */
951 InitializeListHead(&CreateEntry
->ObjectItemList
);
952 CreateEntry
->ItemFreeCallback
= ItemFreeCallback
;
953 CreateEntry
->CreateItem
= Item
;
954 CreateEntry
->ReferenceCount
= 0;
956 /* now insert the create item entry */
957 InsertTailList(&Header
->ItemList
, &CreateEntry
->Entry
);
959 /* increment item count */
960 InterlockedIncrement(&Header
->ItemListCount
);
962 return STATUS_SUCCESS
;
966 KspObjectFreeCreateItems(
967 IN KSDEVICE_HEADER Header
,
968 IN PKSOBJECT_CREATE_ITEM CreateItem
)
971 return STATUS_NOT_IMPLEMENTED
;
980 KsFreeObjectCreateItem(
981 IN KSDEVICE_HEADER Header
,
982 IN PUNICODE_STRING CreateItem
)
984 KSOBJECT_CREATE_ITEM Item
;
986 RtlZeroMemory(&Item
, sizeof(KSOBJECT_CREATE_ITEM
));
987 RtlInitUnicodeString(&Item
.ObjectClass
, CreateItem
->Buffer
);
989 return KspObjectFreeCreateItems(Header
, &Item
);
999 KsFreeObjectCreateItemsByContext(
1000 IN KSDEVICE_HEADER Header
,
1003 KSOBJECT_CREATE_ITEM Item
;
1005 RtlZeroMemory(&Item
, sizeof(KSOBJECT_CREATE_ITEM
));
1007 Item
.Context
= Context
;
1009 return KspObjectFreeCreateItems(Header
, &Item
);
1018 KsCreateDefaultSecurity(
1019 IN PSECURITY_DESCRIPTOR ParentSecurity OPTIONAL
,
1020 OUT PSECURITY_DESCRIPTOR
* DefaultSecurity
)
1022 PGENERIC_MAPPING Mapping
;
1023 SECURITY_SUBJECT_CONTEXT SubjectContext
;
1026 /* start capturing security context of calling thread */
1027 SeCaptureSubjectContext(&SubjectContext
);
1028 /* get generic mapping */
1029 Mapping
= IoGetFileObjectGenericMapping();
1030 /* build new descriptor */
1031 Status
= SeAssignSecurity(ParentSecurity
, NULL
, DefaultSecurity
, FALSE
, &SubjectContext
, Mapping
, NonPagedPool
);
1032 /* release security descriptor */
1033 SeReleaseSubjectContext(&SubjectContext
);
1046 IN PFILE_OBJECT FileObject
,
1047 IN BOOLEAN ReuseStackLocation
)
1050 return STATUS_UNSUCCESSFUL
;
1060 KsForwardAndCatchIrp(
1061 IN PDEVICE_OBJECT DeviceObject
,
1063 IN PFILE_OBJECT FileObject
,
1064 IN KSSTACK_USE StackUse
)
1067 return STATUS_UNSUCCESSFUL
;
1073 KspSynchronousIoControlDeviceCompletion(
1074 IN PDEVICE_OBJECT DeviceObject
,
1078 PIO_STATUS_BLOCK IoStatusBlock
= (PIO_STATUS_BLOCK
)Context
;
1080 IoStatusBlock
->Information
= Irp
->IoStatus
.Information
;
1081 IoStatusBlock
->Status
= Irp
->IoStatus
.Status
;
1083 return STATUS_SUCCESS
;
1092 KsSynchronousIoControlDevice(
1093 IN PFILE_OBJECT FileObject
,
1094 IN KPROCESSOR_MODE RequestorMode
,
1098 OUT PVOID OutBuffer
,
1100 OUT PULONG BytesReturned
)
1102 PKSIOBJECT_HEADER ObjectHeader
;
1103 PDEVICE_OBJECT DeviceObject
;
1106 IO_STATUS_BLOCK IoStatusBlock
;
1107 PIO_STACK_LOCATION IoStack
;
1110 /* check for valid file object */
1112 return STATUS_INVALID_PARAMETER
;
1114 /* get device object to send the request to */
1115 DeviceObject
= IoGetRelatedDeviceObject(FileObject
);
1117 return STATUS_UNSUCCESSFUL
;
1120 /* get object header */
1121 ObjectHeader
= (PKSIOBJECT_HEADER
)FileObject
->FsContext
;
1123 /* check if there is fast device io function */
1124 if (ObjectHeader
&& ObjectHeader
->DispatchTable
.FastDeviceIoControl
)
1126 IoStatusBlock
.Status
= STATUS_UNSUCCESSFUL
;
1127 IoStatusBlock
.Information
= 0;
1129 /* it is send the request */
1130 Status
= ObjectHeader
->DispatchTable
.FastDeviceIoControl(FileObject
, TRUE
, InBuffer
, InSize
, OutBuffer
, OutSize
, IoControl
, &IoStatusBlock
, DeviceObject
);
1131 /* check if the request was handled */
1132 //DPRINT("Handled %u Status %x Length %u\n", Status, IoStatusBlock.Status, IoStatusBlock.Information);
1135 /* store bytes returned */
1136 *BytesReturned
= IoStatusBlock
.Information
;
1138 return IoStatusBlock
.Status
;
1142 /* initialize the event */
1143 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
1145 /* create the irp */
1146 Irp
= IoBuildDeviceIoControlRequest(IoControl
, DeviceObject
, InBuffer
, InSize
, OutBuffer
, OutSize
, FALSE
, &Event
, &IoStatusBlock
);
1149 IoStack
= IoGetNextIrpStackLocation(Irp
);
1150 IoStack
->FileObject
= FileObject
;
1152 IoSetCompletionRoutine(Irp
, KspSynchronousIoControlDeviceCompletion
, (PVOID
)&IoStatusBlock
, TRUE
, TRUE
, TRUE
);
1154 Status
= IoCallDriver(DeviceObject
, Irp
);
1155 if (Status
== STATUS_PENDING
)
1157 KeWaitForSingleObject(&Event
, Executive
, RequestorMode
, FALSE
, NULL
);
1158 Status
= IoStatusBlock
.Status
;
1161 *BytesReturned
= IoStatusBlock
.Information
;
1171 KsUnserializeObjectPropertiesFromRegistry(
1172 IN PFILE_OBJECT FileObject
,
1173 IN HANDLE ParentKey OPTIONAL
,
1174 IN PUNICODE_STRING RegistryPath OPTIONAL
)
1177 return STATUS_NOT_IMPLEMENTED
;
1188 IN PUNICODE_STRING SymbolicLink
,
1189 IN PKSPIN_MEDIUM Medium
,
1190 IN ULONG PinDirection
)
1193 return STATUS_UNSUCCESSFUL
;
1202 PUNICODE_STRING RegistryPath
)
1204 return STATUS_SUCCESS
;
1211 IN PDEVICE_OBJECT DeviceObject
,
1214 PKO_OBJECT_HEADER Header
;
1215 PIO_STACK_LOCATION IoStack
;
1216 PDEVICE_EXTENSION DeviceExtension
;
1218 /* get current irp stack location */
1219 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
1221 /* get ko object header */
1222 Header
= (PKO_OBJECT_HEADER
)IoStack
->FileObject
->FsContext2
;
1224 /* free ks object header */
1225 KsFreeObjectHeader(Header
->ObjectHeader
);
1227 /* free ko object header */
1230 /* get device extension */
1231 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
1233 /* release bus object */
1234 KsDereferenceBusObject((KSDEVICE_HEADER
)DeviceExtension
->DeviceHeader
);
1236 /* complete request */
1237 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
1238 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1240 return STATUS_SUCCESS
;
1245 static KSDISPATCH_TABLE KoDispatchTable
=
1247 KsDispatchInvalidDeviceRequest
,
1248 KsDispatchInvalidDeviceRequest
,
1249 KsDispatchInvalidDeviceRequest
,
1250 KsDispatchInvalidDeviceRequest
,
1252 KsDispatchQuerySecurity
,
1253 KsDispatchSetSecurity
,
1254 KsDispatchFastIoDeviceControlFailure
,
1255 KsDispatchFastReadFailure
,
1256 KsDispatchFastReadFailure
,
1263 IN PDEVICE_OBJECT DeviceObject
,
1266 PKO_OBJECT_HEADER Header
= NULL
;
1267 PIO_STACK_LOCATION IoStack
;
1268 PKO_DRIVER_EXTENSION DriverObjectExtension
;
1271 /* get current irp stack location */
1272 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
1274 if (!IoStack
->FileObject
)
1276 DPRINT1("FileObject not attached!\n");
1277 Status
= STATUS_UNSUCCESSFUL
;
1281 /* get driver object extension */
1282 DriverObjectExtension
= (PKO_DRIVER_EXTENSION
)IoGetDriverObjectExtension(DeviceObject
->DriverObject
, (PVOID
)KoDriverInitialize
);
1283 if (!DriverObjectExtension
)
1285 DPRINT1("FileObject not attached!\n");
1286 Status
= STATUS_UNSUCCESSFUL
;
1290 /* allocate ko object header */
1291 Header
= (PKO_OBJECT_HEADER
)AllocateItem(NonPagedPool
, sizeof(KO_OBJECT_HEADER
));
1294 DPRINT1("failed to allocate KO_OBJECT_HEADER\n");
1295 Status
= STATUS_INSUFFICIENT_RESOURCES
;
1299 /* initialize create item */
1300 Header
->CreateItem
.Create
= KopDispatchCreate
;
1301 RtlInitUnicodeString(&Header
->CreateItem
.ObjectClass
, KOSTRING_CreateObject
);
1304 /* now allocate the object header */
1305 Status
= KsAllocateObjectHeader(&Header
->ObjectHeader
, 1, &Header
->CreateItem
, Irp
, &KoDispatchTable
);
1306 if (!NT_SUCCESS(Status
))
1313 * extract clsid and interface id from irp
1314 * call the standard create handler
1319 IoStack
->FileObject
->FsContext2
= (PVOID
)Header
;
1321 Irp
->IoStatus
.Status
= Status
;
1322 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1328 if (Header
&& Header
->ObjectHeader
)
1329 KsFreeObjectHeader(Header
->ObjectHeader
);
1334 Irp
->IoStatus
.Status
= Status
;
1335 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1344 IN PDRIVER_OBJECT DriverObject
,
1345 IN PDEVICE_OBJECT PhysicalDeviceObject
)
1347 NTSTATUS Status
= STATUS_DEVICE_REMOVED
;
1348 PDEVICE_OBJECT FunctionalDeviceObject
= NULL
;
1349 PDEVICE_OBJECT NextDeviceObject
;
1350 PDEVICE_EXTENSION DeviceExtension
;
1351 PKSOBJECT_CREATE_ITEM CreateItem
;
1353 /* create the device object */
1354 Status
= IoCreateDevice(DriverObject
, sizeof(DEVICE_EXTENSION
), NULL
, FILE_DEVICE_KS
, FILE_DEVICE_SECURE_OPEN
, FALSE
, &FunctionalDeviceObject
);
1355 if (!NT_SUCCESS(Status
))
1358 /* allocate the create item */
1359 CreateItem
= AllocateItem(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
1363 /* not enough memory */
1364 IoDeleteDevice(FunctionalDeviceObject
);
1365 return STATUS_INSUFFICIENT_RESOURCES
;
1368 /* initialize create item */
1369 CreateItem
->Create
= KopDispatchCreate
;
1370 RtlInitUnicodeString(&CreateItem
->ObjectClass
, KOSTRING_CreateObject
);
1372 /* get device extension */
1373 DeviceExtension
= (PDEVICE_EXTENSION
)FunctionalDeviceObject
->DeviceExtension
;
1375 /* now allocate the device header */
1376 Status
= KsAllocateDeviceHeader((KSDEVICE_HEADER
*)&DeviceExtension
->DeviceHeader
, 1, CreateItem
);
1377 if (!NT_SUCCESS(Status
))
1380 IoDeleteDevice(FunctionalDeviceObject
);
1381 FreeItem(CreateItem
);
1385 /* now attach to device stack */
1386 NextDeviceObject
= IoAttachDeviceToDeviceStack(FunctionalDeviceObject
, PhysicalDeviceObject
);
1387 if (NextDeviceObject
)
1389 /* store pnp base object */
1390 KsSetDevicePnpAndBaseObject((KSDEVICE_HEADER
)DeviceExtension
->DeviceHeader
, NextDeviceObject
, FunctionalDeviceObject
);
1391 /* set device flags */
1392 FunctionalDeviceObject
->Flags
|= DO_DIRECT_IO
| DO_POWER_PAGABLE
;
1393 FunctionalDeviceObject
->Flags
&= ~ DO_DEVICE_INITIALIZING
;
1398 KsFreeDeviceHeader((KSDEVICE_HEADER
)DeviceExtension
->DeviceHeader
);
1399 FreeItem(CreateItem
);
1400 IoDeleteDevice(FunctionalDeviceObject
);
1401 Status
= STATUS_DEVICE_REMOVED
;
1416 IN PDEVICE_OBJECT DeviceObject
)
1418 PDEVICE_EXTENSION DeviceExtension
;
1420 /* get device extension */
1421 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
1423 return KsAddObjectCreateItemToDeviceHeader((KSDEVICE_HEADER
)DeviceExtension
->DeviceHeader
, KopDispatchCreate
, NULL
, KOSTRING_CreateObject
, NULL
);
1433 IN PDRIVER_OBJECT DriverObject
,
1434 IN PUNICODE_STRING RegistryPathName
,
1435 IN KoCreateObjectHandler CreateObjectHandler
)
1437 PKO_DRIVER_EXTENSION DriverObjectExtension
;
1440 /* allocate driver object extension */
1441 Status
= IoAllocateDriverObjectExtension(DriverObject
, (PVOID
)KoDriverInitialize
, sizeof(KO_DRIVER_EXTENSION
), (PVOID
*)&DriverObjectExtension
);
1444 if (NT_SUCCESS(Status
))
1446 /* store create handler */
1447 DriverObjectExtension
->CreateObjectHandler
= CreateObjectHandler
;
1449 /* Setting our IRP handlers */
1450 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = KsDefaultDispatchPnp
;
1451 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = KsDefaultDispatchPower
;
1452 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = KsDefaultForwardIrp
;
1454 /* The driver unload routine */
1455 DriverObject
->DriverUnload
= KsNullDriverUnload
;
1457 /* The driver-supplied AddDevice */
1458 DriverObject
->DriverExtension
->AddDevice
= KopAddDevice
;
1460 /* KS handles these */
1461 DPRINT1("Setting KS function handlers\n");
1462 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_CREATE
);
1463 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_CLOSE
);
1464 KsSetMajorFunctionHandler(DriverObject
, IRP_MJ_DEVICE_CONTROL
);
1478 IN REFCLSID ClassId
)
1492 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
1495 ASSERT(BasicHeader
->Type
== KsObjectTypeFilter
|| BasicHeader
->Type
== KsObjectTypePin
);
1497 KeWaitForSingleObject(&BasicHeader
->ControlMutex
, Executive
, KernelMode
, FALSE
, NULL
);
1509 PKSBASIC_HEADER BasicHeader
= (PKSBASIC_HEADER
)((ULONG_PTR
)Object
- sizeof(KSBASIC_HEADER
));
1512 ASSERT(BasicHeader
->Type
== KsObjectTypeFilter
|| BasicHeader
->Type
== KsObjectTypePin
);
1514 KeReleaseMutex(&BasicHeader
->ControlMutex
, FALSE
);
1526 IN PKSDEVICE Device
)
1528 IKsDevice
*KsDevice
;
1529 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)CONTAINING_RECORD(Device
, KSIDEVICE_HEADER
, KsDevice
);
1531 /* get device interface*/
1532 KsDevice
= (IKsDevice
*)&DeviceHeader
->lpVtblIKsDevice
;
1534 /* acquire device mutex */
1535 KsDevice
->lpVtbl
->AcquireDevice(KsDevice
);
1544 IN PKSDEVICE Device
)
1546 IKsDevice
*KsDevice
;
1547 PKSIDEVICE_HEADER DeviceHeader
= (PKSIDEVICE_HEADER
)CONTAINING_RECORD(Device
, KSIDEVICE_HEADER
, KsDevice
);
1549 /* get device interface*/
1550 KsDevice
= (IKsDevice
*)&DeviceHeader
->lpVtblIKsDevice
;
1552 /* release device mutex */
1553 KsDevice
->lpVtbl
->ReleaseDevice(KsDevice
);
1563 IN PDEVICE_OBJECT DeviceObject
)
1565 IKsDevice
*KsDevice
;
1566 PKSIDEVICE_HEADER DeviceHeader
;
1567 PDEVICE_EXTENSION DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
1569 /* get device header */
1570 DeviceHeader
= DeviceExtension
->DeviceHeader
;
1572 /* get device interface*/
1573 KsDevice
= (IKsDevice
*)&DeviceHeader
->lpVtblIKsDevice
;
1575 /* now free device header */
1576 KsFreeDeviceHeader((KSDEVICE_HEADER
)DeviceHeader
);
1578 /* release interface when available */
1581 /* delete IKsDevice interface */
1582 KsDevice
->lpVtbl
->Release(KsDevice
);
1592 KsCompletePendingRequest(
1595 PIO_STACK_LOCATION IoStack
;
1597 /* get current irp stack location */
1598 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
1601 ASSERT(Irp
->IoStatus
.Status
!= STATUS_PENDING
);
1603 if (IoStack
->MajorFunction
!= IRP_MJ_CLOSE
)
1605 /* can be completed immediately */
1606 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1610 /* did close operation fail */
1611 if (!NT_SUCCESS(Irp
->IoStatus
.Status
))
1613 /* closing failed, complete irp */
1614 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
1619 * delete object / device header
1620 * remove dead pin / filter instance
1632 KsCreateBusEnumObject(
1633 IN PWCHAR BusIdentifier
,
1634 IN PDEVICE_OBJECT BusDeviceObject
,
1635 IN PDEVICE_OBJECT PhysicalDeviceObject
,
1636 IN PDEVICE_OBJECT PnpDeviceObject OPTIONAL
,
1637 IN REFGUID InterfaceGuid OPTIONAL
,
1638 IN PWCHAR ServiceRelativePath OPTIONAL
)
1641 return STATUS_UNSUCCESSFUL
;
1646 KspSetGetBusDataCompletion(
1647 IN PDEVICE_OBJECT DeviceObject
,
1651 /* signal completion */
1652 KeSetEvent((PRKEVENT
)Context
, IO_NO_INCREMENT
, FALSE
);
1654 /* more work needs be done, so dont free the irp */
1655 return STATUS_MORE_PROCESSING_REQUIRED
;
1660 KspDeviceSetGetBusData(
1661 IN PDEVICE_OBJECT DeviceObject
,
1668 PIO_STACK_LOCATION IoStack
;
1673 /* allocate the irp */
1674 Irp
= IoAllocateIrp(1, /*FIXME */
1678 return STATUS_INSUFFICIENT_RESOURCES
;
1680 /* initialize the event */
1681 KeInitializeEvent(&Event
, NotificationEvent
, FALSE
);
1683 /* get next stack location */
1684 IoStack
= IoGetNextIrpStackLocation(Irp
);
1686 /* setup a completion routine */
1687 IoSetCompletionRoutine(Irp
, KspSetGetBusDataCompletion
, (PVOID
)&Event
, TRUE
, TRUE
, TRUE
);
1689 /* setup parameters */
1690 IoStack
->Parameters
.ReadWriteConfig
.Buffer
= Buffer
;
1691 IoStack
->Parameters
.ReadWriteConfig
.Length
= Length
;
1692 IoStack
->Parameters
.ReadWriteConfig
.Offset
= Offset
;
1693 IoStack
->Parameters
.ReadWriteConfig
.WhichSpace
= DataType
;
1694 /* setup function code */
1695 IoStack
->MajorFunction
= IRP_MJ_PNP
;
1696 IoStack
->MinorFunction
= (bGet
? IRP_MN_READ_CONFIG
: IRP_MN_WRITE_CONFIG
);
1698 /* lets call the driver */
1699 Status
= IoCallDriver(DeviceObject
, Irp
);
1701 /* is the request still pending */
1702 if (Status
== STATUS_PENDING
)
1705 KeWaitForSingleObject(&Event
, Executive
, KernelMode
, FALSE
, NULL
);
1707 Status
= Irp
->IoStatus
.Status
;
1723 IN PKSDEVICE Device
,
1729 return KspDeviceSetGetBusData(Device
->PhysicalDeviceObject
, /* is this right? */
1730 DataType
, Buffer
, Offset
, Length
, FALSE
);
1741 IN PKSDEVICE Device
,
1747 return KspDeviceSetGetBusData(Device
->PhysicalDeviceObject
, /* is this right? */
1748 DataType
, Buffer
, Offset
, Length
, TRUE
);
1758 KsDeviceRegisterAdapterObject(
1759 IN PKSDEVICE Device
,
1760 IN PADAPTER_OBJECT AdapterObject
,
1761 IN ULONG MaxMappingsByteCount
,
1762 IN ULONG MappingTableStride
)
1774 IN KSOBJECT_BAG ObjectBag
,
1775 IN OUT PVOID
* PointerToPointerToItem
,
1781 return STATUS_UNSUCCESSFUL
;
1790 KsGetBusEnumIdentifier(
1794 return STATUS_UNSUCCESSFUL
;
1803 KsGetBusEnumParentFDOFromChildPDO(
1804 IN PDEVICE_OBJECT DeviceObject
,
1805 OUT PDEVICE_OBJECT
*FunctionalDeviceObject
)
1808 return STATUS_UNSUCCESSFUL
;
1817 KsGetBusEnumPnpDeviceObject(
1818 IN PDEVICE_OBJECT DeviceObject
,
1819 IN PDEVICE_OBJECT
*PnpDeviceObject
)
1822 return STATUS_UNSUCCESSFUL
;
1857 KsInstallBusEnumInterface(
1861 return STATUS_UNSUCCESSFUL
;
1870 KsIsBusEnumChildDevice(
1871 IN PDEVICE_OBJECT DeviceObject
,
1872 OUT PBOOLEAN ChildDevice
)
1875 return STATUS_UNSUCCESSFUL
;
1883 KsMergeAutomationTables(
1884 OUT PKSAUTOMATION_TABLE
*AutomationTableAB
,
1885 IN PKSAUTOMATION_TABLE AutomationTableA OPTIONAL
,
1886 IN PKSAUTOMATION_TABLE AutomationTableB OPTIONAL
,
1887 IN KSOBJECT_BAG Bag OPTIONAL
)
1890 return STATUS_UNSUCCESSFUL
;
1899 KsServiceBusEnumCreateRequest(
1900 IN PDEVICE_OBJECT DeviceObject
,
1904 return STATUS_UNSUCCESSFUL
;
1914 KsServiceBusEnumPnpRequest(
1915 IN PDEVICE_OBJECT DeviceObject
,
1919 return STATUS_UNSUCCESSFUL
;
1924 KspRemoveBusInterface(
1927 PKSREMOVE_BUS_INTERFACE_CTX Context
=(PKSREMOVE_BUS_INTERFACE_CTX
)Ctx
;
1930 * get SWENUM_INSTALL_INTERFACE struct
1931 * open device key and delete the keys
1937 Context
->Irp
->IoStatus
.Status
= STATUS_NOT_IMPLEMENTED
;
1940 /* signal completion */
1941 KeSetEvent(&Context
->Event
, IO_NO_INCREMENT
, FALSE
);
1950 KsRemoveBusEnumInterface(
1953 KPROCESSOR_MODE Mode
;
1955 KSREMOVE_BUS_INTERFACE_CTX Ctx
;
1956 WORK_QUEUE_ITEM WorkItem
;
1958 /* get previous mode */
1959 Mode
= ExGetPreviousMode();
1961 /* convert to luid */
1962 luid
= RtlConvertUlongToLuid(SE_LOAD_DRIVER_PRIVILEGE
);
1964 /* perform access check */
1965 if (!SeSinglePrivilegeCheck(luid
, Mode
))
1967 /* insufficient privileges */
1968 return STATUS_PRIVILEGE_NOT_HELD
;
1970 /* initialize event */
1971 KeInitializeEvent(&Ctx
.Event
, NotificationEvent
, FALSE
);
1973 /* store irp in ctx */
1976 /* initialize work item */
1977 ExInitializeWorkItem(&WorkItem
, KspRemoveBusInterface
, (PVOID
)&Ctx
);
1979 /* now queue the work item */
1980 ExQueueWorkItem(&WorkItem
, DelayedWorkQueue
);
1982 /* wait for completion */
1983 KeWaitForSingleObject(&Ctx
.Event
, Executive
, KernelMode
, FALSE
, NULL
);
1986 return Ctx
.Irp
->IoStatus
.Status
;
1997 KsRegisterAggregatedClientUnknown(
1999 IN PUNKNOWN ClientUnknown
)
2010 KsRegisterFilterWithNoKSPins(
2011 IN PDEVICE_OBJECT DeviceObject
,
2012 IN
const GUID
* InterfaceClassGUID
,
2014 IN BOOL
* PinDirection
,
2015 IN KSPIN_MEDIUM
* MediumList
,
2016 IN GUID
* CategoryList OPTIONAL
)
2019 return STATUS_UNSUCCESSFUL
;