123 lines
2.6 KiB
C++
123 lines
2.6 KiB
C++
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
CorrectACMArgs.cpp
|
|
|
|
Abstract:
|
|
|
|
This shim is to fix apps that pass incorrect cbSrcLength(too big) in the
|
|
ACMSTREAMHEADER parameter to acmStreamConvert or acmStreamPrepareHeader.
|
|
|
|
Notes:
|
|
|
|
This is a general purpose shim.
|
|
|
|
History:
|
|
|
|
10/03/2000 maonis Created
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include "msacmdrv.h"
|
|
|
|
typedef MMRESULT (*_pfn_acmStreamConvert)(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert);
|
|
typedef MMRESULT (*_pfn_acmStreamPrepareHeader)(HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare);
|
|
|
|
IMPLEMENT_SHIM_BEGIN(CorrectACMArgs)
|
|
#include "ShimHookMacro.h"
|
|
|
|
APIHOOK_ENUM_BEGIN
|
|
APIHOOK_ENUM_ENTRY(acmStreamConvert)
|
|
APIHOOK_ENUM_ENTRY(acmStreamPrepareHeader)
|
|
APIHOOK_ENUM_END
|
|
|
|
/*++
|
|
|
|
On win9x it checks to ensure that the app doesn't pass in a too big cbSrcLength
|
|
but this check is removed on NT. We fix this by mimicing what 9x is doing -
|
|
calling acmStreamSize to check if the source length is too big.
|
|
|
|
--*/
|
|
|
|
MMRESULT
|
|
APIHOOK(acmStreamConvert)(
|
|
HACMSTREAM has,
|
|
LPACMSTREAMHEADER pash,
|
|
DWORD fdwConvert
|
|
)
|
|
{
|
|
DWORD dwOutputBytes = 0;
|
|
MMRESULT mmr = acmStreamSize(
|
|
has, pash->cbDstLength, &dwOutputBytes, ACM_STREAMSIZEF_DESTINATION);
|
|
|
|
if (mmr == MMSYSERR_NOERROR)
|
|
{
|
|
if(pash->cbSrcLength > dwOutputBytes)
|
|
{
|
|
DPFN( eDbgLevelWarning, "acmStreamConvert: cbSrcLength is too big (cbSrcLength=%u, cbDstLength=%u)\n",pash->cbSrcLength,pash->cbDstLength);
|
|
return ACMERR_NOTPOSSIBLE;
|
|
}
|
|
|
|
mmr = ORIGINAL_API(acmStreamConvert)(
|
|
has, pash, fdwConvert);
|
|
}
|
|
|
|
return mmr;
|
|
}
|
|
|
|
/*++
|
|
|
|
Fix bad parameters.
|
|
|
|
--*/
|
|
|
|
MMRESULT
|
|
APIHOOK(acmStreamPrepareHeader)(
|
|
HACMSTREAM has,
|
|
LPACMSTREAMHEADER pash,
|
|
DWORD fdwPrepare
|
|
)
|
|
{
|
|
UINT l = pash->cbSrcLength;
|
|
|
|
while (IsBadReadPtr(pash->pbSrc, l))
|
|
{
|
|
if (l < 256)
|
|
{
|
|
DPFN( eDbgLevelError, "The source buffer is invalid");
|
|
return MMSYSERR_INVALPARAM;
|
|
}
|
|
|
|
l-=256;
|
|
}
|
|
|
|
if (pash->cbSrcLength != l)
|
|
{
|
|
DPFN( eDbgLevelWarning, "Adjusted header from %d to %d\n", pash->cbSrcLength, l);
|
|
}
|
|
|
|
pash->cbSrcLength = l;
|
|
|
|
return ORIGINAL_API(acmStreamPrepareHeader)(
|
|
has, pash, fdwPrepare);
|
|
}
|
|
|
|
/*++
|
|
|
|
Register hooked functions
|
|
|
|
--*/
|
|
|
|
HOOK_BEGIN
|
|
APIHOOK_ENTRY(MSACM32.DLL, acmStreamConvert)
|
|
APIHOOK_ENTRY(MSACM32.DLL, acmStreamPrepareHeader)
|
|
HOOK_END
|
|
|
|
|
|
IMPLEMENT_SHIM_END
|
|
|