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
16 Dispatch_fnDeviceIoControl(
17 PDEVICE_OBJECT DeviceObject
,
20 PIO_STACK_LOCATION IoStack
;
22 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
23 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
)
25 return SysAudioHandleProperty(DeviceObject
, Irp
);
28 /* unsupported request */
29 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
30 Irp
->IoStatus
.Information
= 0;
31 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
32 return STATUS_UNSUCCESSFUL
;
38 PDEVICE_OBJECT DeviceObject
,
41 DPRINT("Dispatch_fnClose called DeviceObject %p Irp %p\n", DeviceObject
);
43 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
44 Irp
->IoStatus
.Information
= 0;
45 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
46 return STATUS_SUCCESS
;
49 static KSDISPATCH_TABLE DispatchTable
=
51 Dispatch_fnDeviceIoControl
,
52 KsDispatchInvalidDeviceRequest
,
53 KsDispatchInvalidDeviceRequest
,
54 KsDispatchInvalidDeviceRequest
,
56 KsDispatchInvalidDeviceRequest
,
57 KsDispatchInvalidDeviceRequest
,
58 KsDispatchFastIoDeviceControlFailure
,
59 KsDispatchFastReadFailure
,
60 KsDispatchFastWriteFailure
,
65 DispatchCreateSysAudio(
66 IN PDEVICE_OBJECT DeviceObject
,
70 KSOBJECT_HEADER ObjectHeader
;
71 PKSOBJECT_CREATE_ITEM CreateItem
;
73 DPRINT("DispatchCreateSysAudio entered\n");
75 /* allocate create item */
76 CreateItem
= AllocateItem(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
79 Irp
->IoStatus
.Information
= 0;
80 Irp
->IoStatus
.Status
= STATUS_INSUFFICIENT_RESOURCES
;
81 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
82 return STATUS_INSUFFICIENT_RESOURCES
;
85 /* zero create struct */
86 RtlZeroMemory(CreateItem
, sizeof(KSOBJECT_CREATE_ITEM
));
88 /* setup create context */
89 CreateItem
->Create
= DispatchCreateSysAudioPin
;
90 RtlInitUnicodeString(&CreateItem
->ObjectClass
, KSSTRING_Pin
);
92 /* allocate object header */
93 Status
= KsAllocateObjectHeader(&ObjectHeader
, 1, CreateItem
, Irp
, &DispatchTable
);
95 DPRINT("KsAllocateObjectHeader result %x\n", Status
);
96 /* complete the irp */
97 Irp
->IoStatus
.Information
= 0;
98 Irp
->IoStatus
.Status
= Status
;
99 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
104 SysAudioAllocateDeviceHeader(
105 IN SYSAUDIODEVEXT
*DeviceExtension
)
108 PKSOBJECT_CREATE_ITEM CreateItem
;
110 /* allocate create item */
111 CreateItem
= AllocateItem(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
113 return STATUS_INSUFFICIENT_RESOURCES
;
115 /* initialize create item struct */
116 RtlZeroMemory(CreateItem
, sizeof(KSOBJECT_CREATE_ITEM
));
117 CreateItem
->Create
= DispatchCreateSysAudio
;
119 /* FIXME Sysaudio doesnt need a named create item because it installs itself
120 * via the device interface
122 RtlInitUnicodeString(&CreateItem
->ObjectClass
, L
"GLOBAL");
123 CreateItem
->Flags
= KSCREATE_ITEM_WILDCARD
;
125 Status
= KsAllocateDeviceHeader(&DeviceExtension
->KsDeviceHeader
,
133 IN SYSAUDIODEVEXT
*DeviceExtension
)
136 UNICODE_STRING DeviceInstanceName
= RTL_CONSTANT_STRING(L
"\\Device\\kmixer\\GLOBAL");
137 UNICODE_STRING DevicePath
= RTL_CONSTANT_STRING(L
"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\kmixer");
139 Status
= ZwLoadDriver(&DevicePath
);
141 if (NT_SUCCESS(Status
))
143 Status
= OpenDevice(&DeviceInstanceName
, &DeviceExtension
->KMixerHandle
, &DeviceExtension
->KMixerFileObject
);
144 if (!NT_SUCCESS(Status
))
146 DeviceExtension
->KMixerHandle
= NULL
;
147 DeviceExtension
->KMixerFileObject
= NULL
;
151 DPRINT("Status %lx KMixerHandle %p KMixerFileObject %p\n", Status
, DeviceExtension
->KMixerHandle
, DeviceExtension
->KMixerFileObject
);
152 return STATUS_SUCCESS
;