[PATCH v3] gdi32: Create the registry keys recursively, if needed.

Gabriel Ivăncescu gabrielopcode at gmail.com
Mon Oct 4 13:22:57 CDT 2021


On 04/10/2021 21:03, Jacek Caban wrote:
> On 10/4/21 7:29 PM, Gabriel Ivăncescu wrote:
>> On 04/10/2021 18:41, Gabriel Ivăncescu wrote:
>>> On 04/10/2021 16:16, Gabriel Ivăncescu wrote:
>>>> On 04/10/2021 09:39, Huw Davies wrote:
>>>>> On Sun, Oct 03, 2021 at 08:33:41AM -0500, Marvin wrote:
>>>>>> Hi,
>>>>>>
>>>>>> While running your changed tests, I think I found new failures.
>>>>>> Being a bot and all I'm not very good at pattern recognition, so I 
>>>>>> might be
>>>>>> wrong, but could you please double-check?
>>>>>>
>>>>>> Full results can be found at:
>>>>>> https://testbot.winehq.org/JobDetails.pl?Key=99265
>>>>>>
>>>>>> Your paranoid android.
>>>>>>
>>>>>>
>>>>>> === debiant2 (32 bit report) ===
>>>>>>
>>>>>> gdi32:
>>>>>> font.c:1234: Test failed: GetCharABCWidthsW should have failed
>>>>>> font.c:1681: Test failed: GetGlyphIndicesW should have returned a 
>>>>>> 001f not 0000
>>>>>> font.c:4387: Test failed: info[0] = 3 for the system font
>>>>>> font.c:5033: Test failed: Unexpected first glyph L":"
>>>>>> font.c:5060: Test failed: Unexpected first glyph L":"
>>>>>> font.c:7484: Test failed: expected 0, got -1
>>>>>> font.c:7485: Test failed: expected 0, got -6
>>>>>> metafile.c:5106: Test failed: expected 0, got 150
>>>>>> metafile.c:5180: Test failed: expected 0, got 150
>>>>>
>>>>> These do indeed appear to be new failures.
>>>>>
>>>>> Huw.
>>>>>
>>>>
>>>> Well, I get those tests even without this patch applied. I don't 
>>>> actually see how it *could* influence the tests anyway, because it 
>>>> first tries to open the key directly (like the helper in kernelbase) 
>>>> so as long as the key exists, the behavior should be identical to 
>>>> before.
>>>>
>>>> Maybe the testbot created new prefixes and the tests were simply 
>>>> broken before and not tested somehow? At least when creating a 
>>>> 32-bit prefix, my window decorator crashed without this patch.
>>>>
>>>> Thanks,
>>>> Gabriel
>>>
>>> So it looks like 8e40e56b79c39356a981bbc25100daa9635b29f3 is the 
>>> culprit of the test failures, but note that the failures happen only 
>>> when *creating* the prefix with that commit, and it's what's broken.
>>>
>>> If the prefix was created without that commit, it will succeed. Also, 
>>> if the prefix was created with that commit, and then wine without 
>>> such commit was used to run the tests, it would also fail.
>>>
>>> Anyway, it's unrelated to this patch (I even tested with it to create 
>>> prefixes cleanly without crashing).
>>
>> The problem is that these values are not set anymore in the registry:
>>
>> [System\CurrentControlSet\Hardware Profiles\Current\Software\Fonts]
>> "FIXEDFON.FON"="vgafix.fon"
>> "FONTS.FON"="vgasys.fon"
>> "OEMFONT.FON"="vgaoem.fon"
>>
>> This is because, in kernelbase, we have get_special_root_hkey and 
>> create_special_root_hkey, which creates the HKEY_CURRENT_CONFIG 
>> special key. This has to be created *before* the values are set in 
>> update_codepage!
>>
>> However, commit 8e40e56b79c39356a981bbc25100daa9635b29f3 removed the 
>> get_dpi function, which did a get_reg_dword(HKEY_CURRENT_CONFIG, ...), 
>> which implicitly created the special key HKEY_CURRENT_CONFIG in 
>> kernelbase.
>>
>> I'm not sure why it works if the prefix creation font init fails. You 
>> can just forcefully hack it to fail and it will work to create those 
>> values, although it crashes the decorator and all that. So, making the 
>> wine_fonts_key creation fail for some reason will enable those values 
>> to be set. But that's obviously a hack, so the patch isn't wrong 
>> (because it makes it work).
>>
>> I have no idea how to fix this, since that whole special key thing is 
>> part of kernelbase. Any thoughts?
> 
> 
> Thanks for looking at this. The problem is that reg_create_key doesn't 
> handle well creation of root-less keys. It shouldn't try to create 
> "\Registry" key. The attached change helps here, does it work for you?
> 
> 
> Thanks,
> 
> Jacek
> 

Yeah it does, thanks for the fix, I'll resend v4 that checks for 
\\Registry\\ just in case (as is done in kernelbase).



More information about the wine-devel mailing list