129 lines
2.7 KiB
C++
129 lines
2.7 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
|
||
|
|