212 lines
5.4 KiB
C++
212 lines
5.4 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
CorrectSoundDeviceId.cpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This shim fixes calls to waveOutOpen, waveOutGetDevCaps, midiOutOpen and
|
||
|
midiOutGetDevCaps with the uDeviceID equal to 0xFFFF, which was the constant
|
||
|
for Wave/MIDI Mapper under 16-bit windows. Under 32-bit the new constant is
|
||
|
0xFFFFFFFF. This is going to be fixed in winmm code for Whistler but we still
|
||
|
keep this shim to fix apps on w2k.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
This is a general purpose shim.
|
||
|
|
||
|
History:
|
||
|
|
||
|
01/26/2000 dmunsil Created
|
||
|
10/09/2000 maonis Added hooks for midiOutGetDevCaps and midiOutOpen.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "precomp.h"
|
||
|
|
||
|
IMPLEMENT_SHIM_BEGIN(CorrectSoundDeviceId)
|
||
|
#include "ShimHookMacro.h"
|
||
|
|
||
|
|
||
|
APIHOOK_ENUM_BEGIN
|
||
|
APIHOOK_ENUM_ENTRY(waveOutOpen)
|
||
|
APIHOOK_ENUM_ENTRY(waveOutGetDevCapsA)
|
||
|
APIHOOK_ENUM_ENTRY(waveOutGetDevCapsW)
|
||
|
APIHOOK_ENUM_ENTRY(midiOutOpen)
|
||
|
APIHOOK_ENUM_ENTRY(midiOutGetDevCapsA)
|
||
|
APIHOOK_ENUM_END
|
||
|
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function fixes calls with the uDeviceID equal to 0xFFFF, which was
|
||
|
the constant for Wave Mapper under 16-bit windows.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
MMRESULT
|
||
|
APIHOOK(waveOutOpen)(
|
||
|
LPHWAVEOUT phwo, // return buffer
|
||
|
UINT uDeviceID, // id of the device to use
|
||
|
LPWAVEFORMATEX pwfx, // what format you need (i.e. 11K, 16bit, stereo)
|
||
|
DWORD dwCallback, // callback for notification on buffer completion
|
||
|
DWORD dwCallbackInstance, // instance handle for callback
|
||
|
DWORD fdwOpen // flags
|
||
|
)
|
||
|
{
|
||
|
if (uDeviceID == 0xFFFF) {
|
||
|
LOGN(
|
||
|
eDbgLevelError,
|
||
|
"[waveOutOpen] Fixed invalid Wave Mapper device ID.");
|
||
|
|
||
|
uDeviceID = (UINT)-1;
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(waveOutOpen)(
|
||
|
phwo,
|
||
|
uDeviceID,
|
||
|
pwfx,
|
||
|
dwCallback,
|
||
|
dwCallbackInstance,
|
||
|
fdwOpen);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function fixes calls with the uDeviceID equal to 0xFFFF, which was
|
||
|
the constant for Wave Mapper under 16-bit windows.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
MMRESULT
|
||
|
APIHOOK(waveOutGetDevCapsA)(
|
||
|
UINT uDeviceID, // id of the device to use
|
||
|
LPWAVEOUTCAPSA pwoc, // returned caps structure
|
||
|
UINT cbwoc // size in bytes of the WAVEOUTCAPS struct
|
||
|
)
|
||
|
{
|
||
|
if (uDeviceID == 0xFFFF) {
|
||
|
LOGN(
|
||
|
eDbgLevelError,
|
||
|
"[waveOutGetDevCapsA] Fixed invalid Wave Mapper device ID.");
|
||
|
|
||
|
uDeviceID = (UINT)-1;
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(waveOutGetDevCapsA)(
|
||
|
uDeviceID,
|
||
|
pwoc,
|
||
|
cbwoc);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function fixes calls with the uDeviceID equal to 0xFFFF, which was
|
||
|
the constant for Wave Mapper under 16-bit windows.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
MMRESULT
|
||
|
APIHOOK(waveOutGetDevCapsW)(
|
||
|
UINT uDeviceID, // id of the device to use
|
||
|
LPWAVEOUTCAPSW pwoc, // returned caps structure
|
||
|
UINT cbwoc // size in bytes of the WAVEOUTCAPS struct
|
||
|
)
|
||
|
{
|
||
|
if (uDeviceID == 0xFFFF) {
|
||
|
LOGN(
|
||
|
eDbgLevelError,
|
||
|
"[waveOutGetDevCapsW] Fixed invalid Wave Mapper device ID.");
|
||
|
|
||
|
uDeviceID = (UINT)-1;
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(waveOutGetDevCapsW)(
|
||
|
uDeviceID,
|
||
|
pwoc,
|
||
|
cbwoc);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function fixes calls with the uDeviceID equal to 0xFFFF, which was
|
||
|
the constant for MIDI Mapper under 16-bit windows.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
MMRESULT
|
||
|
APIHOOK(midiOutOpen)(
|
||
|
LPHMIDIOUT phmo,
|
||
|
UINT uDeviceID,
|
||
|
DWORD_PTR dwCallback,
|
||
|
DWORD_PTR dwInstance,
|
||
|
DWORD fdwOpen
|
||
|
)
|
||
|
{
|
||
|
if (uDeviceID == 0xffff) {
|
||
|
LOGN(
|
||
|
eDbgLevelError,
|
||
|
"[midiOutOpen] Fixed invalid MIDI Mapper device ID.");
|
||
|
|
||
|
uDeviceID = (UINT)-1;
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(midiOutOpen)(
|
||
|
phmo,
|
||
|
uDeviceID,
|
||
|
dwCallback,
|
||
|
dwInstance,
|
||
|
fdwOpen);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
This stub function fixes calls with the uDeviceID equal to 0xFFFF, which was
|
||
|
the constant for MIDI Mapper under 16-bit windows.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
MMRESULT
|
||
|
APIHOOK(midiOutGetDevCapsA)(
|
||
|
UINT_PTR uDeviceID,
|
||
|
LPMIDIOUTCAPSA pmoc,
|
||
|
UINT cbmoc
|
||
|
)
|
||
|
{
|
||
|
if (uDeviceID == 0xffff) {
|
||
|
LOGN(
|
||
|
eDbgLevelError,
|
||
|
"[midiOutGetDevCapsA] Fixed invalid MIDI Mapper device ID.");
|
||
|
|
||
|
uDeviceID = (UINT)-1;
|
||
|
}
|
||
|
|
||
|
return ORIGINAL_API(midiOutGetDevCapsA)(
|
||
|
uDeviceID,
|
||
|
pmoc,
|
||
|
cbmoc);
|
||
|
}
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Register hooked functions
|
||
|
|
||
|
--*/
|
||
|
|
||
|
HOOK_BEGIN
|
||
|
|
||
|
APIHOOK_ENTRY(WINMM.DLL, waveOutOpen)
|
||
|
APIHOOK_ENTRY(WINMM.DLL, waveOutGetDevCapsA)
|
||
|
APIHOOK_ENTRY(WINMM.DLL, waveOutGetDevCapsW)
|
||
|
APIHOOK_ENTRY(WINMM.DLL, midiOutOpen)
|
||
|
APIHOOK_ENTRY(WINMM.DLL, midiOutGetDevCapsA)
|
||
|
|
||
|
HOOK_END
|
||
|
|
||
|
|
||
|
IMPLEMENT_SHIM_END
|
||
|
|