gdi32: Directly use ntdll in load_registry_fonts.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-09-27 13:05:26 +02:00 committed by Alexandre Julliard
parent b544b74880
commit b6e494f568
1 changed files with 27 additions and 26 deletions

View File

@ -6068,53 +6068,54 @@ static void update_external_font_keys(void)
static void load_registry_fonts(void)
{
WCHAR value[LF_FULLFACESIZE + 12], data[MAX_PATH + 4], *tmp, *path;
DWORD i = 0, type, dlen, vlen;
char value_buffer[FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[MAX_PATH * sizeof(WCHAR)])];
KEY_VALUE_PARTIAL_INFORMATION *info = (void *)value_buffer;
KEY_VALUE_FULL_INFORMATION *enum_info = (KEY_VALUE_FULL_INFORMATION *)value_buffer;
WCHAR value[LF_FULLFACESIZE + 12], *tmp, *path;
DWORD i = 0, dlen;
HKEY hkey;
static const WCHAR dot_fonW[] = {'.','f','o','n',0};
/* Look under HKLM\Software\Microsoft\Windows[ NT]\CurrentVersion\Fonts
for any fonts not installed in %WINDOWSDIR%\Fonts. They will have their
full path as the entry. Also look for any .fon fonts, since ReadFontDir
will skip these. */
if (RegOpenKeyW( HKEY_LOCAL_MACHINE,
is_win9x() ? L"Software\\Microsoft\\Windows\\CurrentVersion\\Fonts" :
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", &hkey ))
return;
if (is_win9x())
hkey = reg_open_key( NULL, fonts_win9x_config_keyW, sizeof(fonts_win9x_config_keyW) );
else
hkey = reg_open_key( NULL, fonts_winnt_config_keyW, sizeof(fonts_winnt_config_keyW) );
if (!hkey) return;
memcpy( data, nt_prefixW, sizeof(nt_prefixW) );
vlen = ARRAY_SIZE(value);
dlen = sizeof(data) - sizeof(nt_prefixW);
while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, NULL, NULL ))
while (reg_enum_value( hkey, i++, enum_info, sizeof(value_buffer), value, sizeof(value) ))
{
if (type != REG_SZ) goto next;
dlen /= sizeof(WCHAR);
if ((tmp = wcsrchr( value, ' ' )) && !facename_compare( tmp, L" (TrueType)", -1 )) *tmp = 0;
if (find_face_from_full_name( value )) goto next;
if (enum_info->Type != REG_SZ) continue;
if ((tmp = wcsrchr( value, ' ' )) && !facename_compare( tmp, true_type_suffixW, -1 )) *tmp = 0;
if (find_face_from_full_name( value )) continue;
if (tmp && !*tmp) *tmp = ' ';
path = data + ARRAYSIZE(nt_prefixW);
if (RegQueryValueExW( hkey, value, NULL, NULL, (LPBYTE)data + sizeof(nt_prefixW), &dlen ))
if (!(dlen = query_reg_value( hkey, value, info, sizeof(value_buffer) - sizeof(nt_prefixW) )) ||
info->Type != REG_SZ)
{
WARN( "Unable to get face path %s\n", debugstr_w(value) );
goto next;
continue;
}
path = (WCHAR *)info->Data;
if (path[0] && path[1] == ':')
{
path = data;
memmove( path + ARRAYSIZE(nt_prefixW), path, dlen );
memcpy( path, nt_prefixW, sizeof(nt_prefixW) );
dlen += sizeof(nt_prefixW);
}
dlen /= sizeof(WCHAR);
if (*path == '\\')
add_font_resource( path, ADDFONT_ALLOW_BITMAP );
else if (dlen >= 6 && !wcsicmp( path + dlen - 5, L".fon" ))
else if (dlen >= 6 && !wcsicmp( path + dlen - 5, dot_fonW ))
add_system_font_resource( path, ADDFONT_ALLOW_BITMAP );
next:
vlen = ARRAY_SIZE(value);
dlen = sizeof(data) - sizeof(nt_prefixW);
}
RegCloseKey( hkey );
NtClose( hkey );
}
static const struct font_callback_funcs callback_funcs = { add_gdi_face };
@ -6134,9 +6135,9 @@ void font_init(void)
'\\','_','_','W','I','N','E','_','F','O','N','T','_','M','U','T','E','X','_','_'};
static const WCHAR wine_fonts_keyW[] =
{'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\','F','o','n','t','s'};
static const WCHAR cacheW[] = {'C','a','c','h','e'};
if (RtlOpenCurrentUser( MAXIMUM_ALLOWED, &hkcu )) return;
wine_fonts_key = reg_create_key( hkcu, wine_fonts_keyW, sizeof(wine_fonts_keyW), 0, NULL );
if (wine_fonts_key) init_font_options( hkcu );
NtClose( hkcu );
@ -6157,8 +6158,8 @@ void font_init(void)
if (NtCreateMutant( &mutex, MUTEX_ALL_ACCESS, &attr, FALSE ) < 0) return;
NtWaitForSingleObject( mutex, FALSE, NULL );
RegCreateKeyExW( wine_fonts_key, L"Cache", 0, NULL, REG_OPTION_VOLATILE,
KEY_ALL_ACCESS, NULL, &wine_fonts_cache_key, &disposition );
wine_fonts_cache_key = reg_create_key( wine_fonts_key, cacheW, sizeof(cacheW),
REG_OPTION_VOLATILE, &disposition );
if (disposition == REG_CREATED_NEW_KEY)
{