- Make LFONTs (for some incomprehensible reason called TEXTOBJ in ros) shared objects, as they are supposed to be. Since that conflicts with our totally broken font code that happily messes with the LFONT's contents, an additional push lock is aquired to get exclusive ownership.

svn path=/trunk/; revision=57494
This commit is contained in:
Timo Kreuzer 2012-10-06 12:16:06 +00:00
parent f380457089
commit fcbab8b1a3
4 changed files with 46 additions and 28 deletions

View file

@ -1056,7 +1056,7 @@ NtGdiHfontCreate(
{ {
ENUMLOGFONTEXDVW SafeLogfont; ENUMLOGFONTEXDVW SafeLogfont;
HFONT hNewFont; HFONT hNewFont;
PTEXTOBJ TextObj; PLFONT plfont;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
/* Silence GCC warnings */ /* Silence GCC warnings */
@ -1084,25 +1084,26 @@ NtGdiHfontCreate(
return NULL; return NULL;
} }
TextObj = TEXTOBJ_AllocTextWithHandle(); plfont = LFONT_AllocFontWithHandle();
if (!TextObj) if (!plfont)
{ {
return NULL; return NULL;
} }
hNewFont = TextObj->BaseObject.hHmgr; hNewFont = plfont->BaseObject.hHmgr;
TextObj->lft = lft; plfont->lft = lft;
TextObj->fl = fl; plfont->fl = fl;
RtlCopyMemory (&TextObj->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW)); RtlCopyMemory (&plfont->logfont, &SafeLogfont, sizeof(ENUMLOGFONTEXDVW));
ExInitializePushLock(&plfont->lock);
if (SafeLogfont.elfEnumLogfontEx.elfLogFont.lfEscapement != if (SafeLogfont.elfEnumLogfontEx.elfLogFont.lfEscapement !=
SafeLogfont.elfEnumLogfontEx.elfLogFont.lfOrientation) SafeLogfont.elfEnumLogfontEx.elfLogFont.lfOrientation)
{ {
/* This should really depend on whether GM_ADVANCED is set */ /* This should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation = plfont->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement; plfont->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
} }
TEXTOBJ_UnlockText(TextObj); LFONT_UnlockFont(plfont);
if (pvCliData && hNewFont) if (pvCliData && hNewFont)
{ {

View file

@ -447,23 +447,24 @@ IntGetFontRenderMode(LOGFONTW *logfont)
NTSTATUS FASTCALL NTSTATUS FASTCALL
TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont) TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont)
{ {
PTEXTOBJ TextObj; PLFONT plfont;
TextObj = TEXTOBJ_AllocTextWithHandle(); plfont = LFONT_AllocFontWithHandle();
if (!TextObj) if (!plfont)
{ {
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
} }
*NewFont = TextObj->BaseObject.hHmgr; ExInitializePushLock(&plfont->lock);
RtlCopyMemory(&TextObj->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW)); *NewFont = plfont->BaseObject.hHmgr;
RtlCopyMemory(&plfont->logfont.elfEnumLogfontEx.elfLogFont, lf, sizeof(LOGFONTW));
if (lf->lfEscapement != lf->lfOrientation) if (lf->lfEscapement != lf->lfOrientation)
{ {
/* This should really depend on whether GM_ADVANCED is set */ /* This should really depend on whether GM_ADVANCED is set */
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation = plfont->logfont.elfEnumLogfontEx.elfLogFont.lfOrientation =
TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement; plfont->logfont.elfEnumLogfontEx.elfLogFont.lfEscapement;
} }
TEXTOBJ_UnlockText(TextObj); LFONT_UnlockFont(plfont);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -51,8 +51,7 @@
(objt) == GDIObjType_BRUSH_TYPE) (objt) == GDIObjType_BRUSH_TYPE)
#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) \ #define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_DC_TYPE || \ ASSERT((objt) == GDIObjType_DC_TYPE || \
(objt) == GDIObjType_RGN_TYPE || \ (objt) == GDIObjType_RGN_TYPE)
(objt) == GDIObjType_LFONT_TYPE)
#else #else
#define DBG_INCREASE_LOCK_COUNT(ppi, hobj) #define DBG_INCREASE_LOCK_COUNT(ppi, hobj)
#define DBG_DECREASE_LOCK_COUNT(x, y) #define DBG_DECREASE_LOCK_COUNT(x, y)

View file

@ -56,7 +56,7 @@ typedef struct _STRGDI
#define TEXTOBJECT_INIT 0x00010000 #define TEXTOBJECT_INIT 0x00010000
/* GDI logical font object */ /* GDI logical font object */
typedef struct typedef struct _LFONT
{ {
/* Header for all gdi objects in the handle table. /* Header for all gdi objects in the handle table.
Do not (re)move this. */ Do not (re)move this. */
@ -70,16 +70,33 @@ typedef struct
DWORD dwOffsetEndArray; DWORD dwOffsetEndArray;
// Fixed: // Fixed:
ENUMLOGFONTEXDVW logfont; ENUMLOGFONTEXDVW logfont;
} TEXTOBJ, *PTEXTOBJ; EX_PUSH_LOCK lock;
} TEXTOBJ, *PTEXTOBJ, LFONT, *PLFONT;
/* Internal interface */ /* Internal interface */
#define TEXTOBJ_AllocText() ((PTEXTOBJ) GDIOBJ_AllocObj(GDIObjType_LFONT_TYPE)) #define LFONT_AllocFontWithHandle() ((PLFONT)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ)))
#define TEXTOBJ_AllocTextWithHandle() ((PTEXTOBJ) GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_FONT, sizeof(TEXTOBJ))) #define LFONT_ShareLockFont(hfont) (PLFONT)GDIOBJ_ReferenceObjectByHandle(hfont, GDIObjType_LFONT_TYPE)
#define TEXTOBJ_FreeText(pBMObj) GDIOBJ_FreeObj((POBJ) pBMObj, GDILoObjType_LO_FONT_TYPE) #define LFONT_ShareUnlockFont(plfnt) GDIOBJ_vDereferenceObject((POBJ)plfnt)
#define TEXTOBJ_FreeTextByHandle(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GDI_OBJECT_TYPE_FONT) #define LFONT_UnlockFont(plfnt) GDIOBJ_vUnlockObject((POBJ)plfnt)
#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObject((HGDIOBJ) hBMObj, GDIObjType_LFONT_TYPE))
#define TEXTOBJ_UnlockText(pBMObj) GDIOBJ_vUnlockObject ((POBJ)pBMObj) PTEXTOBJ
FORCEINLINE
TEXTOBJ_LockText(HFONT hfont)
{
PLFONT plfnt = LFONT_ShareLockFont(hfont);
ExAcquirePushLockExclusive(&plfnt->lock);
return plfnt;
}
VOID
FORCEINLINE
TEXTOBJ_UnlockText(PLFONT plfnt)
{
ExReleasePushLockExclusive(&plfnt->lock);
LFONT_ShareUnlockFont(plfnt);
}
PTEXTOBJ FASTCALL RealizeFontInit(HFONT); PTEXTOBJ FASTCALL RealizeFontInit(HFONT);
NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ); NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ);