[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/4] Update registry code
...to bring it in line with XENVIF Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/common/registry.c | 191 +++++++++++++++++++++++++++++++++++++++++++------- src/common/registry.h | 31 ++++++-- 2 files changed, 193 insertions(+), 29 deletions(-) diff --git a/src/common/registry.c b/src/common/registry.c index cb9e31d..2785020 100644 --- a/src/common/registry.c +++ b/src/common/registry.c @@ -389,7 +389,7 @@ fail1: NTSTATUS RegistryEnumerateSubKeys( IN HANDLE Key, - IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR), + IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING), IN PVOID Context ) { @@ -432,6 +432,7 @@ RegistryEnumerateSubKeys( goto fail4; for (Index = 0; Index < Full->SubKeys; Index++) { + ULONG Ignore; UNICODE_STRING Unicode; ANSI_STRING Ansi; @@ -440,7 +441,7 @@ RegistryEnumerateSubKeys( KeyBasicInformation, Basic, Size, - &Size); + &Ignore); if (!NT_SUCCESS(status)) goto fail5; @@ -460,7 +461,7 @@ RegistryEnumerateSubKeys( Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR)); - status = Callback(Context, Key, Ansi.Buffer); + status = Callback(Context, Key, &Ansi); __RegistryFree(Ansi.Buffer); Ansi.Buffer = NULL; @@ -492,7 +493,7 @@ fail1: NTSTATUS RegistryEnumerateValues( IN HANDLE Key, - IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR), + IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG), IN PVOID Context ) { @@ -535,6 +536,7 @@ RegistryEnumerateValues( goto fail4; for (Index = 0; Index < Full->Values; Index++) { + ULONG Ignore; UNICODE_STRING Unicode; ANSI_STRING Ansi; @@ -543,7 +545,7 @@ RegistryEnumerateValues( KeyValueBasicInformation, Basic, Size, - &Size); + &Ignore); if (!NT_SUCCESS(status)) goto fail5; @@ -559,7 +561,7 @@ RegistryEnumerateValues( Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR)); - status = Callback(Context, Key, Ansi.Buffer); + status = Callback(Context, Key, &Ansi, Basic->Type); __RegistryFree(Ansi.Buffer); @@ -928,6 +930,148 @@ fail1: } NTSTATUS +RegistryQueryBinaryValue( + IN HANDLE Key, + IN PCHAR Name, + OUT PVOID *Buffer, + OUT PULONG Length + ) +{ + ANSI_STRING Ansi; + UNICODE_STRING Unicode; + PKEY_VALUE_PARTIAL_INFORMATION Partial; + ULONG Size; + NTSTATUS status; + + RtlInitAnsiString(&Ansi, Name); + + status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE); + if (!NT_SUCCESS(status)) + goto fail1; + + status = ZwQueryValueKey(Key, + &Unicode, + KeyValuePartialInformation, + NULL, + 0, + &Size); + if (status != STATUS_BUFFER_OVERFLOW && + status != STATUS_BUFFER_TOO_SMALL) + goto fail2; + +#pragma prefast(suppress:6102) + Partial = __RegistryAllocate(Size); + + status = STATUS_NO_MEMORY; + if (Partial == NULL) + goto fail3; + + status = ZwQueryValueKey(Key, + &Unicode, + KeyValuePartialInformation, + Partial, + Size, + &Size); + if (!NT_SUCCESS(status)) + goto fail4; + + switch (Partial->Type) { + case REG_BINARY: + *Buffer = __RegistryAllocate(Partial->DataLength); + + status = STATUS_NO_MEMORY; + if (*Buffer == NULL) + break; + + *Length = Partial->DataLength; + RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength); + break; + + default: + status = STATUS_INVALID_PARAMETER; + *Buffer = NULL; + break; + } + + if (*Buffer == NULL) + goto fail5; + + __RegistryFree(Partial); + + RtlFreeUnicodeString(&Unicode); + + return STATUS_SUCCESS; + +fail5: +fail4: + __RegistryFree(Partial); + +fail3: +fail2: + RtlFreeUnicodeString(&Unicode); + +fail1: + return status; +} + +NTSTATUS +RegistryUpdateBinaryValue( + IN HANDLE Key, + IN PCHAR Name, + IN PVOID Buffer, + IN ULONG Length + ) +{ + ANSI_STRING Ansi; + UNICODE_STRING Unicode; + PKEY_VALUE_PARTIAL_INFORMATION Partial; + NTSTATUS status; + + RtlInitAnsiString(&Ansi, Name); + + status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE); + if (!NT_SUCCESS(status)) + goto fail1; + + Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) + + Length); + + status = STATUS_NO_MEMORY; + if (Partial == NULL) + goto fail2; + + Partial->TitleIndex = 0; + Partial->Type = REG_BINARY; + Partial->DataLength = Length; + RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength); + + status = ZwSetValueKey(Key, + &Unicode, + Partial->TitleIndex, + Partial->Type, + Partial->Data, + Partial->DataLength); + if (!NT_SUCCESS(status)) + goto fail3; + + __RegistryFree(Partial); + + RtlFreeUnicodeString(&Unicode); + + return STATUS_SUCCESS; + +fail3: + __RegistryFree(Partial); + +fail2: + RtlFreeUnicodeString(&Unicode); + +fail1: + + return status; +} + +NTSTATUS RegistryQueryKeyName( IN HANDLE Key, OUT PANSI_STRING *Array @@ -1156,13 +1300,12 @@ NTSTATUS RegistryUpdateSzValue( IN HANDLE Key, IN PCHAR Name, - IN ULONG Type, - ... + IN PANSI_STRING Array ) { ANSI_STRING Ansi; UNICODE_STRING Unicode; - va_list Arguments; + ULONG Type; PKEY_VALUE_PARTIAL_INFORMATION Partial; NTSTATUS status; @@ -1171,33 +1314,25 @@ RegistryUpdateSzValue( status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE); if (!NT_SUCCESS(status)) goto fail1; - - va_start(Arguments, Type); - switch (Type) { - case REG_SZ: { - PANSI_STRING Argument; - Argument = va_arg(Arguments, PANSI_STRING); + Type = (Array[1].Buffer != NULL) ? REG_MULTI_SZ : REG_SZ; + switch (Type) { + case REG_SZ: status = STATUS_NO_MEMORY; - Partial = RegistryAnsiToSz(Argument); + Partial = RegistryAnsiToSz(Array); break; - } - case REG_MULTI_SZ: { - PANSI_STRING Argument; - - Argument = va_arg(Arguments, PANSI_STRING); + case REG_MULTI_SZ: status = STATUS_NO_MEMORY; - Partial = RegistryAnsiToMultiSz(Argument); + Partial = RegistryAnsiToMultiSz(Array); break; - } + default: status = STATUS_INVALID_PARAMETER; Partial = NULL; break; } - va_end(Arguments); if (Partial == NULL) goto fail2; @@ -1244,6 +1379,14 @@ RegistryFreeSzValue( } VOID +RegistryFreeBinaryValue( + IN PVOID Buffer + ) +{ + __RegistryFree(Buffer); +} + +VOID RegistryCloseKey( IN HANDLE Key ) diff --git a/src/common/registry.h b/src/common/registry.h index 3920b6d..06e9bd6 100644 --- a/src/common/registry.h +++ b/src/common/registry.h @@ -96,7 +96,8 @@ RegistryOpenSubKey( extern NTSTATUS RegistryCreateSubKey( IN HANDLE Key, - IN PCHAR Name, IN ULONG Options, + IN PCHAR Name, + IN ULONG Options, OUT PHANDLE SubKey ); @@ -109,14 +110,14 @@ RegistryDeleteSubKey( extern NTSTATUS RegistryEnumerateSubKeys( IN HANDLE Key, - IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR), + IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING), IN PVOID Context ); extern NTSTATUS RegistryEnumerateValues( IN HANDLE Key, - IN NTSTATUS (*Callback)(PVOID, HANDLE, PCHAR), + IN NTSTATUS (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG), IN PVOID Context ); @@ -148,6 +149,22 @@ RegistryQuerySzValue( ); extern NTSTATUS +RegistryQueryBinaryValue( + IN HANDLE Key, + IN PCHAR Name, + OUT PVOID *Buffer, + OUT PULONG Length + ); + +extern NTSTATUS +RegistryUpdateBinaryValue( + IN HANDLE Key, + IN PCHAR Name, + IN PVOID Buffer, + IN ULONG Length + ); + +extern NTSTATUS RegistryQueryKeyName( IN HANDLE Key, OUT PANSI_STRING *Array @@ -164,12 +181,16 @@ RegistryFreeSzValue( IN PANSI_STRING Array ); +extern VOID +RegistryFreeBinaryValue( + IN PVOID Buffer + ); + extern NTSTATUS RegistryUpdateSzValue( IN HANDLE Key, IN PCHAR Name, - IN ULONG Type, - ... + IN PANSI_STRING Array ); extern VOID -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |