[SHELL32] Improve ShellExecCmdLine in path resolving (#2397)

Fix and improve private function shell32!ShellExecCmdLine to improve Run Dialog behavior. CORE-14409
This commit is contained in:
Katayama Hirofumi MZ 2020-03-01 19:32:33 +09:00 committed by GitHub
parent 340d9360c3
commit fc11cf78ca
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 12 deletions

View file

@ -2457,12 +2457,26 @@ HRESULT WINAPI ShellExecCmdLine(
{ {
PathAddBackslashW(szFile); PathAddBackslashW(szFile);
} }
if (SearchPathW(NULL, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
SearchPathW(NULL, szFile, wszExe, _countof(szFile2), szFile2, NULL) || WCHAR szCurDir[MAX_PATH];
SearchPathW(NULL, szFile, wszCom, _countof(szFile2), szFile2, NULL) || GetCurrentDirectoryW(_countof(szCurDir), szCurDir);
SearchPathW(pwszStartDir, szFile, NULL, _countof(szFile2), szFile2, NULL) || if (pwszStartDir)
SearchPathW(pwszStartDir, szFile, wszExe, _countof(szFile2), szFile2, NULL) || {
SearchPathW(pwszStartDir, szFile, wszCom, _countof(szFile2), szFile2, NULL)) SetCurrentDirectoryW(pwszStartDir);
}
if (PathIsRelativeW(szFile) &&
GetFullPathNameW(szFile, _countof(szFile2), szFile2, NULL) &&
PathFileExistsW(szFile2))
{
StringCchCopyW(szFile, _countof(szFile), szFile2);
}
else if (SearchPathW(NULL, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
SearchPathW(NULL, szFile, wszExe, _countof(szFile2), szFile2, NULL) ||
SearchPathW(NULL, szFile, wszCom, _countof(szFile2), szFile2, NULL) ||
SearchPathW(pwszStartDir, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
SearchPathW(pwszStartDir, szFile, wszExe, _countof(szFile2), szFile2, NULL) ||
SearchPathW(pwszStartDir, szFile, wszCom, _countof(szFile2), szFile2, NULL))
{ {
StringCchCopyW(szFile, _countof(szFile), szFile2); StringCchCopyW(szFile, _countof(szFile), szFile2);
} }
@ -2477,6 +2491,11 @@ HRESULT WINAPI ShellExecCmdLine(
pchParams = NULL; pchParams = NULL;
} }
if (pwszStartDir)
{
SetCurrentDirectoryW(szCurDir);
}
if (!(dwSeclFlags & SECL_ALLOW_NONEXE)) if (!(dwSeclFlags & SECL_ALLOW_NONEXE))
{ {
if (!GetBinaryTypeW(szFile, &dwType)) if (!GetBinaryTypeW(szFile, &dwType))

View file

@ -133,12 +133,31 @@ HRESULT WINAPI ShellExecCmdLine(
else else
{ {
pchParams = SplitParams(lpCommand, szFile, _countof(szFile)); pchParams = SplitParams(lpCommand, szFile, _countof(szFile));
if (SearchPathW(NULL, szFile, NULL, _countof(szFile2), szFile2, NULL) || if (szFile[0] != UNICODE_NULL && szFile[1] == L':' &&
SearchPathW(NULL, szFile, wszExe, _countof(szFile2), szFile2, NULL) || szFile[2] == UNICODE_NULL)
SearchPathW(NULL, szFile, wszCom, _countof(szFile2), szFile2, NULL) || {
SearchPathW(pwszStartDir, szFile, NULL, _countof(szFile2), szFile2, NULL) || PathAddBackslashW(szFile);
SearchPathW(pwszStartDir, szFile, wszExe, _countof(szFile2), szFile2, NULL) || }
SearchPathW(pwszStartDir, szFile, wszCom, _countof(szFile2), szFile2, NULL))
WCHAR szCurDir[MAX_PATH];
GetCurrentDirectoryW(_countof(szCurDir), szCurDir);
if (pwszStartDir)
{
SetCurrentDirectoryW(pwszStartDir);
}
if (PathIsRelativeW(szFile) &&
GetFullPathNameW(szFile, _countof(szFile2), szFile2, NULL) &&
PathFileExistsW(szFile2))
{
StringCchCopyW(szFile, _countof(szFile), szFile2);
}
else if (SearchPathW(NULL, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
SearchPathW(NULL, szFile, wszExe, _countof(szFile2), szFile2, NULL) ||
SearchPathW(NULL, szFile, wszCom, _countof(szFile2), szFile2, NULL) ||
SearchPathW(pwszStartDir, szFile, NULL, _countof(szFile2), szFile2, NULL) ||
SearchPathW(pwszStartDir, szFile, wszExe, _countof(szFile2), szFile2, NULL) ||
SearchPathW(pwszStartDir, szFile, wszCom, _countof(szFile2), szFile2, NULL))
{ {
StringCchCopyW(szFile, _countof(szFile), szFile2); StringCchCopyW(szFile, _countof(szFile), szFile2);
} }
@ -153,6 +172,11 @@ HRESULT WINAPI ShellExecCmdLine(
pchParams = NULL; pchParams = NULL;
} }
if (pwszStartDir)
{
SetCurrentDirectoryW(szCurDir);
}
if (!(dwSeclFlags & SECL_ALLOW_NONEXE)) if (!(dwSeclFlags & SECL_ALLOW_NONEXE))
{ {
if (!GetBinaryTypeW(szFile, &dwType)) if (!GetBinaryTypeW(szFile, &dwType))