Module: wine Branch: master Commit: bc0cd8052edb8065d50a764b23c9610627288efe URL: https://gitlab.winehq.org/wine/wine/-/commit/bc0cd8052edb8065d50a764b23c9610...
Author: Alex Henrie alexhenrie24@gmail.com Date: Sun May 26 22:41:16 2024 -0600
ntdll: Succeed in RtlQueryRegistryValues on direct query of nonexistent value.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49703
---
dlls/ntdll/reg.c | 14 ++++++++++---- dlls/ntdll/tests/reg.c | 6 +++--- 2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 57208d5d811..4af8f5edb9b 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -242,7 +242,7 @@ NTSTATUS WINAPI RtlOpenCurrentUser( static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, PRTL_QUERY_REGISTRY_TABLE pQuery, PVOID pContext, PVOID pEnvironment) { - PUNICODE_STRING str; + PUNICODE_STRING str = pQuery->EntryContext; UNICODE_STRING src, dst; LONG *bin; ULONG offset; @@ -256,7 +256,15 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, if (pInfo == NULL) { if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT) - return STATUS_INVALID_PARAMETER; + { + ULONG default_size = pQuery->DefaultLength; + if (!default_size && pQuery->DefaultType == REG_SZ && pQuery->DefaultData) + default_size = wcslen(pQuery->DefaultData) + 1; + if (str->MaximumLength < default_size) + return STATUS_BUFFER_TOO_SMALL; + memcpy(str->Buffer, pQuery->DefaultData, default_size); + return STATUS_SUCCESS; + } else { status = pQuery->QueryRoutine(pQuery->Name, pQuery->DefaultType, pQuery->DefaultData, @@ -268,8 +276,6 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT) { - str = pQuery->EntryContext; - switch(pInfo->Type) { case REG_EXPAND_SZ: diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index 7c4518bb79d..3785070c962 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -2726,17 +2726,17 @@ static struct query_reg_values_test query_reg_values_tests[] = { {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist", &query_reg_values_direct_str, REG_SZ, (WCHAR*)L"Some default", 4 * sizeof(WCHAR) }}, - STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA | WINE_TODO_RET | WINE_TODO_DATA + STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA }, { {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist", &query_reg_values_direct_str, REG_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }}, - STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA | WINE_TODO_RET | WINE_TODO_DATA + STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA | WINE_TODO_DATA }, { {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist", &query_reg_values_direct_str, REG_EXPAND_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }}, - STATUS_SUCCESS, 0, WINE_TODO_RET | WINE_TODO_DATA, REG_EXPAND_SZ, L"C:" + STATUS_SUCCESS, 0, WINE_TODO_DATA, REG_EXPAND_SZ, L"C:" }, /* DIRECT with a multi-string default value crashes on Windows */ /* {