From b5d501b385114fb15fa4d2ade052822eeaa089d4 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Mon, 29 Apr 2002 23:20:44 +0000 Subject: [PATCH] Improved default value handling in RtlQueryRegistryValues(). svn path=/trunk/; revision=2898 --- reactos/lib/ntdll/rtl/registry.c | 49 ++++++++++++++++++++++++++++++-- reactos/ntoskrnl/cm/rtlfunc.c | 49 ++++++++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 6 deletions(-) diff --git a/reactos/lib/ntdll/rtl/registry.c b/reactos/lib/ntdll/rtl/registry.c index 0ea127c2c12..ec6a358762d 100644 --- a/reactos/lib/ntdll/rtl/registry.c +++ b/reactos/lib/ntdll/rtl/registry.c @@ -1,4 +1,4 @@ -/* $Id: registry.c,v 1.10 2002/02/10 13:55:45 ekohl Exp $ +/* $Id: registry.c,v 1.11 2002/04/29 23:19:53 ekohl Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -240,8 +240,51 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, &ResultSize); if (!NT_SUCCESS(Status)) { - RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo); - break; + if (QueryEntry->Flags & RTL_QUERY_REGISTRY_REQUIRED) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo); + Status = STATUS_OBJECT_NAME_NOT_FOUND; + break; + } + + if (QueryEntry->DefaultType == REG_SZ) + { + PUNICODE_STRING ValueString; + PUNICODE_STRING SourceString; + + SourceString = (PUNICODE_STRING)QueryEntry->DefaultData; + ValueString = (PUNICODE_STRING)QueryEntry->EntryContext; + if (ValueString->Buffer == 0) + { + ValueString->Length = SourceString->Length; + ValueString->MaximumLength = SourceString->MaximumLength; + ValueString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + ValueString->MaximumLength); + if (!ValueString->Buffer) + break; + ValueString->Buffer[0] = 0; + memcpy(ValueString->Buffer, + SourceString->Buffer, + SourceString->MaximumLength); + } + else + { + ValueString->Length = min(SourceString->Length, + ValueString->MaximumLength - sizeof(WCHAR)); + memcpy(ValueString->Buffer, + SourceString->Buffer, + ValueString->Length); + ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0; + } + } + else + { + memcpy(QueryEntry->EntryContext, + QueryEntry->DefaultData, + QueryEntry->DefaultLength); + } + Status = STATUS_SUCCESS; } else { diff --git a/reactos/ntoskrnl/cm/rtlfunc.c b/reactos/ntoskrnl/cm/rtlfunc.c index 67549d56673..91f9837b0bd 100644 --- a/reactos/ntoskrnl/cm/rtlfunc.c +++ b/reactos/ntoskrnl/cm/rtlfunc.c @@ -225,9 +225,50 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, &ResultSize); if (!NT_SUCCESS(Status)) { - DPRINT("ZwQueryValueKey() failed with status %x\n", Status); - ExFreePool(ValueInfo); - break; + if (QueryEntry->Flags & RTL_QUERY_REGISTRY_REQUIRED) + { + ExFreePool(ValueInfo); + Status = STATUS_OBJECT_NAME_NOT_FOUND; + goto ByeBye; + } + + if (QueryEntry->DefaultType == REG_SZ) + { + PUNICODE_STRING ValueString; + PUNICODE_STRING SourceString; + + SourceString = (PUNICODE_STRING)QueryEntry->DefaultData; + ValueString = (PUNICODE_STRING)QueryEntry->EntryContext; + if (ValueString->Buffer == 0) + { + ValueString->Length = SourceString->Length; + ValueString->MaximumLength = SourceString->MaximumLength; + ValueString->Buffer = ExAllocatePool(PagedPool, + ValueString->MaximumLength); + if (!ValueString->Buffer) + break; + ValueString->Buffer[0] = 0; + memcpy(ValueString->Buffer, + SourceString->Buffer, + SourceString->MaximumLength); + } + else + { + ValueString->Length = RtlMin(SourceString->Length, + ValueString->MaximumLength - sizeof(WCHAR)); + memcpy(ValueString->Buffer, + SourceString->Buffer, + ValueString->Length); + ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0; + } + } + else + { + memcpy(QueryEntry->EntryContext, + QueryEntry->DefaultData, + QueryEntry->DefaultLength); + } + Status = STATUS_SUCCESS; } else { @@ -451,6 +492,8 @@ RtlQueryRegistryValues(IN ULONG RelativeTo, QueryEntry++; } +ByeBye: + if (CurrentKeyHandle != BaseKeyHandle) NtClose(CurrentKeyHandle);