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
);
94 /* copy device class */
95 RtlMoveMemory(&SymEntry
->DeviceInterfaceClass
, &Categories
[Index
], sizeof(CLSID
));
97 /* insert symbolic link entry */
98 InsertTailList(SymbolicLinkList
, &SymEntry
->Entry
);
106 KspSetFilterFactoriesState(
107 IN PKSIDEVICE_HEADER DeviceHeader
,
110 PCREATE_ITEM_ENTRY CreateEntry
;
112 NTSTATUS Status
= STATUS_SUCCESS
;
114 /* grab first device interface */
115 Entry
= DeviceHeader
->ItemList
.Flink
;
116 while(Entry
!= &DeviceHeader
->ItemList
&& Status
== STATUS_SUCCESS
)
118 /* grab create entry */
119 CreateEntry
= CONTAINING_RECORD(Entry
, CREATE_ITEM_ENTRY
, Entry
);
122 ASSERT(CreateEntry
->CreateItem
);
124 if (CreateEntry
->CreateItem
->Create
== IKsFilterFactory_Create
)
126 /* found our own filterfactory */
127 Status
= KsFilterFactorySetDeviceClassesState((PKSFILTERFACTORY
)CreateEntry
->CreateItem
->Context
, NewState
);
130 Entry
= Entry
->Flink
;