Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

817 lines
21 KiB

/******************************Module*Header*******************************\
* Module Name: mmwow32.h
*
* This file types, function declarations and macro for the 32 bit MM thunks
*
* Created: 1-Jul-1993
* Author: Stephen Estrop [StephenE]
*
* Copyright (c) 1993-1996 Microsoft Corporation
\**************************************************************************/
#include <wownt32.h>
#ifdef _INC_ALL_WOWSTUFF
/****************************************************************************\
**
** 16 bit structures
**
\****************************************************************************/
#pragma pack(1)
typedef WORD HANDLE16;
typedef WORD MMVER16; // major (high byte), minor (low byte)
// waveform input and output device open information structure
typedef struct waveopendesc16_tag {
HANDLE16 hWave; // handle (16 bit)
LPWAVEFORMAT lpFormat; // format of wave data (16:16 ptr)
DWORD dwCallback; // callback
DWORD dwInstance; // app's private instance information
} WAVEOPENDESC16;
typedef WAVEOPENDESC16 UNALIGNED *LPWAVEOPENDESC16;
typedef struct _WAVEHDR16 { /* whd16 */
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops;
struct _WAVEHDR16 far *lpNext;
DWORD reserved;
} WAVEHDR16;
typedef WAVEHDR16 UNALIGNED *PWAVEHDR16;
typedef struct _WAVEOCUTCAPS16 {
WORD wMid;
WORD wPid;
MMVER16 vDriverVersion;
char szPname[MAXPNAMELEN];
DWORD dwFormats;
WORD wChannels;
DWORD dwSupport;
} WAVEOUTCAPS16;
typedef WAVEOUTCAPS16 UNALIGNED *LPWAVEOUTCAPS16;
typedef struct _WAVEINCAPS16 { /* wic16 */
WORD wMid;
WORD wPid;
MMVER16 vDriverVersion;
char szPname[MAXPNAMELEN];
DWORD dwFormats;
WORD wChannels;
} WAVEINCAPS16;
typedef WAVEINCAPS16 UNALIGNED *LPWAVEINCAPS16;
typedef struct midiopendesc16_tag {
HANDLE16 hMidi; /* handle */
DWORD dwCallback; /* callback */
DWORD dwInstance; /* app's private instance information */
} MIDIOPENDESC16;
typedef MIDIOPENDESC16 UNALIGNED *LPMIDIOPENDESC16;
typedef struct _MIDIHDR16 { /* mhdr16 */
LPSTR lpData;
DWORD dwBufferLength;
DWORD dwBytesRecorded;
DWORD dwUser;
DWORD dwFlags;
struct _MIDIHDR16 far *lpNext;
DWORD reserved;
} MIDIHDR16;
typedef MIDIHDR16 UNALIGNED *PMIDIHDR16;
typedef struct _MIDIOUTCAPS16 {
WORD wMid; /* manufacturer ID */
WORD wPid; /* product ID */
MMVER16 vDriverVersion; /* version of the driver */
char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
WORD wTechnology; /* type of device */
WORD wVoices; /* # of voices (internal synth only) */
WORD wNotes; /* max # of notes (internal synth only) */
WORD wChannelMask; /* channels used (internal synth only) */
DWORD dwSupport; /* functionality supported by driver */
} MIDIOUTCAPS16;
typedef MIDIOUTCAPS16 UNALIGNED *LPMIDIOUTCAPS16;
typedef struct _MIDINCAPS16 {
WORD wMid; /* manufacturer ID */
WORD wPid; /* product ID */
MMVER16 vDriverVersion; /* version of the driver */
char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */
} MIDIINCAPS16;
typedef MIDIINCAPS16 UNALIGNED *LPMIDIINCAPS16;
typedef struct _MMTIME16 { /* mmt16 */
WORD wType;
union {
DWORD ms;
DWORD sample;
DWORD cb;
struct {
BYTE hour;
BYTE min;
BYTE sec;
BYTE frame;
BYTE fps;
BYTE dummy;
} smpte;
struct {
DWORD songptrpos;
} midi;
} u;
} MMTIME16;
typedef MMTIME16 UNALIGNED *LPMMTIME16;
typedef struct timerevent16_tag {
WORD wDelay; /* delay required */
WORD wResolution; /* resolution required */
LPTIMECALLBACK lpFunction; /* ptr to callback function */
DWORD dwUser; /* user DWORD */
WORD wFlags; /* defines how to program event */
} TIMEREVENT16;
typedef TIMEREVENT16 UNALIGNED *LPTIMEREVENT16;
typedef struct timecaps16_tag {
WORD wPeriodMin; /* minimum period supported */
WORD wPeriodMax; /* maximum period supported */
} TIMECAPS16;
typedef TIMECAPS16 UNALIGNED *LPTIMECAPS16;
typedef struct _AUXCAPS16 {
WORD wMid;
WORD wPid;
MMVER16 vDriverVersion;
char szPname[MAXPNAMELEN];
WORD wTechnology;
DWORD dwSupport;
} AUXCAPS16;
typedef AUXCAPS16 UNALIGNED *LPAUXCAPS16;
typedef struct _JOYCAPS16 {
WORD wMid;
WORD wPid;
MMVER16 vDriverVersion;
char szPname[MAXPNAMELEN];
WORD wXmin;
WORD wXmax;
WORD wYmin;
WORD wYmax;
WORD wZmin;
WORD wZmax;
WORD wNumButtons;
WORD wPeriodMin;
WORD wPeriodMax;
} JOYCAPS16;
typedef JOYCAPS16 UNALIGNED *LPJOYCAPS16;
typedef struct _JOYINFO16 {
WORD wXpos;
WORD wYpos;
WORD wZpos;
WORD wButtons;
} JOYINFO16;
typedef JOYINFO16 UNALIGNED *LPJOYINFO16;
#pragma pack()
/****************************************************************************\
**
** 32 bit structures
**
\****************************************************************************/
typedef struct _INSTANCEDATA {
DWORD dwCallback; //Callback function or window handle
DWORD dwCallbackInstance; //Instance data for callback function (only)
DWORD dwFlags; //Flags
HANDLE16 Hand16;
} INSTANCEDATA, *PINSTANCEDATA;
typedef struct _WAVEHDR32 {
PWAVEHDR16 pWavehdr32; //32 bit address to 16 bit WAVEHDR
PWAVEHDR16 pWavehdr16; //16 bit address to 16 bit WAVEHDR
WAVEHDR Wavehdr; //32 bit address to 32 bit WAVEHDR
} WAVEHDR32, *PWAVEHDR32;
typedef struct _MIDIHDR32 {
DWORD reserved; //Saved value of reserved.
PMIDIHDR16 pMidihdr32; //32 bit address to 16 bit MIDIHDR
PMIDIHDR16 pMidihdr16; //16 bit address to 16 bit MIDIHDR
MIDIHDR Midihdr; //32 bit address to 32 bit MIDIHDR
} MIDIHDR32, *PMIDIHDR32;
/****************************************************************************\
** Function prototypes
**
**
\****************************************************************************/
BOOL
WINAPI LibMain(
HINSTANCE hInst,
DWORD dwReason,
LPVOID lpReserved
);
DWORD
WINAPI wod32Message(
UINT uDeviceID,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
DWORD
WINAPI wid32Message(
UINT uDeviceID,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
DWORD
WINAPI mod32Message(
UINT uDeviceID,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
DWORD
WINAPI mid32Message(
UINT uDeviceID,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
DWORD
WINAPI aux32Message(
UINT uDeviceID,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
void
CopyAuxCaps(
LPAUXCAPS16 lpCaps16,
LPAUXCAPS lpCaps32,
DWORD dwSize
);
DWORD WINAPI
tid32Message(
UINT uDevId,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
VOID
W32CommonDeviceCB(
HANDLE handle,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
PWAVEHDR16
GetWaveHdr16(
DWORD vpwhdr,
LPWAVEHDR lpwhdr
);
void
PutWaveHdr16(
WAVEHDR16 UNALIGNED *pwhdr16,
LPWAVEHDR lpwhdr
);
BOOL
WOW32DriverCallback(
DWORD dwCallback,
DWORD dwFlags,
WORD wID,
WORD wMsg,
DWORD dwUser,
DWORD dw1,
DWORD dw2
);
void
CopyWaveOutCaps(
LPWAVEOUTCAPS16 lpCaps16,
LPWAVEOUTCAPS lpCaps32,
DWORD dwSize
);
void
CopyWaveInCaps(
LPWAVEINCAPS16 lpCaps16,
LPWAVEINCAPS lpCaps32,
DWORD dwSize
);
void
CopyMidiOutCaps(
LPMIDIOUTCAPS16 lpCaps16,
LPMIDIOUTCAPS lpCaps32,
DWORD dwSize
);
void
CopyMidiInCaps(
LPMIDIINCAPS16 lpCaps16,
LPMIDIINCAPS lpCaps32,
DWORD dwSize
);
void
GetMMTime(
LPMMTIME16 lpTime16,
LPMMTIME lpTime32
);
void
PutMMTime(
LPMMTIME16 lpTime16,
LPMMTIME lpTime32
);
#define WAVE_OUT_DEVICE 1
#define WAVE_IN_DEVICE 0
DWORD
ThunkCommonWaveOpen(
int iWhich,
UINT uDeviceID,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwUSer
);
DWORD
ThunkCommonWaveReadWrite(
int iWhich,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwInstance
);
DWORD
ThunkCommonWavePrepareHeader(
HWAVE hWave,
DWORD dwParam1,
int iWhich
);
DWORD
ThunkCommonWaveUnprepareHeader(
HWAVE hWave,
DWORD dwParam1,
int iWhich
);
#define MIDI_OUT_DEVICE 1
#define MIDI_IN_DEVICE 0
DWORD
ThunkCommonMidiOpen(
int iWhich,
UINT uDeviceID,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwInstance
);
DWORD
ThunkCommonMidiReadWrite(
int iWhich,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwInstance
);
DWORD
ThunkCommonMidiPrepareHeader(
HMIDI hWave,
DWORD dwParam1,
int iWhich
);
DWORD
ThunkCommonMidiUnprepareHeader(
HMIDI hWave,
DWORD dwParam1,
int iWhich
);
PMIDIHDR16
GetMidiHdr16(
DWORD vpmhdr,
LPMIDIHDR lpmhdr
);
void
PutMidiHdr16(
MIDIHDR UNALIGNED *pmhdr16,
LPMIDIHDR lpmhdr
);
DWORD WINAPI
joy32Message(
UINT uID,
UINT uMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
/* -------------------------------------------------------------------------
** MCI Stuff
** -------------------------------------------------------------------------
*/
#define THUNK_MCI_SENDCOMMAND 0x0001
#define THUNK_MCI_SENDSTRING 0x0002
#define THUNK_MCI_GETDEVICEID 0x0003
#define THUNK_MCI_GETDEVIDFROMELEMID 0x0004
#define THUNK_MCI_GETERRORSTRING 0x0005
#define THUNK_MCI_EXECUTE 0x0006
#define THUNK_MCI_SETYIELDPROC 0x0007
#define THUNK_MCI_GETYIELDPROC 0x0008
#define THUNK_MCI_GETCREATORTASK 0x0009
#define THUNK_TIMEGETTIME 0x000A
#define THUNK_APP_EXIT 0x000B
#define THUNK_MCI_ALLOCATE_NODE 0x000C
#define THUNK_MCI_FREE_NODE 0x000D
DWORD WINAPI
mci32Message(
DWORD dwApi,
DWORD dwF1,
DWORD dwF2,
DWORD dwF3,
DWORD dwF4
);
DWORD
WMM32mciSendCommand(
DWORD dwF1,
DWORD dwF2,
DWORD dwF3,
DWORD dwF4
);
DWORD
WMM32mciSendString(
DWORD dwF1,
DWORD dwF2,
DWORD dwF3,
DWORD dwF4
);
DWORD
WMM32mciGetDeviceID(
DWORD dwF1
);
DWORD
WMM32mciGetErrorString(
DWORD dwF1,
DWORD dwF2,
DWORD dwF3
);
DWORD
WMM32mciExecute(
DWORD dwF1
);
DWORD
WMM32mciGetDeviceIDFromElementID(
DWORD dwF1,
DWORD dwF2
);
DWORD
WMM32mciGetCreatorTask(
DWORD dwF1
);
DWORD
WMM32mciSetYieldProc(
DWORD dwF1,
DWORD dwF2,
DWORD dwF3
);
UINT
WMM32mciYieldProc(
MCIDEVICEID wDeviceID,
DWORD dwYieldData
);
DWORD
WMM32mciGetYieldProc(
DWORD dwF1,
DWORD dwF2
);
DWORD
WMM32mciAllocateNode(
DWORD dwF1, // dwOpenFlags
DWORD dwF2 // lpszDeviceName
);
DWORD
WMM32mciFreeNode(
DWORD dwF2
);
#endif
#if defined (_INC_WOW_CONVERSIONS) || defined (_INC_ALL_WOWSTUFF)
/****************************************************************************\
** Other stuff
**
**
\****************************************************************************/
typedef VOID (APIENTRY *LPCALL_ICA_HW_INTERRUPT)( int, BYTE line, int count );
typedef LPVOID (APIENTRY *LPGETVDMPOINTER)( DWORD Address, DWORD dwBytes, BOOL fProtectMode );
typedef HANDLE (APIENTRY *LPWOWHANDLE32)(WORD, WOW_HANDLE_TYPE);
typedef WORD (APIENTRY *LPWOWHANDLE16)(HANDLE, WOW_HANDLE_TYPE);
#define GETVDMPTR( p ) (LPVOID)((*GetVDMPointer)( (DWORD)(p), 0L, TRUE ))
extern LPCALL_ICA_HW_INTERRUPT GenerateInterrupt;
extern LPGETVDMPOINTER GetVDMPointer;
extern LPWOWHANDLE32 lpWOWHandle32;
extern LPWOWHANDLE16 lpWOWHandle16;
/* -------------------------------------------------------------------------
** Conversions
** -------------------------------------------------------------------------
*/
typedef HANDLE HAND32;
typedef WORD HAND16;
typedef WORD HWND16;
typedef WORD HDC16;
typedef WORD HTASK16;
typedef short INT16;
typedef WORD HPAL16;
#define GETHTASK16(h32) ((HAND16)(INT)(h32))
#define HWND32(h16) ((HWND)(*lpWOWHandle32)( h16, WOW_TYPE_HWND ))
#define GETHWND16(h32) ((*lpWOWHandle16)( h32, WOW_TYPE_HWND ))
#define HDC32(hdc16) ((HDC)(*lpWOWHandle32)( hdc16, WOW_TYPE_HDC ))
#define GETHDC16(hdc32) ((*lpWOWHandle16)( hdc32, WOW_TYPE_HDC ))
#define HPALETTE32(hobj16) ((HPALETTE)(*lpWOWHandle32)( hobj16, WOW_TYPE_HPALETTE ))
#define GETHPALETTE16(hobj32) ((*lpWOWHandle16)( hobj32, WOW_TYPE_HPALETTE ))
#endif
#ifdef _INC_ALL_WOWSTUFF
/* -------------------------------------------------------------------------
** Messages
** -------------------------------------------------------------------------
*/
#ifndef DRVM_INIT
#define DRVM_INIT 100
#define WODM_INIT DRVM_INIT
#define WIDM_INIT DRVM_INIT
#define MODM_INIT DRVM_INIT
#define MIDM_INIT DRVM_INIT
#define AUXDM_INIT DRVM_INIT
#endif
#ifndef MAX_TIMER_EVENTS
#define MAX_TIMER_EVENTS 16
#endif
#ifndef TDD_APPEXIT
#define TDD_APPEXIT DRV_RESERVED+24
#endif
/**********************************************************************\
*
* The following macros are used to set or clear the done bit in a
* 16 bit wave|midi header structure.
*
\**********************************************************************/
#define COPY_WAVEOUTHDR16_FLAGS( x, y ) \
{ \
PWAVEHDR16 pWavHdr; \
DWORD dw; \
\
pWavHdr = (x); \
dw = (y).dwFlags; \
pWavHdr->dwFlags = dw; \
}
#define COPY_MIDIOUTHDR16_FLAGS( x, y ) \
{ \
PMIDIHDR16 pMidHdr; \
DWORD dw; \
\
pMidHdr = (x); \
dw = (y).dwFlags; \
pMidHdr->dwFlags = dw; \
}
#define COPY_WAVEINHDR16_FLAGS( x, y ) \
{ \
PWAVEHDR16 pWavHdr; \
DWORD dw; \
\
pWavHdr = (x); \
dw = (y).dwFlags; \
pWavHdr->dwFlags = dw; \
dw = (y).dwBytesRecorded; \
pWavHdr->dwBytesRecorded = dw; \
}
#define COPY_MIDIINHDR16_FLAGS( x, y ) \
{ \
PMIDIHDR16 pMidHdr; \
DWORD dw; \
\
pMidHdr = (x); \
dw = (y).dwFlags; \
pMidHdr->dwFlags = dw; \
dw = (y).dwBytesRecorded; \
pMidHdr->dwBytesRecorded = dw; \
}
/* -------------------------------------------------------------------------
** Define 16-bit mixer stuff
** -------------------------------------------------------------------------
*/
#pragma pack(1)
typedef struct tMIXERCAPS16
{
WORD wMid; // manufacturer id
WORD wPid; // product id
WORD vDriverVersion; // version of the driver
char szPname[MAXPNAMELEN]; // product name
DWORD fdwSupport; // misc. support bits
DWORD cDestinations; // count of destinations
} MIXERCAPS16;
typedef MIXERCAPS16 UNALIGNED *LPMIXERCAPS16;
typedef struct tMIXERLINE16
{
DWORD cbStruct; // size of MIXERLINE structure
DWORD dwDestination; // zero based destination index
DWORD dwSource; // zero based source index (if source)
DWORD dwLineID; // unique line id for mixer device
DWORD fdwLine; // state/information about line
DWORD dwUser; // driver specific information
DWORD dwComponentType; // component type line connects to
DWORD cChannels; // number of channels line supports
DWORD cConnections; // number of connections [possible]
DWORD cControls; // number of controls at this line
char szShortName[MIXER_SHORT_NAME_CHARS];
char szName[MIXER_LONG_NAME_CHARS];
struct
{
DWORD dwType; // MIXERLINE_TARGETTYPE_xxxx
DWORD dwDeviceID; // target device ID of device type
WORD wMid; // of target device
WORD wPid; // "
WORD vDriverVersion; // "
char szPname[MAXPNAMELEN]; // "
} Target;
} MIXERLINE16;
typedef MIXERLINE16 UNALIGNED *LPMIXERLINE16;
typedef struct tMIXEROPENDESC16
{
WORD hmx; // handle that will be used
LPVOID pReserved0; // reserved--driver should ignore
DWORD dwCallback; // callback
DWORD dwInstance; // app's private instance information
} MIXEROPENDESC16;
typedef MIXEROPENDESC16 UNALIGNED *LPMIXEROPENDESC16;
#pragma pack()
DWORD CALLBACK
mxd32Message(
UINT uId,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
);
void
GetLineInfo(
LPMIXERLINE16 lpline16,
LPMIXERLINEA lpline32
);
void
PutLineInfo(
LPMIXERLINE16 lpline16,
LPMIXERLINEA lpline32
);
/*
** ----------------------------------------------------------------
** General Debugging code
** ----------------------------------------------------------------
*/
#undef dprintf
#undef dprintf1
#undef dprintf2
#undef dprintf3
#undef dprintf4
#undef dprintf5
#if DBG
typedef struct tagMSG_NAME {
UINT uMsg;
LPSTR lpstrName;
} MSG_NAME;
extern int TraceAux;
extern int TraceJoy;
extern int TraceMidiIn;
extern int TraceMidiOut;
extern int TraceTime;
extern int TraceMix;
extern int TraceWaveOut;
extern int TraceWaveIn;
extern int DebugLevel;
VOID FAR DbgOutput( LPSTR lpstrFormatStr, ... );
#define dprintf( _x_ ) winmmDbgOut _x_
#define dprintf1( _x_ ) if (DebugLevel >= 1) {winmmDbgOut _x_ ;} else
#define dprintf2( _x_ ) if (DebugLevel >= 2) {winmmDbgOut _x_ ;} else
#define dprintf3( _x_ ) if (DebugLevel >= 3) {winmmDbgOut _x_ ;} else
#define dprintf4( _x_ ) if (DebugLevel >= 4) {winmmDbgOut _x_ ;} else
#define dprintf5( _x_ ) if (DebugLevel >= 5) {winmmDbgOut _x_ ;} else
#define trace_waveout( _x_ ) if (TraceWaveOut) {winmmDbgOut _x_ ;} else
#define trace_wavein( _x_ ) if (TraceWaveIn) {winmmDbgOut _x_ ;} else
#define trace_mix( _x_ ) if (TraceMix) {winmmDbgOut _x_ ;} else
#define trace_midiout( _x_ ) if (TraceMidiOut) {winmmDbgOut _x_ ;} else
#define trace_midiin( _x_ ) if (TraceMidiIn) {winmmDbgOut _x_ ;} else
#define trace_aux( _x_ ) if (TraceAux) {winmmDbgOut _x_ ;} else
#define trace_joy( _x_ ) if (TraceJoy) {winmmDbgOut _x_ ;} else
#define trace_time( _x_ ) if (TraceTime) {winmmDbgOut _x_ ;} else
#else
#define dprintf( _x_ )
#define dprintf1( _x_ )
#define dprintf2( _x_ )
#define dprintf3( _x_ )
#define dprintf4( _x_ )
#define dprintf5( _x_ )
#define trace_waveout( _x_ )
#define trace_wavein( _x_ )
#define trace_mix( _x_ )
#define trace_midiout( _x_ )
#define trace_midiin( _x_ )
#define trace_time( _x_ )
#define trace_aux( _x_ )
#define trace_joy( _x_ )
#endif
#endif