+VOID FASTCALL
+IntGdiCleanupMemEntry(PFONT_ENTRY_MEM Head)
+{
+ PLIST_ENTRY Entry;
+ PFONT_ENTRY_MEM FontEntry;
+
+ while (!IsListEmpty(&Head->ListEntry))
+ {
+ Entry = RemoveHeadList(&Head->ListEntry);
+ FontEntry = CONTAINING_RECORD(Entry, FONT_ENTRY_MEM, ListEntry);
+
+ // Delete FontEntry->Entry (FONT_ENTRY*)
+ ExFreePoolWithTag(FontEntry, TAG_FONT);
+ }
+
+ // Delete Head->Entry (FONT_ENTRY*)
+ ExFreePoolWithTag(Head, TAG_FONT);
+}
+
+BOOL FASTCALL
+IntGdiRemoveFontMemResource(HANDLE hMMFont)
+{
+ PLIST_ENTRY Entry;
+ PFONT_ENTRY_COLL_MEM CurrentEntry;
+ PFONT_ENTRY_COLL_MEM EntryCollection = NULL;
+ PPROCESSINFO Win32Process = PsGetCurrentProcessWin32Process();
+
+ IntLockProcessPrivateFonts(Win32Process);
+ Entry = Win32Process->PrivateMemFontListHead.Flink;
+ while (Entry != &Win32Process->PrivateMemFontListHead)
+ {
+ CurrentEntry = CONTAINING_RECORD(Entry, FONT_ENTRY_COLL_MEM, ListEntry);
+
+ if (CurrentEntry->Handle == (UINT)hMMFont)
+ {
+ EntryCollection = CurrentEntry;
+ RemoveEntryList(Entry);
+ break;
+ }
+
+ Entry = Entry->Flink;
+ }
+ IntUnLockProcessPrivateFonts(Win32Process);
+
+ if (EntryCollection)
+ {
+ IntGdiCleanupMemEntry(EntryCollection->Entry);
+ ExFreePoolWithTag(EntryCollection, TAG_FONT);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+