📄 wdmaud.h
字号:
/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Multimedia
* FILE: lib/wdmaud/wdmaud.h
* PURPOSE: WDM Audio Support - Common header
* PROGRAMMER: Andrew Greenwood
* UPDATE HISTORY:
* Nov 12, 2005: Declarations for debugging + interface
*/
#ifndef __WDMAUD_PRIVATE_H__
#define __WDMAUD_PRIVATE_H__
/* Debugging */
/*
Some of this stuff belongs in ksmedia.h or other such global includes.
*/
#include <stdio.h>
#include <debug.h>
#include <ntddk.h>
#include <windows.h>
#include <mmsystem.h>
#include <mmddk.h>
/* HACK! */
#define DbgPrint printf
/*
Handy macros
*/
#define REPORT_MM_RESULT(message, success) \
DPRINT("%s %s\n", message, success == MMSYSERR_NOERROR ? "succeeded" : "failed")
#define MM_SUCCESS(value) \
( value == MMSYSERR_NOERROR )
#define MM_FAILURE(value) \
( value != MMSYSERR_NOERROR )
#define GOBAL_CALLBACKS_PATH L"Global\\WDMAUD_Callbacks"
/*
Private IOCTLs shared between wdmaud.sys and wdmaud.drv
TO ADD/MODIFY:
IOCTL_WDMAUD_OPEN_PIN
IOCTL_WDMAUD_WAVE_OUT_WRITE_PIN
IOCTL_WDMAUD_WAVE_IN_READ_PIN
IOCTL_WDMAUD_MIXER_CLOSE
IOCTL_WDMAUD_MIXER_OPEN
IOCTL_WDMAUD_MIDI_IN_READ_PIN
IOCTL_WDMAUD_MIXER_GETLINEINFO
IOCTL_WDMAUD_MIXER_GETHARDWAREEVENTDATA
IOCTL_WDMAUD_MIXER_SETCONTROLDETAILS
IOCTL_WDMAUD_MIXER_GETCONTROLDETAILS
IOCTL_WDMAUD_MIXER_GETLINECONTROLS
*/
/* 0x1d8000 */
#define IOCTL_WDMAUD_HELLO \
CTL_CODE(FILE_DEVICE_SOUND, 0x0000, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_WDMAUD_ADD_DEVICE 0x1d8004
#define IOCTL_WDMAUD_REMOVE_DEVICE 0x1d8008
#define IOCTL_WDMAUD_GET_CAPABILITIES 0x1d800c
#define IOCTL_WDMAUD_GET_DEVICE_COUNT 0x1d8010
#define IOCTL_WDMAUD_OPEN_DEVICE 0x1d8014
#define IOCTL_WDMAUD_CLOSE_DEVICE 0x1d8018
#define IOCTL_WDMAUD_AUX_GET_VOLUME 0x1d801c
#define IOCTL_WDMAUD_AUX_SET_VOLUME 0x1d8020
/* 0x1d8024 */
#define IOCTL_WDMAUD_GOODBYE \
CTL_CODE(FILE_DEVICE_SOUND, 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_WDMAUD_SET_PREFERRED 0x1d8028
#define IOCTL_WDMAUD_WAVE_OUT_STOP 0x1d8100
#define IOCTL_WDMAUD_WAVE_OUT_START 0x1d8104
#define IOCTL_WDMAUD_WAVE_OUT_RESET 0x1d8108
#define IOCTL_WDMAUD_BREAK_LOOP 0x1d810c
#define IOCTL_WDMAUD_GET_WAVE_OUT_POS 0x1d8110 /* Does something funky */
#define IOCTL_WDMAUD_SET_VOLUME 0x1d8114 /* Already been covered? */
#define IOCTL_WDMAUD_UNKNOWN1 0x1d8118 /* Not used by wdmaud.drv */
#define IOCTL_WDMAUD_SUBMIT_WAVE_OUT_HDR 0x1d811c
#define IOCTL_WDMAUD_WAVE_IN_STOP 0x1d8140
#define IOCTL_WDMAUD_WAVE_IN_START 0x1d8144
#define IOCTL_WDMAUD_WAVE_IN_RESET 0x1d8148
#define IOCTL_WDMAUD_SUBMIT_WAVE_IN_HDR 0x1d8150 /* FIXME: Unsure about this */
#define IOCTL_WDMAUD_MIDI_OUT_SHORT_MESSAGE \
0x1d8204 /* Wrong description? */
#define IOCTL_WDMAUD_UNKNOWN2 0x1d8208
#define IOCTL_WDMAUD_MIDI_OUT_LONG_MESSAGE \
0x1d820c
#define IOCTL_WDMAUD_SUBMIT_MIDI_HDR 0x1d8210
#define IOCTL_WDMAUD_MIDI_IN_STOP 0x1d8240
#define IOCTL_WDMAUD_MIDI_IN_START 0x1d8244
#define IOCTL_WDMAUD_MIDI_IN_RESET 0x1d8248
#define IOCTL_WDMAUD_READ_MIDI_DATA 0x1d824c
#define IOCTL_WDMAUD_MIDI_MESSAGE 0x1d8300 /* Wrong description? */
#define IOCTL_WDMAUD_MIXER_UNKNOWN1 0x1d8310
#define IOCTL_WDMAUD_MIXER_UNKNOWN2 0x1d8314
#define IOCTL_WDMAUD_MIXER_UNKNOWN3 0x1d8318
/*
Device Types
*/
enum
{
WDMAUD_WAVE_IN = 0,
WDMAUD_WAVE_OUT,
WDMAUD_MIDI_IN,
WDMAUD_MIDI_OUT,
WDMAUD_MIXER,
WDMAUD_AUX,
/* For range checking */
WDMAUD_MIN_DEVICE_TYPE = WDMAUD_WAVE_IN,
WDMAUD_MAX_DEVICE_TYPE = WDMAUD_AUX
};
/*
Some macros for device type matching and checking
*/
#define IsWaveInDeviceType(device_type) (device_type == WDMAUD_WAVE_IN)
#define IsWaveOutDeviceType(device_type) (device_type == WDMAUD_WAVE_OUT)
#define IsMidiInDeviceType(device_type) (device_type == WDMAUD_MIDI_IN)
#define IsMidiOutDeviceType(device_type) (device_type == WDMAUD_MIDI_OUT)
#define IsMixerDeviceType(device_type) (device_type == WDMAUD_MIXER)
#define IsAuxDeviceType(device_type) (device_type == WDMAUD_AUX)
#define IsWaveDeviceType(device_type) \
(IsWaveInDeviceType(device_type) || IsWaveOutDeviceType(device_type))
#define IsMidiDeviceType(device_type) \
(IsMidiInDeviceType(device_type) || IsMidiOutDeviceType(device_type))
#define IsValidDeviceType(device_type) \
(device_type >= WDMAUD_MIN_DEVICE_TYPE && \
device_type <= WDMAUD_MAX_DEVICE_TYPE)
/*
The various "caps" (capabilities) structures begin with the same members,
so a generic structure is defined here which can be accessed independently
of a device type.
*/
/*
This is used as a general-purpose structure to retrieve capabilities
from the driver.
*/
typedef struct
{
DWORD cbSize;
LPVOID pCaps;
} MDEVICECAPSEX, *LPMDEVICECAPSEX;
/* Abstraction */
typedef LPVOID PWDMAUD_HEADER;
/*
There are also various "opendesc" structures, but these don't have any
common members. Regardless, this typedef simply serves as a placeholder
to indicate that to access the members, it should be cast accordingly.
TODO: Maybe have a generic OPEN routine that uses this?
*/
typedef struct OPENDESC *LPOPENDESC;
typedef struct
{
DWORD sample_size;
HANDLE thread;
DWORD thread_id;
union
{
LPWAVEHDR current_wave_header;
LPMIDIHDR current_midi_header;
};
DWORD unknown_10; /* pointer to something */
DWORD unknown_14;
LPCRITICAL_SECTION device_queue_guard;
HANDLE queue_event;
HANDLE exit_thread_event;
DWORD unknown_24;
DWORD is_paused;
DWORD is_running;
DWORD unknown_30;
LPVOID midi_buffer; /* for output ? */
DWORD running_status;
char signature[4];
} WDMAUD_DEVICE_STATE, *PWDMAUD_DEVICE_STATE;
typedef struct
{
DWORD next_device;
DWORD id;
DWORD type;
HWAVE handle;
DWORD client_instance;
DWORD client_callback;
DWORD unknown_18;
DWORD flags;
DWORD ioctl_param2;
DWORD ioctl_param1;
DWORD with_critical_section;
DWORD string_2c;
DWORD unknown_30;
DWORD playing_notes;
DWORD unknown_38;
DWORD unknown_3c;
DWORD unknown_40;
DWORD unknown_44;
DWORD unknown_48;
DWORD unknown_4C;
DWORD unknown_50;
DWORD beef;
PWDMAUD_DEVICE_STATE state;
char signature[4];
WCHAR path[1];
} WDMAUD_DEVICE_INFO, *PWDMAUD_DEVICE_INFO;
typedef struct
{
PWDMAUD_DEVICE_INFO offspring; /* not sure about this */
LPOVERLAPPED overlapped;
char signature[4];
} WDMAUD_WAVE_PREPARATION_DATA, *PWDMAUD_WAVE_PREPARATION_DATA;
/* Ugh... */
typedef struct
{
DWORD cbSize; /* Maybe? */
} WDMAUD_CAPS, *PWDMAUD_CAPS;
/*
Not quite sure what these are/do yet
*/
#define MAGIC_42 0x42424242 /* Queue critical section */
#define MAGIC_43 0x43434343 /* Queue critical section */
#define MAGIC_48 0x48484848 /* Exit-thread event */
#define IsQueueMagic(test_value) \
( ( (DWORD)test_value == MAGIC_42 ) || ( (DWORD)test_value == MAGIC_43) )
/*
This should eventually be removed, but is used so we can be nosey and see
what the kernel-mode wdmaud.sys is doing with our structures!
*/
#ifdef DUMP_WDMAUD_STRUCTURES
#define DUMP_MEMBER(struct, member) \
DPRINT("%s : %d [0x%x]\n", #member, (int) struct->member, (int) struct->member);
#define DUMP_WDMAUD_DEVICE_INFO(info) \
{ \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -