6c0f58de9837f920c024b6982f9687c72fa36af1
[reactos.git] / drivers / wdm / audio / sysaudio / dispatcher.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/sysaudio/dispatcher.c
5 * PURPOSE: System Audio graph builder
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9 #include "sysaudio.h"
10
11 NTSTATUS
12 NTAPI
13 Dispatch_fnDeviceIoControl(
14 PDEVICE_OBJECT DeviceObject,
15 PIRP Irp)
16 {
17 PIO_STACK_LOCATION IoStack;
18
19 IoStack = IoGetCurrentIrpStackLocation(Irp);
20 if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY)
21 {
22 return SysAudioHandleProperty(DeviceObject, Irp);
23 }
24
25 /* unsupported request */
26 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
27 Irp->IoStatus.Information = 0;
28 IoCompleteRequest(Irp, IO_NO_INCREMENT);
29 return STATUS_UNSUCCESSFUL;
30 }
31
32 NTSTATUS
33 NTAPI
34 Dispatch_fnClose(
35 PDEVICE_OBJECT DeviceObject,
36 PIRP Irp)
37 {
38 DPRINT("Dispatch_fnClose called DeviceObject %p Irp %p\n", DeviceObject);
39
40 Irp->IoStatus.Status = STATUS_SUCCESS;
41 Irp->IoStatus.Information = 0;
42 IoCompleteRequest(Irp, IO_NO_INCREMENT);
43 return STATUS_SUCCESS;
44 }
45
46 static KSDISPATCH_TABLE DispatchTable =
47 {
48 Dispatch_fnDeviceIoControl,
49 KsDispatchInvalidDeviceRequest,
50 KsDispatchInvalidDeviceRequest,
51 KsDispatchInvalidDeviceRequest,
52 Dispatch_fnClose,
53 KsDispatchInvalidDeviceRequest,
54 KsDispatchInvalidDeviceRequest,
55 KsDispatchFastIoDeviceControlFailure,
56 KsDispatchFastReadFailure,
57 KsDispatchFastWriteFailure,
58 };
59
60 NTSTATUS
61 NTAPI
62 DispatchCreateSysAudio(
63 IN PDEVICE_OBJECT DeviceObject,
64 IN PIRP Irp)
65 {
66 NTSTATUS Status;
67 KSOBJECT_HEADER ObjectHeader;
68 PKSOBJECT_CREATE_ITEM CreateItem;
69
70 DPRINT("DispatchCreateSysAudio entered\n");
71
72 /* allocate create item */
73 CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
74 if (!CreateItem)
75 {
76 Irp->IoStatus.Information = 0;
77 Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
78 IoCompleteRequest(Irp, IO_NO_INCREMENT);
79 return STATUS_INSUFFICIENT_RESOURCES;
80 }
81
82 /* zero create struct */
83 RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
84
85 /* setup create context */
86 CreateItem->Create = DispatchCreateSysAudioPin;
87 RtlInitUnicodeString(&CreateItem->ObjectClass, KSSTRING_Pin);
88
89 /* allocate object header */
90 Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
91
92 DPRINT("KsAllocateObjectHeader result %x\n", Status);
93 /* complete the irp */
94 Irp->IoStatus.Information = 0;
95 Irp->IoStatus.Status = Status;
96 IoCompleteRequest(Irp, IO_NO_INCREMENT);
97 return Status;
98 }
99
100 NTSTATUS
101 SysAudioAllocateDeviceHeader(
102 IN SYSAUDIODEVEXT *DeviceExtension)
103 {
104 NTSTATUS Status;
105 PKSOBJECT_CREATE_ITEM CreateItem;
106
107 /* allocate create item */
108 CreateItem = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
109 if (!CreateItem)
110 return STATUS_INSUFFICIENT_RESOURCES;
111
112 /* initialize create item struct */
113 RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
114 CreateItem->Create = DispatchCreateSysAudio;
115
116 /* FIXME Sysaudio doesnt need a named create item because it installs itself
117 * via the device interface
118 */
119 RtlInitUnicodeString(&CreateItem->ObjectClass, L"GLOBAL");
120 CreateItem->Flags = KSCREATE_ITEM_WILDCARD;
121
122 Status = KsAllocateDeviceHeader(&DeviceExtension->KsDeviceHeader,
123 1,
124 CreateItem);
125 return Status;
126 }
127
128 NTSTATUS
129 SysAudioOpenKMixer(
130 IN SYSAUDIODEVEXT *DeviceExtension)
131 {
132 NTSTATUS Status;
133 UNICODE_STRING DeviceInstanceName = RTL_CONSTANT_STRING(L"\\Device\\kmixer\\GLOBAL");
134 UNICODE_STRING DevicePath = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\kmixer");
135
136 Status = ZwLoadDriver(&DevicePath);
137
138 if (NT_SUCCESS(Status))
139 {
140 Status = OpenDevice(&DeviceInstanceName, &DeviceExtension->KMixerHandle, &DeviceExtension->KMixerFileObject);
141 if (!NT_SUCCESS(Status))
142 {
143 DeviceExtension->KMixerHandle = NULL;
144 DeviceExtension->KMixerFileObject = NULL;
145 }
146 }
147
148 DPRINT("Status %lx KMixerHandle %p KMixerFileObject %p\n", Status, DeviceExtension->KMixerHandle, DeviceExtension->KMixerFileObject);
149 return STATUS_SUCCESS;
150 }