00001 #include <pseh/pseh2.h>
00002 #include <ntddk.h>
00003 #include <portcls.h>
00004 #include <ks.h>
00005 #define NDEBUG
00006 #include <debug.h>
00007 #include <ksmedia.h>
00008 #include <mmreg.h>
00009 #include <mmsystem.h>
00010 #include <stdlib.h>
00011 #include <stdio.h>
00012 #include <wchar.h>
00013 #include "mmixer.h"
00014
00015 #include "interface.h"
00016
00017 typedef struct
00018 {
00019 PMDL Mdl;
00020 ULONG Length;
00021 ULONG Function;
00022 }WDMAUD_COMPLETION_CONTEXT, *PWDMAUD_COMPLETION_CONTEXT;
00023
00024
00025 typedef struct
00026 {
00027 HANDLE Handle;
00028 SOUND_DEVICE_TYPE Type;
00029 ULONG FilterId;
00030 ULONG PinId;
00031 PRKEVENT NotifyEvent;
00032 }WDMAUD_HANDLE, *PWDMAUD_HANDLE;
00033
00034 typedef struct
00035 {
00036 LIST_ENTRY Entry;
00037 HANDLE hProcess;
00038 ULONG NumPins;
00039 WDMAUD_HANDLE * hPins;
00040
00041 LIST_ENTRY MixerEventList;
00042 }WDMAUD_CLIENT, *PWDMAUD_CLIENT;
00043
00044 typedef struct
00045 {
00046 LIST_ENTRY Entry;
00047 ULONG NotificationType;
00048 ULONG Value;
00049 HANDLE hMixer;
00050 }EVENT_ENTRY, *PEVENT_ENTRY;
00051
00052 typedef struct
00053 {
00054 LIST_ENTRY Entry;
00055 UNICODE_STRING SymbolicLink;
00056 }SYSAUDIO_ENTRY, *PSYSAUDIO_ENTRY;
00057
00058 typedef struct
00059 {
00060 KSDEVICE_HEADER DeviceHeader;
00061 PVOID SysAudioNotification;
00062
00063 BOOL DeviceInterfaceSupport;
00064
00065 KSPIN_LOCK Lock;
00066 ULONG NumSysAudioDevices;
00067 LIST_ENTRY SysAudioDeviceList;
00068 HANDLE hSysAudio;
00069 PFILE_OBJECT FileObject;
00070
00071 LIST_ENTRY WdmAudClientList;
00072 }WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION;
00073
00074 typedef struct
00075 {
00076 PWDMAUD_CLIENT ClientInfo;
00077 PWDMAUD_DEVICE_EXTENSION DeviceExtension;
00078 SOUND_DEVICE_TYPE DeviceType;
00079 }PIN_CREATE_CONTEXT, *PPIN_CREATE_CONTEXT;
00080
00081
00082 NTSTATUS
00083 NTAPI
00084 OpenWavePin(
00085 IN PWDMAUD_DEVICE_EXTENSION DeviceExtension,
00086 IN ULONG FilterId,
00087 IN ULONG PinId,
00088 IN LPWAVEFORMATEX WaveFormatEx,
00089 IN ACCESS_MASK DesiredAccess,
00090 OUT PHANDLE PinHandle);
00091
00092 NTSTATUS
00093 WdmAudRegisterDeviceInterface(
00094 IN PDEVICE_OBJECT PhysicalDeviceObject,
00095 IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
00096
00097 NTSTATUS
00098 WdmAudOpenSysAudioDevices(
00099 IN PDEVICE_OBJECT DeviceObject,
00100 IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
00101
00102 NTSTATUS
00103 WdmAudOpenSysaudio(
00104 IN PDEVICE_OBJECT DeviceObject,
00105 IN PWDMAUD_CLIENT *pClient);
00106
00107 NTSTATUS
00108 NTAPI
00109 WdmAudDeviceControl(
00110 IN PDEVICE_OBJECT DeviceObject,
00111 IN PIRP Irp);
00112
00113 NTSTATUS
00114 NTAPI
00115 WdmAudReadWrite(
00116 IN PDEVICE_OBJECT DeviceObject,
00117 IN PIRP Irp);
00118
00119 NTSTATUS
00120 NTAPI
00121 WdmAudWrite(
00122 IN PDEVICE_OBJECT DeviceObject,
00123 IN PIRP Irp);
00124
00125 NTSTATUS
00126 WdmAudControlOpenMixer(
00127 IN PDEVICE_OBJECT DeviceObject,
00128 IN PIRP Irp,
00129 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00130 IN PWDMAUD_CLIENT ClientInfo);
00131
00132 NTSTATUS
00133 WdmAudControlOpenWave(
00134 IN PDEVICE_OBJECT DeviceObject,
00135 IN PIRP Irp,
00136 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00137 IN PWDMAUD_CLIENT ClientInfo);
00138
00139 NTSTATUS
00140 WdmAudControlOpenMidi(
00141 IN PDEVICE_OBJECT DeviceObject,
00142 IN PIRP Irp,
00143 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00144 IN PWDMAUD_CLIENT ClientInfo);
00145
00146 ULONG
00147 GetNumOfMixerDevices(
00148 IN PDEVICE_OBJECT DeviceObject);
00149
00150 NTSTATUS
00151 SetIrpIoStatus(
00152 IN PIRP Irp,
00153 IN NTSTATUS Status,
00154 IN ULONG Length);
00155
00156 NTSTATUS
00157 WdmAudOpenSysAudioDevice(
00158 IN LPWSTR DeviceName,
00159 OUT PHANDLE Handle);
00160
00161 NTSTATUS
00162 FindProductName(
00163 IN LPWSTR PnpName,
00164 IN ULONG ProductNameSize,
00165 OUT LPWSTR ProductName);
00166
00167 NTSTATUS
00168 WdmAudMixerCapabilities(
00169 IN PDEVICE_OBJECT DeviceObject,
00170 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00171 IN PWDMAUD_CLIENT ClientInfo,
00172 IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
00173
00174 NTSTATUS
00175 WdmAudWaveCapabilities(
00176 IN PDEVICE_OBJECT DeviceObject,
00177 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00178 IN PWDMAUD_CLIENT ClientInfo,
00179 IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
00180
00181 NTSTATUS
00182 WdmAudMidiCapabilities(
00183 IN PDEVICE_OBJECT DeviceObject,
00184 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00185 IN PWDMAUD_CLIENT ClientInfo,
00186 IN PWDMAUD_DEVICE_EXTENSION DeviceExtension);
00187
00188 NTSTATUS
00189 NTAPI
00190 WdmAudFrameSize(
00191 IN PDEVICE_OBJECT DeviceObject,
00192 IN PIRP Irp,
00193 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00194 IN PWDMAUD_CLIENT ClientInfo);
00195
00196 NTSTATUS
00197 NTAPI
00198 WdmAudGetLineInfo(
00199 IN PDEVICE_OBJECT DeviceObject,
00200 IN PIRP Irp,
00201 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00202 IN PWDMAUD_CLIENT ClientInfo);
00203
00204 NTSTATUS
00205 NTAPI
00206 WdmAudGetLineControls(
00207 IN PDEVICE_OBJECT DeviceObject,
00208 IN PIRP Irp,
00209 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00210 IN PWDMAUD_CLIENT ClientInfo);
00211
00212 NTSTATUS
00213 NTAPI
00214 WdmAudSetControlDetails(
00215 IN PDEVICE_OBJECT DeviceObject,
00216 IN PIRP Irp,
00217 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00218 IN PWDMAUD_CLIENT ClientInfo);
00219
00220 NTSTATUS
00221 NTAPI
00222 WdmAudGetMixerEvent(
00223 IN PDEVICE_OBJECT DeviceObject,
00224 IN PIRP Irp,
00225 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00226 IN PWDMAUD_CLIENT ClientInfo);
00227
00228 NTSTATUS
00229 NTAPI
00230 WdmAudGetControlDetails(
00231 IN PDEVICE_OBJECT DeviceObject,
00232 IN PIRP Irp,
00233 IN PWDMAUD_DEVICE_INFO DeviceInfo,
00234 IN PWDMAUD_CLIENT ClientInfo);
00235
00236 NTSTATUS
00237 WdmAudMixerInitialize(
00238 IN PDEVICE_OBJECT DeviceObject);
00239
00240 NTSTATUS
00241 NTAPI
00242 WdmAudWaveInitialize(
00243 IN PDEVICE_OBJECT DeviceObject);
00244
00245 ULONG
00246 ClosePin(
00247 IN PWDMAUD_CLIENT ClientInfo,
00248 IN ULONG FilterId,
00249 IN ULONG PinId,
00250 IN SOUND_DEVICE_TYPE DeviceType);
00251
00252 NTSTATUS
00253 InsertPinHandle(
00254 IN PWDMAUD_CLIENT ClientInfo,
00255 IN ULONG FilterId,
00256 IN ULONG PinId,
00257 IN SOUND_DEVICE_TYPE DeviceType,
00258 IN HANDLE PinHandle,
00259 IN ULONG FreeIndex);
00260
00261 NTSTATUS
00262 GetSysAudioDevicePnpName(
00263 IN PDEVICE_OBJECT DeviceObject,
00264 IN ULONG DeviceIndex,
00265 OUT LPWSTR * Device);
00266
00267 NTSTATUS
00268 OpenSysAudioDeviceByIndex(
00269 IN PDEVICE_OBJECT DeviceObject,
00270 IN ULONG DeviceIndex,
00271 IN PHANDLE DeviceHandle,
00272 IN PFILE_OBJECT * FileObject);
00273
00274 NTSTATUS
00275 OpenDevice(
00276 IN LPWSTR Device,
00277 OUT PHANDLE DeviceHandle,
00278 OUT PFILE_OBJECT * FileObject);
00279
00280 ULONG
00281 WdmAudGetMixerDeviceCount(VOID);
00282
00283 ULONG
00284 WdmAudGetWaveInDeviceCount(VOID);
00285
00286 ULONG
00287 WdmAudGetWaveOutDeviceCount(VOID);
00288
00289 ULONG
00290 WdmAudGetMidiInDeviceCount(VOID);
00291
00292 ULONG
00293 WdmAudGetMidiOutDeviceCount(VOID);
00294
00295 NTSTATUS
00296 WdmAudGetPnpNameByIndexAndType(
00297 IN ULONG DeviceIndex,
00298 IN SOUND_DEVICE_TYPE DeviceType,
00299 OUT LPWSTR *Device);
00300
00301
00302
00303
00304 ULONG
00305 GetSysAudioDeviceCount(
00306 IN PDEVICE_OBJECT DeviceObject);
00307
00308
00309 PVOID
00310 AllocateItem(
00311 IN POOL_TYPE PoolType,
00312 IN SIZE_T NumberOfBytes);
00313
00314 VOID
00315 FreeItem(
00316 IN PVOID Item);
00317