7 KspSetDeviceInterfacesState(
8 IN PLIST_ENTRY ListHead
,
11 NTSTATUS Status
= STATUS_SUCCESS
;
13 PSYMBOLIC_LINK_ENTRY SymEntry
;
16 Entry
= ListHead
->Flink
;
17 while(Entry
!= ListHead
)
19 /* fetch symbolic link entry */
20 SymEntry
= (PSYMBOLIC_LINK_ENTRY
)CONTAINING_RECORD(Entry
, SYMBOLIC_LINK_ENTRY
, Entry
);
21 /* set device interface state */
22 Status
= IoSetDeviceInterfaceState(&SymEntry
->SymbolicLink
, Enable
);
24 DPRINT("KspSetDeviceInterfacesState SymbolicLink '%S' Status %lx\n", SymEntry
->SymbolicLink
.Buffer
, Status
, Enable
);
26 /* check for success */
27 if (!NT_SUCCESS(Status
))
37 KspFreeDeviceInterfaces(
38 IN PLIST_ENTRY ListHead
)
41 PSYMBOLIC_LINK_ENTRY SymEntry
;
43 while(!IsListEmpty(ListHead
))
45 /* remove first entry */
46 Entry
= RemoveHeadList(ListHead
);
48 /* fetch symbolic link entry */
49 SymEntry
= (PSYMBOLIC_LINK_ENTRY
)CONTAINING_RECORD(Entry
, SYMBOLIC_LINK_ENTRY
, Entry
);
51 /* free device interface string */
52 RtlFreeUnicodeString(&SymEntry
->SymbolicLink
);
57 return STATUS_SUCCESS
;
61 KspRegisterDeviceInterfaces(
62 IN PDEVICE_OBJECT PhysicalDeviceObject
,
63 IN ULONG CategoriesCount
,
64 IN GUID
const*Categories
,
65 IN PUNICODE_STRING ReferenceString
,
66 OUT PLIST_ENTRY SymbolicLinkList
)
69 NTSTATUS Status
= STATUS_SUCCESS
;
70 PSYMBOLIC_LINK_ENTRY SymEntry
;
72 for(Index
= 0; Index
< CategoriesCount
; Index
++)
74 /* allocate a symbolic link entry */
75 SymEntry
= AllocateItem(NonPagedPool
, sizeof(SYMBOLIC_LINK_ENTRY
));
76 /* check for success */
78 return STATUS_INSUFFICIENT_RESOURCES
;
80 /* now register device interface */
81 Status
= IoRegisterDeviceInterface(PhysicalDeviceObject
,
84 &SymEntry
->SymbolicLink
);
86 if (!NT_SUCCESS(Status
))
88 DPRINT1("Failed to register device interface %x\n", Status
);
97 /* copy device class */
98 RtlMoveMemory(&SymEntry
->DeviceInterfaceClass
, &Categories
[Index
], sizeof(CLSID
));
100 /* insert symbolic link entry */
101 InsertTailList(SymbolicLinkList
, &SymEntry
->Entry
);
109 KspSetFilterFactoriesState(
110 IN PKSIDEVICE_HEADER DeviceHeader
,
113 PCREATE_ITEM_ENTRY CreateEntry
;
115 NTSTATUS Status
= STATUS_SUCCESS
;
117 /* grab first device interface */
118 Entry
= DeviceHeader
->ItemList
.Flink
;
119 while(Entry
!= &DeviceHeader
->ItemList
&& Status
== STATUS_SUCCESS
)
121 /* grab create entry */
122 CreateEntry
= CONTAINING_RECORD(Entry
, CREATE_ITEM_ENTRY
, Entry
);
125 ASSERT(CreateEntry
->CreateItem
);
127 if (CreateEntry
->CreateItem
->Create
== IKsFilterFactory_Create
)
129 /* found our own filterfactory */
130 Status
= KsFilterFactorySetDeviceClassesState((PKSFILTERFACTORY
)CreateEntry
->CreateItem
->Context
, NewState
);
133 Entry
= Entry
->Flink
;