mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 18:15:11 +00:00
[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:
parent
340d9360c3
commit
fc11cf78ca
2 changed files with 55 additions and 12 deletions
|
@ -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))
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in a new issue