[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 |