/*++ 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