windows-nt/Source/XPSP1/NT/windows/appcompat/shims/specific/khunmin2album.cpp
2020-09-26 16:20:57 +08:00

108 lines
2.5 KiB
C++

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Khunmin2Album.cpp
Abstract:
When doing WideCharToMultiByte, the app does not pass the ansi string
buffer length correctly, while it seems the app allocates enough big
buffer, fix this by correcting the ansi string length, (try-except
protected in case the buffer allocated is not enough).
Notes:
This is an app specific shim.
History:
05/15/2001 xiaoz Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(Khunmin2Album)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(WideCharToMultiByte)
APIHOOK_ENUM_END
/*++
Correct ansi string length if necessary
--*/
int
APIHOOK(WideCharToMultiByte)(
UINT CodePage, // code page
DWORD dwFlags, // performance and mapping flags
LPCWSTR lpWideCharStr, // wide-character string
int cchWideChar, // number of chars in string
LPSTR lpMultiByteStr, // buffer for new string
int cbMultiByte, // size of buffer
LPCSTR lpDefaultChar, // default for unmappable chars
LPBOOL lpUsedDefaultChar // set when default char used
)
{
int nMultiByte;
int nOriginalMultiByte = cbMultiByte;
//
// Get the exact size in byte needed to convert the string from unicode to
// ansi
//
nMultiByte = ORIGINAL_API(WideCharToMultiByte)(CodePage, dwFlags,
lpWideCharStr, cchWideChar, lpMultiByteStr, 0, lpDefaultChar,
lpUsedDefaultChar);
//
// See if we need to correct the buffer size
//
if (nMultiByte > cbMultiByte)
{
LOGN(eDbgLevelWarning, "Buffer size corrected");
cbMultiByte = nMultiByte;
}
__try
{
return ORIGINAL_API(WideCharToMultiByte)(CodePage, dwFlags,
lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte,
lpDefaultChar, lpUsedDefaultChar);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
//
// If somehow exception happens, probally AV , since we enlarge
// the buffer size, we will use what ever the parameter originally
// passed in, and do nothing
//
return ORIGINAL_API(WideCharToMultiByte)(CodePage, dwFlags,
lpWideCharStr, cchWideChar, lpMultiByteStr, nOriginalMultiByte,
lpDefaultChar, lpUsedDefaultChar);
}
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(KERNEL32.DLL, WideCharToMultiByte)
HOOK_END
IMPLEMENT_SHIM_END