[ADVAPI32] -RegOpenKeyExW: Call NtOpenKey again with aligned parameters if STATUS_DAT...
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 17 Aug 2017 14:37:24 +0000 (14:37 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 17 Aug 2017 14:37:24 +0000 (14:37 +0000)
svn path=/trunk/; revision=75592

reactos/dll/win32/advapi32/reg/reg.c

index 8fe9e36..42d00a3 100644 (file)
@@ -3429,6 +3429,39 @@ RegOpenKeyExW(HKEY hKey,
                        samDesired,
                        &ObjectAttributes);
 
+    if (Status == STATUS_DATATYPE_MISALIGNMENT)
+    {
+        HANDLE hAligned;
+        UNICODE_STRING AlignedString;
+
+        Status = RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
+                                           &SubKeyString,
+                                           &AlignedString);
+        if (NT_SUCCESS(Status))
+        {
+            /* Try again with aligned parameters */
+            InitializeObjectAttributes(&ObjectAttributes,
+                                       &AlignedString,
+                                       Attributes,
+                                       KeyHandle,
+                                       NULL);
+
+            Status = NtOpenKey(&hAligned,
+                               samDesired,
+                               &ObjectAttributes);
+
+            RtlFreeUnicodeString(&AlignedString);
+
+            if (NT_SUCCESS(Status))
+                *phkResult = hAligned;
+        }
+        else
+        {
+            /* Restore the original error */
+            Status = STATUS_DATATYPE_MISALIGNMENT;
+        }
+    }
+
     if (!NT_SUCCESS(Status))
     {
         ErrorCode = RtlNtStatusToDosError(Status);