[PATCH] advapi32: MachineGUID to have same value in WoW64

Nikolay Sivov nsivov at codeweavers.com
Wed Oct 17 01:35:31 CDT 2018


On 10/17/2018 08:34 AM, Brendan McGrath wrote:

> You're right. I guess I wasn't expecting it to be an application 
> developers responsibility to use the 'KEY_WOW64_64KEY' flag when 
> accessing 'HKLM\Software\Microsoft\Cryptography' unless:
> a) 'HKLM\Software\Microsoft\Cryptography' was created after the advent 
> of 64bit windows; or
> b) Microsoft doesn't care about breaking legacy 32bit apps

Another possibility is that they want to avoid this problem exactly, so 
you can't have different value for the "same" parameter. I don't really 
know what exactly was fixed by adding this key, if it was for .NET then 
surely they are aware of 32bit difference.

Do you access this key yourself or does Mono access it (I don't 
immediately see this in their code)?

>
>
>
> But back on topic: my original patch is no good - but did you want me 
> to submit a patch for using KEY_WOW64_64KEY when opening a key in 
> CRYPT_CreateMachineGuid()?


Sure, I don't see why not.

>
>
> On 16/10/18 10:13 pm, Nikolay Sivov wrote:
>> On 10/16/2018 02:10 PM, Brendan McGrath wrote:
>>
>>> After applying the following (which is what I think you meant):
>>> --- a/dlls/advapi32/crypt.c
>>> +++ b/dlls/advapi32/crypt.c
>>> @@ -281,7 +281,7 @@ static void CRYPT_CreateMachineGuid(void)
>>>         LONG r;
>>>         HKEY key;
>>>
>>> -       r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, cryptographyW, 0, 
>>> KEY_ALL_ACCESS,
>>> +       r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, cryptographyW, 0, 
>>> KEY_ALL_ACCESS | KEY_WOW64_64KEY,
>>>
>>> the 32bit branch no longer exists but I now get:
>>> $ wine reg query 'HKLM\Software\Microsoft\Cryptography' /v MachineGuid
>>> reg: The system was unable to find the specified registry key or value
>>>
>>> $ wine64 reg query 'HKLM\Software\Microsoft\Cryptography' /v 
>>> MachineGuid
>>> HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography
>>>     MachineGuid    REG_SZ e6ecce64-237e-4e28-8342-3f292975255f
>>>
>>> So this is not desirable either (as it also means the 32-bit 
>>> Launcher I've been testing with no longer works).
>>
>> Yes, and that's what happens on Windows when you use 32-bit reg.exe.
>>
>>>
>>>
>>>
>>> On 16/10/18 21:47, Nikolay Sivov wrote:
>>>>
>>>>
>>>> On 10/16/2018 01:43 PM, Brendan McGrath wrote:
>>>>> I agree - that would match what Windows currently does.
>>>>>
>>>>> But at the moment wine creates two reg entries:
>>>>> [Software\\Microsoft\\Cryptography] 1539591005
>>>>> "MachineGuid"="136a597b-d2a8-4b79-8d9c-d8d99a496a0e"
>>>>>
>>>>> [Software\\*Wow6432Node*\\Microsoft\\Cryptography] 1539591011
>>>>> "MachineGuid"="ace73aff-5746-4a53-8358-795778289ed0"
>>>>>
>>>>> And when running 'wine' (as opposed to 'wine64') wine 
>>>>> automatically uses KEY_WOW64_32KEY when accessing registry keys; 
>>>>> thus:
>>>>> $ wine reg query 'HKLM\Software\Microsoft\Cryptography' /v 
>>>>> MachineGuid
>>>>> HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography
>>>>>     MachineGuid    REG_SZ ace73aff-5746-4a53-8358-795778289ed0
>>>>>
>>>>> returns the value from the 32bit branch (i.e. under 'Wow6432Node').
>>>>>
>>>>> and when running:
>>>>> $ wine64 reg query 'HKLM\Software\Microsoft\Cryptography' /v 
>>>>> MachineGuid
>>>>> HKEY_LOCAL_MACHINE\Software\Microsoft\Cryptography
>>>>>     MachineGuid    REG_SZ 136a597b-d2a8-4b79-8d9c-d8d99a496a0e
>>>>>
>>>>> we get the correct value from the 64bit branch.
>>>>>
>>>>> But this is two different values based on whether you use 'wine' 
>>>>> or 'wine64' - which is definitely not right (and results in 
>>>>> https://bugs.winehq.org/show_bug.cgi?id=43464).
>>>>>
>>>>> This patch doesn't remove the 'MachineGuid' value from the 32bit 
>>>>> branch - but it does at least fix the aforementioned bug.
>>>>>
>>>>> Finding a solution to remove the 'MachineGuid' value from the 
>>>>> 32bit branch was something I considered - but I couldn't find a 
>>>>> precedent.
>>>>>
>>>>> Please let me know if there is a precedent - but if not I think 
>>>>> our only option would be to intercept a get/set value request to 
>>>>> "Software\\Wow6432Node\\Microsoft\\Cryptography\\MachineGuid" and 
>>>>> remove the "Wow6432Node" part.
>>>>>
>>>>> Other alternatives that would still result in a 32bit branch value 
>>>>> (but keep it in sync with the 64bit branch value) would be:
>>>>> a) some kind of symlink equivalent for individual values; or
>>>>> b) registry reflection
>>>>>
>>>>
>>>> The value in 32-bit branch shouldn't exist in a first place. Like I 
>>>> said, try KEY_WOW64_64KEY when opening a key in 
>>>> CRYPT_CreateMachineGuid().
>>>>
>>>>>
>>>>> On 16/10/18 19:54, Nikolay Sivov wrote:
>>>>>>
>>>>>>
>>>>>> On 10/16/2018 11:06 AM, Brendan McGrath wrote:
>>>>>>> Currently, when running the following two commands in a new prefix:
>>>>>>> wine reg query 'HKLM\Software\Microsoft\Cryptography' /v 
>>>>>>> MachineGuid
>>>>>>> wine64 reg query 'HKLM\Software\Microsoft\Cryptography' /v 
>>>>>>> MachineGuid
>>>>>>>
>>>>>>> Two different values are returned. This can cause an issue when, 
>>>>>>> for
>>>>>>> example, a 32-bit Launcher and 64-bit application expect the 
>>>>>>> same value.
>>>>>>>
>>>>>>> This patch ensures that when the 64-bit GUID is created, the 32-bit
>>>>>>> GUID is created as well (with the same value).
>>>>>>>
>>>>>>> Signed-off-by: Brendan McGrath <brendan at redmandi.com>
>>>>>>> ---
>>>>>>>
>>>>>>> I considered a few options on how to achieve this; but ended up 
>>>>>>> with
>>>>>>> this option as it seemed the simplest. However, it does leave the
>>>>>>> possiblity for an application or user to change one and leave 
>>>>>>> the other.
>>>>>>>
>>>>>>> I did note that Windows doesn't appear to have a MachineGuid 
>>>>>>> entry for
>>>>>>> WoW, so it looks like Windows just uses the one entry. But I wasn't
>>>>>>> sure of the best way to achieve that in Wine (and couldn't find a
>>>>>>> precedent).
>>>>>>
>>>>>> Hi, Brendan.
>>>>>>
>>>>>> Thanks for the patch. Since this value should only be present in 
>>>>>> 64bit branch, key should be opened with KEY_WOW64_64KEY when 
>>>>>> setting it. You can't access it on Windows either, with /reg:32 
>>>>>> mode, which is default for 32-bit reg.exe.
>>>>>>
>>>>>>>
>>>>>>>   dlls/advapi32/crypt.c | 8 ++++++++
>>>>>>>   1 file changed, 8 insertions(+)
>>>>>>>
>>>>>>> diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c
>>>>>>> index 01d58804235..0ea64b52226 100644
>>>>>>> --- a/dlls/advapi32/crypt.c
>>>>>>> +++ b/dlls/advapi32/crypt.c
>>>>>>> @@ -313,6 +313,14 @@ static void CRYPT_CreateMachineGuid(void)
>>>>>>>                           RegSetValueExW(key, machineGuidW, 0, 
>>>>>>> REG_SZ,
>>>>>>>                                          (const BYTE *)buf,
>>>>>>> (lstrlenW(buf)+1)*sizeof(WCHAR));
>>>>>>> +                        r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, 
>>>>>>> cryptographyW, 0,
>>>>>>> + KEY_ALL_ACCESS | KEY_WOW64_32KEY, &key);
>>>>>>> +                        if (!r)
>>>>>>> +                        {
>>>>>>> +                            RegSetValueExW(key, machineGuidW, 
>>>>>>> 0, REG_SZ,
>>>>>>> +                                           (const BYTE *)buf,
>>>>>>> + (lstrlenW(buf)+1)*sizeof(WCHAR));
>>>>>>> +                        }
>>>>>>>                       }
>>>>>>>           }
>>>>>>>           RegCloseKey(key);
>>>>>>
>>>>>
>>>>
>>>
>>
>




More information about the wine-devel mailing list