Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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
|