4 KspSetDeviceInterfacesState(
5 IN PLIST_ENTRY ListHead
,
8 NTSTATUS Status
= STATUS_SUCCESS
;
10 PSYMBOLIC_LINK_ENTRY SymEntry
;
13 Entry
= ListHead
->Flink
;
14 while(Entry
!= ListHead
)
16 /* fetch symbolic link entry */
17 SymEntry
= (PSYMBOLIC_LINK_ENTRY
)CONTAINING_RECORD(Entry
, SYMBOLIC_LINK_ENTRY
, Entry
);
18 /* set device interface state */
19 Status
= IoSetDeviceInterfaceState(&SymEntry
->SymbolicLink
, Enable
);
21 DPRINT("KspSetDeviceInterfacesState SymbolicLink '%S' Status %lx\n", SymEntry
->SymbolicLink
.Buffer
, Status
, Enable
);
23 /* check for success */
24 if (!NT_SUCCESS(Status
))
34 KspFreeDeviceInterfaces(
35 IN PLIST_ENTRY ListHead
)
38 PSYMBOLIC_LINK_ENTRY SymEntry
;
40 while(!IsListEmpty(ListHead
))
42 /* remove first entry */
43 Entry
= RemoveHeadList(ListHead
);
45 /* fetch symbolic link entry */
46 SymEntry
= (PSYMBOLIC_LINK_ENTRY
)CONTAINING_RECORD(Entry
, SYMBOLIC_LINK_ENTRY
, Entry
);
48 /* free device interface string */
49 RtlFreeUnicodeString(&SymEntry
->SymbolicLink
);
54 return STATUS_SUCCESS
;
58 KspRegisterDeviceInterfaces(
59 IN PDEVICE_OBJECT PhysicalDeviceObject
,
60 IN ULONG CategoriesCount
,
61 IN GUID
const*Categories
,
62 IN PUNICODE_STRING ReferenceString
,
63 OUT PLIST_ENTRY SymbolicLinkList
)
66 NTSTATUS Status
= STATUS_SUCCESS
;
67 PSYMBOLIC_LINK_ENTRY SymEntry
;
69 for(Index
= 0; Index
< CategoriesCount
; Index
++)
71 /* allocate a symbolic link entry */
72 SymEntry
= AllocateItem(NonPagedPool
, sizeof(SYMBOLIC_LINK_ENTRY
));
73 /* check for success */
75 return STATUS_INSUFFICIENT_RESOURCES
;
77 /* now register device interface */
78 Status
= IoRegisterDeviceInterface(PhysicalDeviceObject
,
81 &SymEntry
->SymbolicLink
);
83 if (!NT_SUCCESS(Status
))
85 DPRINT1("Failed to register device interface %x\n", Status
);
93 /* insert symbolic link entry */
94 InsertTailList(SymbolicLinkList
, &SymEntry
->Entry
);
102 KspSetFilterFactoriesState(
103 IN PKSIDEVICE_HEADER DeviceHeader
,
106 PCREATE_ITEM_ENTRY CreateEntry
;
108 NTSTATUS Status
= STATUS_SUCCESS
;
110 /* grab first device interface */
111 Entry
= DeviceHeader
->ItemList
.Flink
;
112 while(Entry
!= &DeviceHeader
->ItemList
&& Status
== STATUS_SUCCESS
)
114 /* grab create entry */
115 CreateEntry
= CONTAINING_RECORD(Entry
, CREATE_ITEM_ENTRY
, Entry
);
118 ASSERT(CreateEntry
->CreateItem
);
120 if (CreateEntry
->CreateItem
->Create
== IKsFilterFactory_Create
)
122 /* found our own filterfactory */
123 Status
= KsFilterFactorySetDeviceClassesState((PKSFILTERFACTORY
)CreateEntry
->CreateItem
->Context
, NewState
);
126 Entry
= Entry
->Flink
;