From 15cf4eb3225e3cda476578f75182ac0c6157706e Mon Sep 17 00:00:00 2001 From: Yaroslav Veremenko Date: Mon, 7 Nov 2016 16:16:15 -0700 Subject: [PATCH] CORE-12049 Fixed --- reactos/dll/win32/shell32/shlexec.cpp | 10 ++- rostests/apitests/shell32/CMakeLists.txt | 3 +- rostests/apitests/shell32/shlexec.cpp | 105 +++++++++++++++++++++++++++++++ rostests/apitests/shell32/testlist.c | 2 + 4 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 rostests/apitests/shell32/shlexec.cpp diff --git a/reactos/dll/win32/shell32/shlexec.cpp b/reactos/dll/win32/shell32/shlexec.cpp index f850ead..94369d6 100644 --- a/reactos/dll/win32/shell32/shlexec.cpp +++ b/reactos/dll/win32/shell32/shlexec.cpp @@ -576,7 +576,15 @@ static BOOL SHELL_TryAppPathW( LPCWSTR szName, LPWSTR lpResult, WCHAR **env) wcscpy(buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\"); wcscat(buffer, szName); res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, buffer, 0, KEY_READ, &hkApp); - if (res) goto end; + if (res) + { + // Add ".exe" extension, if extension does not exists + if (PathAddExtensionW(buffer, wszExe)) + { + res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, buffer, 0, KEY_READ, &hkApp); + } + if (res) goto end; + } len = MAX_PATH * sizeof(WCHAR); res = RegQueryValueW(hkApp, NULL, lpResult, &len); diff --git a/rostests/apitests/shell32/CMakeLists.txt b/rostests/apitests/shell32/CMakeLists.txt index 9136a1f..b834806 100644 --- a/rostests/apitests/shell32/CMakeLists.txt +++ b/rostests/apitests/shell32/CMakeLists.txt @@ -10,8 +10,9 @@ add_executable(shell32_apitest menu.cpp shelltest.cpp SHParseDisplayName.cpp + shlexec.cpp testlist.c) target_link_libraries(shell32_apitest wine uuid ${PSEH_LIB}) set_module_type(shell32_apitest win32cui) -add_importlibs(shell32_apitest user32 gdi32 shell32 ole32 oleaut32 shlwapi msvcrt kernel32 ntdll) +add_importlibs(shell32_apitest user32 gdi32 shell32 ole32 oleaut32 advapi32 shlwapi msvcrt kernel32 ntdll) add_cd_file(TARGET shell32_apitest DESTINATION reactos/bin FOR all) diff --git a/rostests/apitests/shell32/shlexec.cpp b/rostests/apitests/shell32/shlexec.cpp new file mode 100644 index 0000000..187c917 --- /dev/null +++ b/rostests/apitests/shell32/shlexec.cpp @@ -0,0 +1,105 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Testing ShelExecute + * PROGRAMMER: Yaroslav Veremenko + */ + + +#include "shelltest.h" + + + +#define ok_ShellExecuteEx (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : TestShellExecuteEx + +static +BOOL +CreateAppPathRegKey(const WCHAR* Name) +{ + HKEY RegistryKey; + LONG Result; + WCHAR Buffer[1024]; + WCHAR KeyValue[1024]; + DWORD Length = sizeof(KeyValue); + DWORD Disposition; + + wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\"); + wcscat(Buffer, L"IEXPLORE.EXE"); + Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Buffer, 0, KEY_READ, &RegistryKey); + if (Result != ERROR_SUCCESS) trace("Could not open iexplore.exe key. Status: %d\n", Result); + if (Result) goto end; + Result = RegQueryValueExW(RegistryKey, NULL, NULL, NULL, (LPBYTE)KeyValue, &Length); + if (Result != ERROR_SUCCESS) trace("Could not read iexplore.exe key. Status: %d\n", Result); + if (Result) goto end; + RegCloseKey(RegistryKey); + + wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\"); + wcscat(Buffer, Name); + Result = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Buffer, 0, NULL, + 0, KEY_WRITE, NULL, &RegistryKey, &Disposition); + if (Result != ERROR_SUCCESS) trace("Could not create test key. Status: %d\n", Result); + if (Result) goto end; + Result = RegSetValueW(RegistryKey, NULL, REG_SZ, KeyValue, 0); + if (Result != ERROR_SUCCESS) trace("Could not set value of the test key. Status: %d\n", Result); + if (Result) goto end; + RegCloseKey(RegistryKey); +end: + if (RegistryKey) RegCloseKey(RegistryKey); + return Result == ERROR_SUCCESS; +} + +static +VOID +DeleteAppPathRegKey(const WCHAR* Name) +{ + LONG Result; + WCHAR Buffer[1024]; + wcscpy(Buffer, L"Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\"); + wcscat(Buffer, Name); + Result = RegDeleteKeyW(HKEY_LOCAL_MACHINE, Buffer); + if (Result != ERROR_SUCCESS) trace("Could not remove the test key. Status: %d\n", Result); +} + +static +VOID +TestShellExecuteEx(const WCHAR* Name, BOOL ExpectedResult) +{ + SHELLEXECUTEINFOW ShellExecInfo; + BOOL Result; + ZeroMemory(&ShellExecInfo, sizeof(ShellExecInfo)); + ShellExecInfo.cbSize = sizeof(ShellExecInfo); + ShellExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI; + ShellExecInfo.hwnd = NULL; + ShellExecInfo.nShow = SW_SHOWNORMAL; + ShellExecInfo.lpFile = Name; + ShellExecInfo.lpDirectory = NULL; + Result = ShellExecuteExW(&ShellExecInfo); + ok(Result == ExpectedResult, "ShellExecuteEx lpFile %s failed. Error: %d\n", wine_dbgstr_w(Name), GetLastError()); + if (ShellExecInfo.hProcess) + { + Result = TerminateProcess(ShellExecInfo.hProcess, 0); + if (!Result) trace("Terminate process failed. Error: %d\n", GetLastError()); + WaitForSingleObject(ShellExecInfo.hProcess, INFINITE); + CloseHandle(ShellExecInfo.hProcess); + } +} + +START_TEST(shlexec) +{ + ok_ShellExecuteEx(L"iexplore", TRUE); + ok_ShellExecuteEx(L"iexplore.exe", TRUE); + + if (CreateAppPathRegKey(L"iexplore.bat")) + { + ok_ShellExecuteEx(L"iexplore.bat", TRUE); + ok_ShellExecuteEx(L"iexplore.bat.exe", FALSE); + DeleteAppPathRegKey(L"iexplore.bat"); + } + + if (CreateAppPathRegKey(L"iexplore.bat.exe")) + { + ok_ShellExecuteEx(L"iexplore.bat", FALSE); + ok_ShellExecuteEx(L"iexplore.bat.exe", TRUE); + DeleteAppPathRegKey(L"iexplore.bat.exe"); + } +} \ No newline at end of file diff --git a/rostests/apitests/shell32/testlist.c b/rostests/apitests/shell32/testlist.c index d7bf800..1d4f42c 100644 --- a/rostests/apitests/shell32/testlist.c +++ b/rostests/apitests/shell32/testlist.c @@ -8,6 +8,7 @@ extern void func_CShellDesktop(void); extern void func_CShellLink(void); extern void func_menu(void); extern void func_SHParseDisplayName(void); +extern void func_shlexec(void); const struct test winetest_testlist[] = { @@ -16,5 +17,6 @@ const struct test winetest_testlist[] = { "CShellLink", func_CShellLink }, { "menu", func_menu }, { "SHParseDisplayName", func_SHParseDisplayName }, + { "shlexec", func_shlexec }, { 0, 0 } }; -- 1.9.5.msysgit.0