[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH] Update registry code



Bring the code into like with the latest XENBUS code, which has a few
fixes that are missing here.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xeniface/registry.c | 155 +++++++++++++++++++++++++++++++++++-------------
 1 file changed, 115 insertions(+), 40 deletions(-)

diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index d994e13..9f5628c 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -115,6 +115,39 @@ fail1:
     return status;
 }
 
+static NTSTATUS
+RegistryOpenRoot(
+    IN  PWCHAR          Path,
+    OUT PHANDLE         Parent,
+    OUT PWCHAR          *ChildPath
+    )
+{
+    const WCHAR         Prefix[] = L"\\Registry\\Machine\\";
+    ULONG               Length;
+    UNICODE_STRING      Unicode;
+    NTSTATUS            status;
+
+    Length = (ULONG)wcslen(Prefix);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (_wcsnicmp(Path, Prefix, Length) != 0)
+        goto fail1;
+
+    RtlInitUnicodeString(&Unicode, Prefix);
+
+    status = RegistryOpenKey(NULL, &Unicode, KEY_ALL_ACCESS, Parent);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    *ChildPath = Path + Length;
+
+    return STATUS_SUCCESS;
+
+fail2:
+fail1:
+    return status;
+}
+
 NTSTATUS
 RegistryCreateKey(
     IN  HANDLE          Parent,
@@ -123,28 +156,94 @@ RegistryCreateKey(
     OUT PHANDLE         Key
     )
 {
-    OBJECT_ATTRIBUTES   Attributes;
+    PWCHAR              Buffer;
+    HANDLE              Root;
+    PWCHAR              ChildPath;
+    PWCHAR              ChildName;
+    PWCHAR              Context;
+    HANDLE              Child;
     NTSTATUS            status;
 
-    InitializeObjectAttributes(&Attributes,
-                               Path,
-                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
-                               Parent,
-                               NULL);
+    //
+    // UNICODE_STRINGs are not guaranteed to have NUL terminated
+    // buffers.
+    //
 
-    status = ZwCreateKey(Key,
-                         KEY_ALL_ACCESS,
-                         &Attributes,
-                         0,
-                         NULL,
-                         Options,
-                         NULL
-                         );
-    if (!NT_SUCCESS(status))
+    Buffer = __RegistryAllocate(Path->MaximumLength + sizeof (WCHAR));
+
+    status = STATUS_NO_MEMORY;
+    if (Buffer == NULL)
         goto fail1;
 
+    RtlCopyMemory(Buffer, Path->Buffer, Path->Length);
+
+    Root = Parent;
+
+    if (Parent != NULL) {
+        ChildPath = Buffer;
+    } else {
+        status = RegistryOpenRoot(Buffer, &Parent, &ChildPath);
+        if (!NT_SUCCESS(status))
+            goto fail2;
+    }
+
+    ChildName = __wcstok_r(ChildPath, L"\\", &Context);
+
+    status = STATUS_INVALID_PARAMETER;
+    if (ChildName == NULL)
+        goto fail3;
+
+    Child = NULL;
+
+    while (ChildName != NULL) {
+        UNICODE_STRING      Unicode;
+        OBJECT_ATTRIBUTES   Attributes;
+
+        RtlInitUnicodeString(&Unicode, ChildName);
+
+        InitializeObjectAttributes(&Attributes,
+                                   &Unicode,
+                                   OBJ_CASE_INSENSITIVE |
+                                   OBJ_KERNEL_HANDLE |
+                                   OBJ_OPENIF,
+                                   Parent,
+                                   NULL);
+
+        status = ZwCreateKey(&Child,
+                             KEY_ALL_ACCESS,
+                             &Attributes,
+                             0,
+                             NULL,
+                             Options,
+                             NULL
+                             );
+        if (!NT_SUCCESS(status))
+            goto fail4;
+
+        ChildName = __wcstok_r(NULL, L"\\", &Context);
+
+        if (Parent != Root)
+            ZwClose(Parent);
+
+        Parent = Child;
+    }
+
+    ASSERT(Child != NULL);
+
+    *Key = Child;
+
+    __RegistryFree(Buffer);
+
     return STATUS_SUCCESS;
 
+fail4:
+fail3:
+    if (Parent != Root)
+        ZwClose(Parent);
+
+fail2:
+    __RegistryFree(Buffer);
+
 fail1:
     return status;
 }
@@ -308,7 +407,6 @@ RegistryCreateSubKey(
 {
     ANSI_STRING         Ansi;
     UNICODE_STRING      Unicode;
-    OBJECT_ATTRIBUTES   Attributes;
     NTSTATUS            status;
 
     RtlInitAnsiString(&Ansi, Name);
@@ -317,20 +415,7 @@ RegistryCreateSubKey(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    InitializeObjectAttributes(&Attributes,
-                               &Unicode,
-                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
-                               Key,
-                               NULL);
-
-    status = ZwCreateKey(SubKey,
-                         KEY_ALL_ACCESS,
-                         &Attributes,
-                         0,
-                         NULL,
-                         Options,
-                         NULL
-                         );
+    status = RegistryCreateKey(Key, &Unicode, Options, SubKey);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -372,8 +457,6 @@ RegistryDeleteSubKey(
 
     ZwClose(SubKey);
 
-    (VOID) ZwFlushKey(Key);
-
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -612,8 +695,6 @@ RegistryDeleteValue(
 
     RtlFreeUnicodeString(&Unicode);
 
-    (VOID) ZwFlushKey(Key);
-
     return STATUS_SUCCESS;
 
 fail2:
@@ -734,8 +815,6 @@ RegistryUpdateDwordValue(
 
     __RegistryFree(Partial);
 
-    (VOID) ZwFlushKey(Key);
-
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -1066,8 +1145,6 @@ RegistryUpdateBinaryValue(
 
     __RegistryFree(Partial);
 
-    (VOID) ZwFlushKey(Key);
-
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -1358,8 +1435,6 @@ RegistryUpdateSzValue(
 
     __RegistryFree(Partial);
 
-    (VOID) ZwFlushKey(Key);
-
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
-- 
2.5.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.