|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |