https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0f8e720711532d60200211ab7c6dce80e023b68f
commit 0f8e720711532d60200211ab7c6dce80e023b68f Author: Eric Kohl <eric.k...@reactos.org> AuthorDate: Thu May 31 16:47:42 2018 +0200 Commit: Eric Kohl <eric.k...@reactos.org> CommitDate: Thu May 31 16:47:42 2018 +0200 [NTDLL_APITEST][LIB_RTL] Add a test for RtlQueryTimeZoneInformation and fix the bug in RtlpQueryRegistryDirect In working on some problems with Time Zone adjustments in ReactOS I found that the RtlQueryTimeZoneInformation function is partially broken and wrote an apitest to capture the failures. Patch by Doug Lyons. CORE-14658 --- modules/rostests/apitests/ntdll/CMakeLists.txt | 1 + modules/rostests/apitests/ntdll/testlist.c | 2 ++ sdk/lib/rtl/registry.c | 26 +++++++++++++++++--------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt b/modules/rostests/apitests/ntdll/CMakeLists.txt index 3e9756c7f3..a7fdc5a2cd 100644 --- a/modules/rostests/apitests/ntdll/CMakeLists.txt +++ b/modules/rostests/apitests/ntdll/CMakeLists.txt @@ -49,6 +49,7 @@ list(APPEND SOURCE RtlMemoryStream.c RtlNtPathNameToDosPathName.c RtlpEnsureBufferSize.c + RtlQueryTimeZoneInfo.c RtlReAllocateHeap.c RtlUnicodeStringToAnsiString.c RtlUpcaseUnicodeStringToCountedOemString.c diff --git a/modules/rostests/apitests/ntdll/testlist.c b/modules/rostests/apitests/ntdll/testlist.c index f17f87267c..c6afd1d342 100644 --- a/modules/rostests/apitests/ntdll/testlist.c +++ b/modules/rostests/apitests/ntdll/testlist.c @@ -53,6 +53,7 @@ extern void func_RtlIsNameLegalDOS8Dot3(void); extern void func_RtlMemoryStream(void); extern void func_RtlNtPathNameToDosPathName(void); extern void func_RtlpEnsureBufferSize(void); +extern void func_RtlQueryTimeZoneInformation(void); extern void func_RtlReAllocateHeap(void); extern void func_RtlUnicodeStringToAnsiString(void); extern void func_RtlUpcaseUnicodeStringToCountedOemString(void); @@ -111,6 +112,7 @@ const struct test winetest_testlist[] = { "RtlMemoryStream", func_RtlMemoryStream }, { "RtlNtPathNameToDosPathName", func_RtlNtPathNameToDosPathName }, { "RtlpEnsureBufferSize", func_RtlpEnsureBufferSize }, + { "RtlQueryTimeZoneInformation", func_RtlQueryTimeZoneInformation }, { "RtlReAllocateHeap", func_RtlReAllocateHeap }, { "RtlUnicodeStringToAnsiString", func_RtlUnicodeStringToAnsiString }, { "RtlUpcaseUnicodeStringToCountedOemString", func_RtlUpcaseUnicodeStringToCountedOemString }, diff --git a/sdk/lib/rtl/registry.c b/sdk/lib/rtl/registry.c index 02361efc48..bc69d4d0b3 100644 --- a/sdk/lib/rtl/registry.c +++ b/sdk/lib/rtl/registry.c @@ -96,17 +96,25 @@ RtlpQueryRegistryDirect(IN ULONG ValueType, } else { - /* Check if there's space for the length and type, plus data */ - if (*Length < (2 * sizeof(ULONG) + ValueLength)) + if (ValueType != REG_BINARY) { - /* Nope, fail */ - return STATUS_BUFFER_TOO_SMALL; - } + /* Check if there's space for the length and type, plus data */ + if (*Length < (2 * sizeof(ULONG) + ValueLength)) + { + /* Nope, fail */ + return STATUS_BUFFER_TOO_SMALL; + } - /* Return the data */ - *Length++ = ValueLength; - *Length++ = ValueType; - RtlCopyMemory(Length, ValueData, ValueLength); + /* Return the data */ + *Length++ = ValueLength; + *Length++ = ValueType; + RtlCopyMemory(Length, ValueData, ValueLength); + } + else + { + /* Return the REG_BINARY data */ + RtlCopyMemory(Length, ValueData, ValueLength); + } } }