Andrew Eikum : advapi32: Attempt to open WOW64 key before the lowest level key, too.

Alexandre Julliard julliard at winehq.org
Fri Jan 10 14:44:52 CST 2014


Module: wine
Branch: stable
Commit: 151c003c22d28cc809d4e1d4b2d3bb437769dad0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=151c003c22d28cc809d4e1d4b2d3bb437769dad0

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Fri Oct  4 09:44:21 2013 -0500

advapi32: Attempt to open WOW64 key before the lowest level key, too.

Without this, we'll fail to open the correct key for e.g.
<Machine\Software\Classes> with KEY_WOW64_32KEY, which should resolve to
<Machine\Software\Wow6432Node\Classes>.

(cherry picked from commit 8cb7f877d7406065074183ae8541355f0090e6db)

---

 dlls/advapi32/registry.c |   43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)

diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index c01e125..9012254 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -140,10 +140,9 @@ static NTSTATUS create_key( HKEY *retkey, ACCESS_MASK access, OBJECT_ATTRIBUTES
         if (i == len && !force_wow32) return status;
 
         attrs = attr->Attributes;
-        attr->Attributes &= ~OBJ_OPENLINK;
         attr->ObjectName = &str;
 
-        while (i < len)
+        for (;;)
         {
             str.Buffer = buffer + pos;
             str.Length = (i - pos) * sizeof(WCHAR);
@@ -157,20 +156,25 @@ static NTSTATUS create_key( HKEY *retkey, ACCESS_MASK access, OBJECT_ATTRIBUTES
                     force_wow32 = FALSE;
                 }
             }
-            status = NtCreateKey( &subkey, access, attr, 0, class,
-                                  options & ~REG_OPTION_CREATE_LINK, dispos );
+            if (i == len)
+            {
+                attr->Attributes = attrs;
+                status = NtCreateKey( (PHANDLE)retkey, access, attr, 0, class, options, dispos );
+            }
+            else
+            {
+                attr->Attributes = attrs & ~OBJ_OPENLINK;
+                status = NtCreateKey( &subkey, access, attr, 0, class,
+                                      options & ~REG_OPTION_CREATE_LINK, dispos );
+            }
             if (attr->RootDirectory != root) NtClose( attr->RootDirectory );
             if (status) return status;
+            if (i == len) break;
             attr->RootDirectory = subkey;
             while (i < len && buffer[i] == '\\') i++;
             pos = i;
             while (i < len && buffer[i] != '\\') i++;
         }
-        str.Buffer = buffer + pos;
-        str.Length = (i - pos) * sizeof(WCHAR);
-        attr->Attributes = attrs;
-        status = NtCreateKey( (PHANDLE)retkey, access, attr, 0, class, options, dispos );
-        if (attr->RootDirectory != root) NtClose( attr->RootDirectory );
     }
     return status;
 }
@@ -190,10 +194,9 @@ static NTSTATUS open_key( HKEY *retkey, ACCESS_MASK access, OBJECT_ATTRIBUTES *a
     if (len && buffer[0] == '\\') return STATUS_OBJECT_PATH_INVALID;
     while (i < len && buffer[i] != '\\') i++;
     attrs = attr->Attributes;
-    attr->Attributes &= ~OBJ_OPENLINK;
     attr->ObjectName = &str;
 
-    while (i < len)
+    for (;;)
     {
         str.Buffer = buffer + pos;
         str.Length = (i - pos) * sizeof(WCHAR);
@@ -207,21 +210,25 @@ static NTSTATUS open_key( HKEY *retkey, ACCESS_MASK access, OBJECT_ATTRIBUTES *a
                 force_wow32 = FALSE;
             }
         }
-        status = NtOpenKey( &subkey, access, attr );
+        if (i == len)
+        {
+            attr->Attributes = attrs;
+            status = NtOpenKey( (PHANDLE)retkey, access, attr );
+        }
+        else
+        {
+            attr->Attributes = attrs & ~OBJ_OPENLINK;
+            status = NtOpenKey( &subkey, access, attr );
+        }
         if (attr->RootDirectory != root) NtClose( attr->RootDirectory );
         if (status) return status;
+        if (i == len) break;
         attr->RootDirectory = subkey;
         while (i < len && buffer[i] == '\\') i++;
         pos = i;
         while (i < len && buffer[i] != '\\') i++;
     }
-    str.Buffer = buffer + pos;
-    str.Length = (i - pos) * sizeof(WCHAR);
-    attr->Attributes = attrs;
-    status = NtOpenKey( (PHANDLE)retkey, access, attr );
-    if (attr->RootDirectory != root) NtClose( attr->RootDirectory );
     return status;
-
 }
 
 /* create one of the HKEY_* special root keys */




More information about the wine-cvs mailing list