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
13 Dispatch_fnDeviceIoControl(
14 PDEVICE_OBJECT DeviceObject
,
17 PIO_STACK_LOCATION IoStack
;
19 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
20 if (IoStack
->Parameters
.DeviceIoControl
.IoControlCode
== IOCTL_KS_PROPERTY
)
22 return SysAudioHandleProperty(DeviceObject
, Irp
);
25 /* unsupported request */
26 Irp
->IoStatus
.Status
= STATUS_UNSUCCESSFUL
;
27 Irp
->IoStatus
.Information
= 0;
28 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
29 return STATUS_UNSUCCESSFUL
;
35 PDEVICE_OBJECT DeviceObject
,
38 DPRINT("Dispatch_fnClose called DeviceObject %p Irp %p\n", DeviceObject
);
40 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
41 Irp
->IoStatus
.Information
= 0;
42 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
43 return STATUS_SUCCESS
;
46 static KSDISPATCH_TABLE DispatchTable
=
48 Dispatch_fnDeviceIoControl
,
49 KsDispatchInvalidDeviceRequest
,
50 KsDispatchInvalidDeviceRequest
,
51 KsDispatchInvalidDeviceRequest
,
53 KsDispatchInvalidDeviceRequest
,
54 KsDispatchInvalidDeviceRequest
,
55 KsDispatchFastIoDeviceControlFailure
,
56 KsDispatchFastReadFailure
,
57 KsDispatchFastWriteFailure
,
62 DispatchCreateSysAudio(
63 IN PDEVICE_OBJECT DeviceObject
,
67 KSOBJECT_HEADER ObjectHeader
;
68 PKSOBJECT_CREATE_ITEM CreateItem
;
70 DPRINT("DispatchCreateSysAudio entered\n");
72 /* allocate create item */
73 CreateItem
= AllocateItem(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
76 Irp
->IoStatus
.Information
= 0;
77 Irp
->IoStatus
.Status
= STATUS_INSUFFICIENT_RESOURCES
;
78 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
79 return STATUS_INSUFFICIENT_RESOURCES
;
82 /* zero create struct */
83 RtlZeroMemory(CreateItem
, sizeof(KSOBJECT_CREATE_ITEM
));
85 /* setup create context */
86 CreateItem
->Create
= DispatchCreateSysAudioPin
;
87 RtlInitUnicodeString(&CreateItem
->ObjectClass
, KSSTRING_Pin
);
89 /* allocate object header */
90 Status
= KsAllocateObjectHeader(&ObjectHeader
, 1, CreateItem
, Irp
, &DispatchTable
);
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
);
101 SysAudioAllocateDeviceHeader(
102 IN SYSAUDIODEVEXT
*DeviceExtension
)
105 PKSOBJECT_CREATE_ITEM CreateItem
;
107 /* allocate create item */
108 CreateItem
= AllocateItem(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
));
110 return STATUS_INSUFFICIENT_RESOURCES
;
112 /* initialize create item struct */
113 RtlZeroMemory(CreateItem
, sizeof(KSOBJECT_CREATE_ITEM
));
114 CreateItem
->Create
= DispatchCreateSysAudio
;
116 /* FIXME Sysaudio doesnt need a named create item because it installs itself
117 * via the device interface
119 RtlInitUnicodeString(&CreateItem
->ObjectClass
, L
"GLOBAL");
120 CreateItem
->Flags
= KSCREATE_ITEM_WILDCARD
;
122 Status
= KsAllocateDeviceHeader(&DeviceExtension
->KsDeviceHeader
,
130 IN SYSAUDIODEVEXT
*DeviceExtension
)
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");
136 Status
= ZwLoadDriver(&DevicePath
);
138 if (NT_SUCCESS(Status
))
140 Status
= OpenDevice(&DeviceInstanceName
, &DeviceExtension
->KMixerHandle
, &DeviceExtension
->KMixerFileObject
);
141 if (!NT_SUCCESS(Status
))
143 DeviceExtension
->KMixerHandle
= NULL
;
144 DeviceExtension
->KMixerFileObject
= NULL
;
148 DPRINT("Status %lx KMixerHandle %p KMixerFileObject %p\n", Status
, DeviceExtension
->KMixerHandle
, DeviceExtension
->KMixerFileObject
);
149 return STATUS_SUCCESS
;