[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Update registry code
Bring in new registry code from XENBUS to fix RegistryCreateKey()'s semantics. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/registry.c | 242 ++++++++++++++++++++++++++++++++------------------ src/xenvif/util.h | 42 ++++++++- 2 files changed, 195 insertions(+), 89 deletions(-) diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c index 0d3b3c5..233569f 100644 --- a/src/xenvif/registry.c +++ b/src/xenvif/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,92 @@ 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; + return STATUS_SUCCESS; +fail4: +fail3: + if (Parent != Root) + ZwClose(Parent); + +fail2: + __RegistryFree(Buffer); + fail1: return status; } @@ -308,7 +405,6 @@ RegistryCreateSubKey( { ANSI_STRING Ansi; UNICODE_STRING Unicode; - OBJECT_ATTRIBUTES Attributes; NTSTATUS status; RtlInitAnsiString(&Ansi, Name); @@ -317,27 +413,57 @@ RegistryCreateSubKey( if (!NT_SUCCESS(status)) goto fail1; - InitializeObjectAttributes(&Attributes, - &Unicode, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - Key, - NULL); + status = RegistryCreateKey(Key, &Unicode, Options, SubKey); + if (!NT_SUCCESS(status)) + goto fail2; + + RtlFreeUnicodeString(&Unicode); + + return STATUS_SUCCESS; + +fail2: + RtlFreeUnicodeString(&Unicode); + +fail1: + return status; +} - status = ZwCreateKey(SubKey, - KEY_ALL_ACCESS, - &Attributes, - 0, - NULL, - Options, - NULL - ); +NTSTATUS +RegistryDeleteSubKey( + IN PHANDLE Key, + IN PCHAR Name + ) +{ + ANSI_STRING Ansi; + UNICODE_STRING Unicode; + HANDLE SubKey; + NTSTATUS status; + + RtlInitAnsiString(&Ansi, Name); + + status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE); + if (!NT_SUCCESS(status)) + goto fail1; + + status = RegistryOpenKey(Key, &Unicode, KEY_ALL_ACCESS, &SubKey); if (!NT_SUCCESS(status)) goto fail2; + status = ZwDeleteKey(SubKey); + if (!NT_SUCCESS(status)) + goto fail3; + + ZwClose(SubKey); + + (VOID) ZwFlushKey(Key); + RtlFreeUnicodeString(&Unicode); return STATUS_SUCCESS; +fail3: + ZwClose(SubKey); + fail2: RtlFreeUnicodeString(&Unicode); @@ -449,64 +575,6 @@ fail1: return status; } -static NTSTATUS -RegistryDeleteSubKeyTree( - IN PVOID Context, - IN PHANDLE Key, - IN PANSI_STRING Name - ) -{ - HANDLE SubKey; - NTSTATUS status; - - UNREFERENCED_PARAMETER(Context); - - status = RegistryOpenSubKey(Key, - Name->Buffer, - KEY_ALL_ACCESS, - &SubKey); - if (!NT_SUCCESS(status)) - goto fail1; - - (VOID) RegistryEnumerateSubKeys(SubKey, - RegistryDeleteSubKeyTree, - NULL); - - status = ZwDeleteKey(SubKey); - if (!NT_SUCCESS(status)) - goto fail2; - - ZwClose(SubKey); - - return STATUS_SUCCESS; - -fail2: - ZwClose(SubKey); - -fail1: - return status; -} - -NTSTATUS -RegistryDeleteSubKey( - IN PHANDLE Key, - IN PCHAR Name - ) -{ - ANSI_STRING Ansi; - NTSTATUS status; - - RtlInitAnsiString(&Ansi, Name); - - status = RegistryDeleteSubKeyTree(NULL, - Key, - &Ansi); - - (VOID) ZwFlushKey(Key); - - return status; -} - NTSTATUS RegistryEnumerateValues( IN HANDLE Key, diff --git a/src/xenvif/util.h b/src/xenvif/util.h index 6d140b0..81dfb49 100644 --- a/src/xenvif/util.h +++ b/src/xenvif/util.h @@ -267,16 +267,54 @@ __strtok_r( if (Token == NULL) return NULL; - while (*Token != L'\0' && + while (*Token != '\0' && strchr(Delimiter, *Token) != NULL) Token++; + if (*Token == '\0') + return NULL; + + End = Token + 1; + while (*End != '\0' && + strchr(Delimiter, *End) == NULL) + End++; + + if (*End != '\0') + *End++ = '\0'; + + *Context = End; + + return Token; +} + +static FORCEINLINE PWCHAR +__wcstok_r( + IN PWCHAR Buffer, + IN PWCHAR Delimiter, + IN OUT PWCHAR *Context + ) +{ + PWCHAR Token; + PWCHAR End; + + if (Buffer != NULL) + *Context = Buffer; + + Token = *Context; + + if (Token == NULL) + return NULL; + + while (*Token != L'\0' && + wcschr(Delimiter, *Token) != NULL) + Token++; + if (*Token == L'\0') return NULL; End = Token + 1; while (*End != L'\0' && - strchr(Delimiter, *End) == NULL) + wcschr(Delimiter, *End) == NULL) End++; if (*End != L'\0') -- 2.1.1 _______________________________________________ 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 |