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

129 lines
2.6 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
EmulateDrawText.cpp
Abstract:
Win9x DrawText modified the rectangle coordinates if they were
out of range. With Win2000 the text will not appear on the
screen with out of range formatting dimensions. The solution
is to toggle the high order bit for out of range coordinates.
We also cast nCount to 16-bits for apps which pass 0x0000ffff
instead of a true -1, because the Win9x thunk does this.
Notes:
This is a general purpose shim.
History:
05/03/2000 a-michni Created
--*/
#include "precomp.h"
IMPLEMENT_SHIM_BEGIN(EmulateDrawText)
#include "ShimHookMacro.h"
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(DrawTextA)
APIHOOK_ENUM_ENTRY(DrawTextW)
APIHOOK_ENUM_END
/*++
Correct the formatting dimensions if necessary.
--*/
long
Fix_Coordinate(
long nCoord
)
{
if ((nCoord & 0x80000000) && ((nCoord & 0x40000000) == 0)) {
nCoord &= 0x7FFFFFFF;
} else if (((nCoord & 0x80000000) == 0) && (nCoord & 0x40000000)) {
nCoord |= 0x10000000;
}
return nCoord;
}
LPRECT
Fix_Coordinates(
LPRECT lpRect
)
{
//
// Check bit 32, if it is on and bit 31 is off or bit 32 is off and
// bit 31 is on, flip bit 32.
//
lpRect->left = Fix_Coordinate(lpRect->left);
lpRect->right = Fix_Coordinate(lpRect->right);
lpRect->top = Fix_Coordinate(lpRect->top);
lpRect->bottom= Fix_Coordinate(lpRect->bottom);
return lpRect;
}
int
APIHOOK(DrawTextA)(
HDC hDC, // handle to DC
LPCSTR lpString, // text to draw
int nCount, // text length
LPRECT lpRect, // formatting dimensions
UINT uFormat // text-drawing options
)
{
return ORIGINAL_API(DrawTextA)(
hDC,
lpString,
(__int16) nCount,
Fix_Coordinates(lpRect),
uFormat);
}
int
APIHOOK(DrawTextW)(
HDC hDC, // handle to DC
LPCWSTR lpString, // text to draw
int nCount, // text length
LPRECT lpRect, // formatting dimensions
UINT uFormat // text-drawing options
)
{
return ORIGINAL_API(DrawTextW)(
hDC,
lpString,
(__int16) nCount,
Fix_Coordinates(lpRect),
uFormat);
}
/*++
Register hooked functions
--*/
HOOK_BEGIN
APIHOOK_ENTRY(USER32.DLL, DrawTextA)
APIHOOK_ENTRY(USER32.DLL, DrawTextW)
HOOK_END
IMPLEMENT_SHIM_END