mirror of
https://github.com/reactos/reactos.git
synced 2025-05-19 17:14:32 +00:00
[WIN32SS][FONT] Fix registry-based management (#1879)
CORE-16269 - Fix and improve registry-based font entry management. - Append style name to registry value name. - Make some DPRINT DPRINT1 (noisy).
This commit is contained in:
parent
eaf24cc380
commit
b81f9b0842
2 changed files with 97 additions and 30 deletions
|
@ -1397,8 +1397,23 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont)
|
||||||
{
|
{
|
||||||
if (FT_IS_SFNT(Face))
|
if (FT_IS_SFNT(Face))
|
||||||
{
|
{
|
||||||
Status = DuplicateUnicodeString(&Entry->FaceName, pValueName);
|
// L"Name StyleName\0"
|
||||||
// TODO: Check return value
|
Length = NameLength + sizeof(L' ') + Entry->StyleName.Length + sizeof(UNICODE_NULL);
|
||||||
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
|
if (pszBuffer)
|
||||||
|
{
|
||||||
|
RtlInitEmptyUnicodeString(pValueName, pszBuffer, Length);
|
||||||
|
RtlCopyUnicodeString(pValueName, &Entry->FaceName);
|
||||||
|
if (Entry->StyleName.Length > 0)
|
||||||
|
{
|
||||||
|
RtlAppendUnicodeToString(pValueName, L" ");
|
||||||
|
RtlAppendUnicodeStringToString(pValueName, &Entry->StyleName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break; /* failure */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1409,13 +1424,13 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont)
|
||||||
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
if (pszBuffer)
|
if (pszBuffer)
|
||||||
{
|
{
|
||||||
RtlInitEmptyUnicodeString(pValueName, pszBuffer, (USHORT)Length);
|
RtlInitEmptyUnicodeString(pValueName, pszBuffer, Length);
|
||||||
RtlCopyUnicodeString(pValueName, &Entry->FaceName);
|
RtlCopyUnicodeString(pValueName, &Entry->FaceName);
|
||||||
RtlAppendUnicodeToString(pValueName, szSize);
|
RtlAppendUnicodeToString(pValueName, szSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIXME!
|
break; /* failure */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1423,18 +1438,26 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont)
|
||||||
{
|
{
|
||||||
if (FT_IS_SFNT(Face))
|
if (FT_IS_SFNT(Face))
|
||||||
{
|
{
|
||||||
Length = pValueName->Length + 3 * sizeof(WCHAR) + NameLength + sizeof(UNICODE_NULL);
|
// L"... & Name StyleName\0"
|
||||||
|
Length = pValueName->Length + 3 * sizeof(WCHAR) + Entry->FaceName.Length +
|
||||||
|
sizeof(L' ') + Entry->StyleName.Length + sizeof(UNICODE_NULL);
|
||||||
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
if (pszBuffer)
|
if (pszBuffer)
|
||||||
{
|
{
|
||||||
RtlInitEmptyUnicodeString(&NewString, pszBuffer, (USHORT)Length);
|
RtlInitEmptyUnicodeString(&NewString, pszBuffer, Length);
|
||||||
RtlCopyUnicodeString(&NewString, pValueName);
|
RtlCopyUnicodeString(&NewString, pValueName);
|
||||||
RtlAppendUnicodeToString(&NewString, L" & ");
|
RtlAppendUnicodeToString(&NewString, L" & ");
|
||||||
RtlAppendUnicodeStringToString(&NewString, &Entry->FaceName);
|
RtlAppendUnicodeStringToString(&NewString, &Entry->FaceName);
|
||||||
|
if (Entry->StyleName.Length > 0)
|
||||||
|
{
|
||||||
|
RtlAppendUnicodeToString(&NewString, L" ");
|
||||||
|
RtlAppendUnicodeStringToString(&NewString, &Entry->StyleName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIXME!
|
RtlFreeUnicodeString(pValueName);
|
||||||
|
break; /* failure */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1446,13 +1469,14 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont)
|
||||||
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
if (pszBuffer)
|
if (pszBuffer)
|
||||||
{
|
{
|
||||||
RtlInitEmptyUnicodeString(&NewString, pszBuffer, (USHORT)Length);
|
RtlInitEmptyUnicodeString(&NewString, pszBuffer, Length);
|
||||||
RtlCopyUnicodeString(&NewString, pValueName);
|
RtlCopyUnicodeString(&NewString, pValueName);
|
||||||
RtlAppendUnicodeToString(&NewString, szSize);
|
RtlAppendUnicodeToString(&NewString, szSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIXME!
|
RtlFreeUnicodeString(pValueName);
|
||||||
|
break; /* failure */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1577,16 +1601,40 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
PVOID Buffer = NULL;
|
PVOID Buffer = NULL;
|
||||||
IO_STATUS_BLOCK Iosb;
|
IO_STATUS_BLOCK Iosb;
|
||||||
PVOID SectionObject;
|
PVOID SectionObject;
|
||||||
SIZE_T ViewSize = 0;
|
SIZE_T ViewSize = 0, Length;
|
||||||
LARGE_INTEGER SectionSize;
|
LARGE_INTEGER SectionSize;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
GDI_LOAD_FONT LoadFont;
|
GDI_LOAD_FONT LoadFont;
|
||||||
INT FontCount;
|
INT FontCount;
|
||||||
HANDLE KeyHandle;
|
HANDLE KeyHandle;
|
||||||
|
UNICODE_STRING PathName;
|
||||||
|
LPWSTR pszBuffer;
|
||||||
|
PFILE_OBJECT FileObject;
|
||||||
static const UNICODE_STRING TrueTypePostfix = RTL_CONSTANT_STRING(L" (TrueType)");
|
static const UNICODE_STRING TrueTypePostfix = RTL_CONSTANT_STRING(L" (TrueType)");
|
||||||
|
static const UNICODE_STRING DosPathPrefix = RTL_CONSTANT_STRING(L"\\??\\");
|
||||||
|
|
||||||
|
/* Build PathName */
|
||||||
|
if (dwFlags & AFRX_DOS_DEVICE_PATH)
|
||||||
|
{
|
||||||
|
Length = DosPathPrefix.Length + FileName->Length + sizeof(UNICODE_NULL);
|
||||||
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
|
if (!pszBuffer)
|
||||||
|
return 0; /* failure */
|
||||||
|
|
||||||
|
RtlInitEmptyUnicodeString(&PathName, pszBuffer, Length);
|
||||||
|
RtlAppendUnicodeStringToString(&PathName, &DosPathPrefix);
|
||||||
|
RtlAppendUnicodeStringToString(&PathName, FileName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Status = DuplicateUnicodeString(FileName, &PathName);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return 0; /* failure */
|
||||||
|
}
|
||||||
|
|
||||||
/* Open the font file */
|
/* Open the font file */
|
||||||
InitializeObjectAttributes(&ObjectAttributes, FileName, 0, NULL, NULL);
|
InitializeObjectAttributes(&ObjectAttributes, &PathName,
|
||||||
|
OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||||
Status = ZwOpenFile(
|
Status = ZwOpenFile(
|
||||||
&FileHandle,
|
&FileHandle,
|
||||||
FILE_GENERIC_READ | SYNCHRONIZE,
|
FILE_GENERIC_READ | SYNCHRONIZE,
|
||||||
|
@ -1596,18 +1644,32 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT);
|
FILE_SYNCHRONOUS_IO_NONALERT);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("Could not load font file: %wZ\n", FileName);
|
DPRINT1("Could not load font file: %wZ\n", &PathName);
|
||||||
|
RtlFreeUnicodeString(&PathName);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = ObReferenceObjectByHandle(FileHandle, FILE_READ_DATA, NULL,
|
||||||
|
KernelMode, (PVOID*)&FileObject, NULL);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("ObReferenceObjectByHandle failed.\n");
|
||||||
|
ZwClose(FileHandle);
|
||||||
|
RtlFreeUnicodeString(&PathName);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SectionSize.QuadPart = 0LL;
|
SectionSize.QuadPart = 0LL;
|
||||||
Status = MmCreateSection(&SectionObject, SECTION_ALL_ACCESS,
|
Status = MmCreateSection(&SectionObject,
|
||||||
|
STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ,
|
||||||
NULL, &SectionSize, PAGE_READONLY,
|
NULL, &SectionSize, PAGE_READONLY,
|
||||||
SEC_COMMIT, FileHandle, NULL);
|
SEC_COMMIT, FileHandle, FileObject);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("Could not map file: %wZ\n", FileName);
|
DPRINT1("Could not map file: %wZ\n", &PathName);
|
||||||
ZwClose(FileHandle);
|
ZwClose(FileHandle);
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
RtlFreeUnicodeString(&PathName);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ZwClose(FileHandle);
|
ZwClose(FileHandle);
|
||||||
|
@ -1615,12 +1677,14 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
Status = MmMapViewInSystemSpace(SectionObject, &Buffer, &ViewSize);
|
Status = MmMapViewInSystemSpace(SectionObject, &Buffer, &ViewSize);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("Could not map file: %wZ\n", FileName);
|
DPRINT1("Could not map file: %wZ\n", &PathName);
|
||||||
ObDereferenceObject(SectionObject);
|
ObDereferenceObject(SectionObject);
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
RtlFreeUnicodeString(&PathName);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadFont.pFileName = FileName;
|
LoadFont.pFileName = &PathName;
|
||||||
LoadFont.Memory = SharedMem_Create(Buffer, ViewSize, TRUE);
|
LoadFont.Memory = SharedMem_Create(Buffer, ViewSize, TRUE);
|
||||||
LoadFont.Characteristics = Characteristics;
|
LoadFont.Characteristics = Characteristics;
|
||||||
RtlInitUnicodeString(&LoadFont.RegValueName, NULL);
|
RtlInitUnicodeString(&LoadFont.RegValueName, NULL);
|
||||||
|
@ -1636,6 +1700,8 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
|
|
||||||
ObDereferenceObject(SectionObject);
|
ObDereferenceObject(SectionObject);
|
||||||
|
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
|
||||||
/* Save the loaded font name into the registry */
|
/* Save the loaded font name into the registry */
|
||||||
if (FontCount > 0 && (dwFlags & AFRX_WRITE_REGISTRY))
|
if (FontCount > 0 && (dwFlags & AFRX_WRITE_REGISTRY))
|
||||||
{
|
{
|
||||||
|
@ -1650,7 +1716,7 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
if (pszBuffer)
|
if (pszBuffer)
|
||||||
{
|
{
|
||||||
RtlInitEmptyUnicodeString(&NewString, pszBuffer, (USHORT)Length);
|
RtlInitEmptyUnicodeString(&NewString, pszBuffer, Length);
|
||||||
NewString.Buffer[0] = UNICODE_NULL;
|
NewString.Buffer[0] = UNICODE_NULL;
|
||||||
RtlAppendUnicodeStringToString(&NewString, &LoadFont.RegValueName);
|
RtlAppendUnicodeStringToString(&NewString, &LoadFont.RegValueName);
|
||||||
RtlAppendUnicodeStringToString(&NewString, &TrueTypePostfix);
|
RtlAppendUnicodeStringToString(&NewString, &TrueTypePostfix);
|
||||||
|
@ -1673,7 +1739,7 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
pszBuffer = ExAllocatePoolWithTag(PagedPool, Length, TAG_USTR);
|
||||||
if (pszBuffer)
|
if (pszBuffer)
|
||||||
{
|
{
|
||||||
RtlInitEmptyUnicodeString(&NewString, pszBuffer, (USHORT)Length);
|
RtlInitEmptyUnicodeString(&NewString, pszBuffer, Length);
|
||||||
NewString.Buffer[0] = UNICODE_NULL;
|
NewString.Buffer[0] = UNICODE_NULL;
|
||||||
RtlAppendUnicodeStringToString(&NewString, &LoadFont.RegValueName);
|
RtlAppendUnicodeStringToString(&NewString, &LoadFont.RegValueName);
|
||||||
RtlAppendUnicodeToString(&NewString, L" (");
|
RtlAppendUnicodeToString(&NewString, L" (");
|
||||||
|
@ -1699,11 +1765,11 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
|
|
||||||
if (dwFlags & AFRX_ALTERNATIVE_PATH)
|
if (dwFlags & AFRX_ALTERNATIVE_PATH)
|
||||||
{
|
{
|
||||||
pFileName = FileName->Buffer;
|
pFileName = PathName.Buffer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pFileName = wcsrchr(FileName->Buffer, L'\\');
|
pFileName = wcsrchr(PathName.Buffer, L'\\');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFileName)
|
if (pFileName)
|
||||||
|
@ -1721,6 +1787,7 @@ IntGdiAddFontResourceEx(PUNICODE_STRING FileName, DWORD Characteristics,
|
||||||
}
|
}
|
||||||
RtlFreeUnicodeString(&LoadFont.RegValueName);
|
RtlFreeUnicodeString(&LoadFont.RegValueName);
|
||||||
|
|
||||||
|
RtlFreeUnicodeString(&PathName);
|
||||||
return FontCount;
|
return FontCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1765,7 +1832,7 @@ IntLoadFontsInRegistry(VOID)
|
||||||
Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
|
Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("ZwOpenKey failed: 0x%08X\n", Status);
|
DPRINT1("ZwOpenKey failed: 0x%08X\n", Status);
|
||||||
return FALSE; /* failure */
|
return FALSE; /* failure */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1774,7 +1841,7 @@ IntLoadFontsInRegistry(VOID)
|
||||||
&KeyFullInfo, sizeof(KeyFullInfo), &Length);
|
&KeyFullInfo, sizeof(KeyFullInfo), &Length);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("ZwQueryKey failed: 0x%08X\n", Status);
|
DPRINT1("ZwQueryKey failed: 0x%08X\n", Status);
|
||||||
ZwClose(KeyHandle);
|
ZwClose(KeyHandle);
|
||||||
return FALSE; /* failure */
|
return FALSE; /* failure */
|
||||||
}
|
}
|
||||||
|
@ -1812,7 +1879,7 @@ IntLoadFontsInRegistry(VOID)
|
||||||
}
|
}
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("ZwEnumerateValueKey failed: 0x%08X\n", Status);
|
DPRINT1("ZwEnumerateValueKey failed: 0x%08X\n", Status);
|
||||||
break; /* failure */
|
break; /* failure */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1824,7 +1891,7 @@ IntLoadFontsInRegistry(VOID)
|
||||||
if (!Success)
|
if (!Success)
|
||||||
{
|
{
|
||||||
Status = STATUS_INSUFFICIENT_RESOURCES;
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
DPRINT("RtlCreateUnicodeString failed\n");
|
DPRINT1("RtlCreateUnicodeString failed\n");
|
||||||
break; /* failure */
|
break; /* failure */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1849,7 +1916,7 @@ IntLoadFontsInRegistry(VOID)
|
||||||
pInfo = (PKEY_VALUE_FULL_INFORMATION)InfoBuffer;
|
pInfo = (PKEY_VALUE_FULL_INFORMATION)InfoBuffer;
|
||||||
if (!NT_SUCCESS(Status) || !pInfo->DataLength)
|
if (!NT_SUCCESS(Status) || !pInfo->DataLength)
|
||||||
{
|
{
|
||||||
DPRINT("ZwQueryValueKey failed: 0x%08X\n", Status);
|
DPRINT1("ZwQueryValueKey failed: 0x%08X\n", Status);
|
||||||
RtlFreeUnicodeString(&FontTitleW);
|
RtlFreeUnicodeString(&FontTitleW);
|
||||||
break; /* failure */
|
break; /* failure */
|
||||||
}
|
}
|
||||||
|
@ -1860,16 +1927,15 @@ IntLoadFontsInRegistry(VOID)
|
||||||
pchPath[Length] = UNICODE_NULL; /* truncate */
|
pchPath[Length] = UNICODE_NULL; /* truncate */
|
||||||
|
|
||||||
/* Load font(s) without writing registry */
|
/* Load font(s) without writing registry */
|
||||||
dwFlags = 0;
|
|
||||||
if (PathIsRelativeW(pchPath))
|
if (PathIsRelativeW(pchPath))
|
||||||
{
|
{
|
||||||
|
dwFlags = 0;
|
||||||
Status = RtlStringCbPrintfW(szPath, sizeof(szPath),
|
Status = RtlStringCbPrintfW(szPath, sizeof(szPath),
|
||||||
L"%s\\Fonts\\%s",
|
L"\\SystemRoot\\Fonts\\%s", pchPath);
|
||||||
SharedUserData->NtSystemRoot, pchPath);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dwFlags |= AFRX_ALTERNATIVE_PATH;
|
dwFlags = AFRX_ALTERNATIVE_PATH | AFRX_DOS_DEVICE_PATH;
|
||||||
Status = RtlStringCbCopyW(szPath, sizeof(szPath), pchPath);
|
Status = RtlStringCbCopyW(szPath, sizeof(szPath), pchPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,7 @@ TEXTOBJ_UnlockText(PLFONT plfnt)
|
||||||
/* dwFlags for IntGdiAddFontResourceEx */
|
/* dwFlags for IntGdiAddFontResourceEx */
|
||||||
#define AFRX_WRITE_REGISTRY 0x1
|
#define AFRX_WRITE_REGISTRY 0x1
|
||||||
#define AFRX_ALTERNATIVE_PATH 0x2
|
#define AFRX_ALTERNATIVE_PATH 0x2
|
||||||
|
#define AFRX_DOS_DEVICE_PATH 0x4
|
||||||
|
|
||||||
PTEXTOBJ FASTCALL RealizeFontInit(HFONT);
|
PTEXTOBJ FASTCALL RealizeFontInit(HFONT);
|
||||||
NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ);
|
NTSTATUS FASTCALL TextIntRealizeFont(HFONT,PTEXTOBJ);
|
||||||
|
|
Loading…
Reference in a new issue