mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 21:23:00 +00:00
[NTGDI][FREETYPE] Unload font engine on system shut-down (#6955)
Check system integrity by explicitly releasing the font engine. JIRA issue: CORE-9616 - Use RTL_STATIC_LIST_HEAD against g_FontListHead and g_FontCacheListHead variables and omit initialization of them. - Implement FreeFontSupport function. - Call FreeFontSupport in win32k! DriverUnload function. - Fix some usages of CONTAINING_RECORD macro.
This commit is contained in:
parent
817f89466d
commit
a541a468ba
3 changed files with 58 additions and 9 deletions
|
@ -78,7 +78,7 @@ static UNICODE_STRING g_FontRegPath =
|
||||||
to serialize access to it */
|
to serialize access to it */
|
||||||
static PFAST_MUTEX g_FreeTypeLock;
|
static PFAST_MUTEX g_FreeTypeLock;
|
||||||
|
|
||||||
static LIST_ENTRY g_FontListHead;
|
static RTL_STATIC_LIST_HEAD(g_FontListHead);
|
||||||
static PFAST_MUTEX g_FontListLock;
|
static PFAST_MUTEX g_FontListLock;
|
||||||
static BOOL g_RenderingEnabled = TRUE;
|
static BOOL g_RenderingEnabled = TRUE;
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ static BOOL g_RenderingEnabled = TRUE;
|
||||||
|
|
||||||
#define MAX_FONT_CACHE 256
|
#define MAX_FONT_CACHE 256
|
||||||
|
|
||||||
static LIST_ENTRY g_FontCacheListHead;
|
static RTL_STATIC_LIST_HEAD(g_FontCacheListHead);
|
||||||
static UINT g_FontCacheNumEntries;
|
static UINT g_FontCacheNumEntries;
|
||||||
|
|
||||||
static PWCHAR g_ElfScripts[32] = /* These are in the order of the fsCsb[0] bits */
|
static PWCHAR g_ElfScripts[32] = /* These are in the order of the fsCsb[0] bits */
|
||||||
|
@ -476,9 +476,7 @@ VOID DumpFontSubstList(VOID)
|
||||||
pListEntry != pHead;
|
pListEntry != pHead;
|
||||||
pListEntry = pListEntry->Flink)
|
pListEntry = pListEntry->Flink)
|
||||||
{
|
{
|
||||||
pSubstEntry =
|
pSubstEntry = CONTAINING_RECORD(pListEntry, FONTSUBST_ENTRY, ListEntry);
|
||||||
(PFONTSUBST_ENTRY)CONTAINING_RECORD(pListEntry, FONT_ENTRY, ListEntry);
|
|
||||||
|
|
||||||
DumpFontSubstEntry(pSubstEntry);
|
DumpFontSubstEntry(pSubstEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -673,8 +671,6 @@ InitFontSupport(VOID)
|
||||||
{
|
{
|
||||||
ULONG ulError;
|
ULONG ulError;
|
||||||
|
|
||||||
InitializeListHead(&g_FontListHead);
|
|
||||||
InitializeListHead(&g_FontCacheListHead);
|
|
||||||
g_FontCacheNumEntries = 0;
|
g_FontCacheNumEntries = 0;
|
||||||
/* Fast Mutexes must be allocated from non paged pool */
|
/* Fast Mutexes must be allocated from non paged pool */
|
||||||
g_FontListLock = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_MUTEX), TAG_INTERNAL_SYNC);
|
g_FontListLock = ExAllocatePoolWithTag(NonPagedPool, sizeof(FAST_MUTEX), TAG_INTERNAL_SYNC);
|
||||||
|
@ -715,6 +711,58 @@ InitFontSupport(VOID)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID FASTCALL
|
||||||
|
FreeFontSupport(VOID)
|
||||||
|
{
|
||||||
|
PLIST_ENTRY pHead, pEntry;
|
||||||
|
PFONT_CACHE_ENTRY pFontCache;
|
||||||
|
PFONTSUBST_ENTRY pSubstEntry;
|
||||||
|
PFONT_ENTRY pFontEntry;
|
||||||
|
|
||||||
|
IntLockGlobalFonts();
|
||||||
|
|
||||||
|
// Free font cache list
|
||||||
|
pHead = &g_FontCacheListHead;
|
||||||
|
while (!IsListEmpty(pHead))
|
||||||
|
{
|
||||||
|
pEntry = RemoveHeadList(pHead);
|
||||||
|
pFontCache = CONTAINING_RECORD(pEntry, FONT_CACHE_ENTRY, ListEntry);
|
||||||
|
RemoveCachedEntry(pFontCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free font subst list
|
||||||
|
pHead = &g_FontSubstListHead;
|
||||||
|
while (!IsListEmpty(pHead))
|
||||||
|
{
|
||||||
|
pEntry = RemoveHeadList(pHead);
|
||||||
|
pSubstEntry = CONTAINING_RECORD(pEntry, FONTSUBST_ENTRY, ListEntry);
|
||||||
|
ExFreePoolWithTag(pSubstEntry, TAG_FONT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Free font list
|
||||||
|
pHead = &g_FontListHead;
|
||||||
|
while (!IsListEmpty(pHead))
|
||||||
|
{
|
||||||
|
pEntry = RemoveHeadList(pHead);
|
||||||
|
pFontEntry = CONTAINING_RECORD(pEntry, FONT_ENTRY, ListEntry);
|
||||||
|
CleanupFontEntry(pFontEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_FreeTypeLibrary)
|
||||||
|
{
|
||||||
|
FT_Done_Library(g_FreeTypeLibrary);
|
||||||
|
g_FreeTypeLibrary = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
IntUnLockGlobalFonts();
|
||||||
|
|
||||||
|
ExFreePoolWithTag(g_FontListLock, TAG_INTERNAL_SYNC);
|
||||||
|
g_FontListLock = NULL;
|
||||||
|
|
||||||
|
ExFreePoolWithTag(g_FreeTypeLock, TAG_INTERNAL_SYNC);
|
||||||
|
g_FreeTypeLock = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static LONG IntNormalizeAngle(LONG nTenthsOfDegrees)
|
static LONG IntNormalizeAngle(LONG nTenthsOfDegrees)
|
||||||
{
|
{
|
||||||
nTenthsOfDegrees %= 360 * 10;
|
nTenthsOfDegrees %= 360 * 10;
|
||||||
|
@ -783,8 +831,7 @@ SubstituteFontByList(PLIST_ENTRY pHead,
|
||||||
pListEntry != pHead;
|
pListEntry != pHead;
|
||||||
pListEntry = pListEntry->Flink)
|
pListEntry = pListEntry->Flink)
|
||||||
{
|
{
|
||||||
pSubstEntry =
|
pSubstEntry = CONTAINING_RECORD(pListEntry, FONTSUBST_ENTRY, ListEntry);
|
||||||
(PFONTSUBST_ENTRY)CONTAINING_RECORD(pListEntry, FONT_ENTRY, ListEntry);
|
|
||||||
|
|
||||||
CharSets[FONTSUBST_FROM] = pSubstEntry->CharSets[FONTSUBST_FROM];
|
CharSets[FONTSUBST_FROM] = pSubstEntry->CharSets[FONTSUBST_FROM];
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,7 @@ NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ);
|
||||||
NTSTATUS FASTCALL TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont);
|
NTSTATUS FASTCALL TextIntCreateFontIndirect(CONST LPLOGFONTW lf, HFONT *NewFont);
|
||||||
BYTE FASTCALL IntCharSetFromCodePage(UINT uCodePage);
|
BYTE FASTCALL IntCharSetFromCodePage(UINT uCodePage);
|
||||||
BOOL FASTCALL InitFontSupport(VOID);
|
BOOL FASTCALL InitFontSupport(VOID);
|
||||||
|
VOID FASTCALL FreeFontSupport(VOID);
|
||||||
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
|
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
|
||||||
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
|
BOOL FASTCALL IntIsFontRenderingEnabled(VOID);
|
||||||
VOID FASTCALL IntEnableFontRendering(BOOL Enable);
|
VOID FASTCALL IntEnableFontRendering(BOOL Enable);
|
||||||
|
|
|
@ -908,6 +908,7 @@ DriverUnload(IN PDRIVER_OBJECT DriverObject)
|
||||||
{
|
{
|
||||||
// TODO: Do more cleanup!
|
// TODO: Do more cleanup!
|
||||||
|
|
||||||
|
FreeFontSupport();
|
||||||
ResetCsrApiPort();
|
ResetCsrApiPort();
|
||||||
ResetCsrProcess();
|
ResetCsrProcess();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue