[KS]
[reactos.git] / reactos / drivers / ksfilter / ks / deviceinterface.c
1 #include "priv.h"
2
3 #define NDEBUG
4 #include <debug.h>
5
6 NTSTATUS
7 KspSetDeviceInterfacesState(
8 IN PLIST_ENTRY ListHead,
9 IN BOOL Enable)
10 {
11 NTSTATUS Status = STATUS_SUCCESS;
12 PLIST_ENTRY Entry;
13 PSYMBOLIC_LINK_ENTRY SymEntry;
14
15
16 Entry = ListHead->Flink;
17 while(Entry != ListHead)
18 {
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);
23
24 DPRINT("KspSetDeviceInterfacesState SymbolicLink '%S' Status %lx\n", SymEntry->SymbolicLink.Buffer, Status, Enable);
25
26 /* check for success */
27 if (!NT_SUCCESS(Status))
28 return Status;
29 /* get next entry */
30 Entry = Entry->Flink;
31 }
32 /* return result */
33 return Status;
34 }
35
36 NTSTATUS
37 KspFreeDeviceInterfaces(
38 IN PLIST_ENTRY ListHead)
39 {
40 PLIST_ENTRY Entry;
41 PSYMBOLIC_LINK_ENTRY SymEntry;
42
43 while(!IsListEmpty(ListHead))
44 {
45 /* remove first entry */
46 Entry = RemoveHeadList(ListHead);
47
48 /* fetch symbolic link entry */
49 SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry);
50
51 /* free device interface string */
52 RtlFreeUnicodeString(&SymEntry->SymbolicLink);
53 /* free entry item */
54 FreeItem(Entry);
55 }
56
57 return STATUS_SUCCESS;
58 }
59
60 NTSTATUS
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)
67 {
68 ULONG Index;
69 NTSTATUS Status = STATUS_SUCCESS;
70 PSYMBOLIC_LINK_ENTRY SymEntry;
71
72 for(Index = 0; Index < CategoriesCount; Index++)
73 {
74 /* allocate a symbolic link entry */
75 SymEntry = AllocateItem(NonPagedPool, sizeof(SYMBOLIC_LINK_ENTRY));
76 /* check for success */
77 if (!SymEntry)
78 return STATUS_INSUFFICIENT_RESOURCES;
79
80 /* now register device interface */
81 Status = IoRegisterDeviceInterface(PhysicalDeviceObject,
82 &Categories[Index],
83 ReferenceString,
84 &SymEntry->SymbolicLink);
85
86 if (!NT_SUCCESS(Status))
87 {
88 DPRINT1("Failed to register device interface %x\n", Status);
89
90 /* free entry */
91 FreeItem(SymEntry);
92
93 /* return result */
94 return Status;
95 }
96
97 /* copy device class */
98 RtlMoveMemory(&SymEntry->DeviceInterfaceClass, &Categories[Index], sizeof(CLSID));
99
100 /* insert symbolic link entry */
101 InsertTailList(SymbolicLinkList, &SymEntry->Entry);
102 }
103
104 /* return result */
105 return Status;
106 }
107
108 NTSTATUS
109 KspSetFilterFactoriesState(
110 IN PKSIDEVICE_HEADER DeviceHeader,
111 IN BOOLEAN NewState)
112 {
113 PCREATE_ITEM_ENTRY CreateEntry;
114 PLIST_ENTRY Entry;
115 NTSTATUS Status = STATUS_SUCCESS;
116
117 /* grab first device interface */
118 Entry = DeviceHeader->ItemList.Flink;
119 while(Entry != &DeviceHeader->ItemList && Status == STATUS_SUCCESS)
120 {
121 /* grab create entry */
122 CreateEntry = CONTAINING_RECORD(Entry, CREATE_ITEM_ENTRY, Entry);
123
124 /* sanity check */
125 ASSERT(CreateEntry->CreateItem);
126
127 if (CreateEntry->CreateItem->Create == IKsFilterFactory_Create)
128 {
129 /* found our own filterfactory */
130 Status = KsFilterFactorySetDeviceClassesState((PKSFILTERFACTORY)CreateEntry->CreateItem->Context, NewState);
131 }
132
133 Entry = Entry->Flink;
134 }
135
136 /* store result */
137 return Status;
138 }