shell32: Remove code for separating arguments from file path.
This commit is contained in:
parent
22f28d2923
commit
8e853a3e90
|
@ -1423,11 +1423,10 @@ static UINT_PTR SHELL_execute_class( LPCWSTR wszApplicationName, LPSHELLEXECUTEI
|
||||||
return rslt;
|
return rslt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL SHELL_translate_idlist( LPSHELLEXECUTEINFOW sei, LPWSTR wszParameters, DWORD parametersLen, LPWSTR wszApplicationName, DWORD dwApplicationNameLen )
|
static void SHELL_translate_idlist( LPSHELLEXECUTEINFOW sei, LPWSTR wszParameters, DWORD parametersLen, LPWSTR wszApplicationName, DWORD dwApplicationNameLen )
|
||||||
{
|
{
|
||||||
static const WCHAR wExplorer[] = {'e','x','p','l','o','r','e','r','.','e','x','e',0};
|
static const WCHAR wExplorer[] = {'e','x','p','l','o','r','e','r','.','e','x','e',0};
|
||||||
WCHAR buffer[MAX_PATH];
|
WCHAR buffer[MAX_PATH];
|
||||||
BOOL appKnownSingular = FALSE;
|
|
||||||
|
|
||||||
/* last chance to translate IDList: now also allow CLSID paths */
|
/* last chance to translate IDList: now also allow CLSID paths */
|
||||||
if (SUCCEEDED(SHELL_GetPathFromIDListForExecuteW(sei->lpIDList, buffer, sizeof(buffer)/sizeof(WCHAR)))) {
|
if (SUCCEEDED(SHELL_GetPathFromIDListForExecuteW(sei->lpIDList, buffer, sizeof(buffer)/sizeof(WCHAR)))) {
|
||||||
|
@ -1441,7 +1440,6 @@ static BOOL SHELL_translate_idlist( LPSHELLEXECUTEINFOW sei, LPWSTR wszParameter
|
||||||
ERR("application len exceeds buffer size (%i > %i), truncating\n",
|
ERR("application len exceeds buffer size (%i > %i), truncating\n",
|
||||||
lstrlenW(wExplorer) + 1, dwApplicationNameLen);
|
lstrlenW(wExplorer) + 1, dwApplicationNameLen);
|
||||||
lstrcpynW(wszApplicationName, wExplorer, dwApplicationNameLen);
|
lstrcpynW(wszApplicationName, wExplorer, dwApplicationNameLen);
|
||||||
appKnownSingular = TRUE;
|
|
||||||
|
|
||||||
sei->fMask &= ~SEE_MASK_INVOKEIDLIST;
|
sei->fMask &= ~SEE_MASK_INVOKEIDLIST;
|
||||||
} else {
|
} else {
|
||||||
|
@ -1461,12 +1459,10 @@ static BOOL SHELL_translate_idlist( LPSHELLEXECUTEINFOW sei, LPWSTR wszParameter
|
||||||
buffer, target, sei->lpIDList, NULL, &resultLen);
|
buffer, target, sei->lpIDList, NULL, &resultLen);
|
||||||
if (resultLen > dwApplicationNameLen)
|
if (resultLen > dwApplicationNameLen)
|
||||||
ERR("Argify buffer not large enough... truncating\n");
|
ERR("Argify buffer not large enough... truncating\n");
|
||||||
appKnownSingular = FALSE;
|
|
||||||
}
|
}
|
||||||
sei->fMask &= ~SEE_MASK_INVOKEIDLIST;
|
sei->fMask &= ~SEE_MASK_INVOKEIDLIST;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return appKnownSingular;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT_PTR SHELL_quote_and_execute( LPCWSTR wcmd, LPCWSTR wszParameters, LPCWSTR wszKeyname, LPCWSTR wszApplicationName, LPWSTR env, LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out, SHELL_ExecuteW32 execfunc )
|
static UINT_PTR SHELL_quote_and_execute( LPCWSTR wcmd, LPCWSTR wszParameters, LPCWSTR wszKeyname, LPCWSTR wszApplicationName, LPWSTR env, LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out, SHELL_ExecuteW32 execfunc )
|
||||||
|
@ -1574,12 +1570,10 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
|
||||||
DWORD wcmdLen = sizeof(wcmdBuffer) / sizeof(WCHAR);
|
DWORD wcmdLen = sizeof(wcmdBuffer) / sizeof(WCHAR);
|
||||||
DWORD len;
|
DWORD len;
|
||||||
SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */
|
SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */
|
||||||
WCHAR wfileName[MAX_PATH];
|
|
||||||
WCHAR *env;
|
WCHAR *env;
|
||||||
WCHAR wszKeyname[256];
|
WCHAR wszKeyname[256];
|
||||||
LPCWSTR lpFile;
|
LPCWSTR lpFile;
|
||||||
UINT_PTR retval = SE_ERR_NOASSOC;
|
UINT_PTR retval = SE_ERR_NOASSOC;
|
||||||
BOOL appKnownSingular = FALSE;
|
|
||||||
|
|
||||||
/* make a local copy of the LPSHELLEXECUTEINFO structure and work with this from now on */
|
/* make a local copy of the LPSHELLEXECUTEINFO structure and work with this from now on */
|
||||||
sei_tmp = *sei;
|
sei_tmp = *sei;
|
||||||
|
@ -1607,7 +1601,6 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
|
||||||
memcpy(wszApplicationName, sei_tmp.lpFile+1, (l+1)*sizeof(WCHAR));
|
memcpy(wszApplicationName, sei_tmp.lpFile+1, (l+1)*sizeof(WCHAR));
|
||||||
if (wszApplicationName[l-1] == '\"')
|
if (wszApplicationName[l-1] == '\"')
|
||||||
wszApplicationName[l-1] = '\0';
|
wszApplicationName[l-1] = '\0';
|
||||||
appKnownSingular = TRUE;
|
|
||||||
TRACE("wszApplicationName=%s\n",debugstr_w(wszApplicationName));
|
TRACE("wszApplicationName=%s\n",debugstr_w(wszApplicationName));
|
||||||
} else {
|
} else {
|
||||||
DWORD l = strlenW(sei_tmp.lpFile)+1;
|
DWORD l = strlenW(sei_tmp.lpFile)+1;
|
||||||
|
@ -1678,7 +1671,6 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
|
||||||
}
|
}
|
||||||
|
|
||||||
SHGetPathFromIDListW(sei_tmp.lpIDList, wszApplicationName);
|
SHGetPathFromIDListW(sei_tmp.lpIDList, wszApplicationName);
|
||||||
appKnownSingular = TRUE;
|
|
||||||
TRACE("-- idlist=%p (%s)\n", sei_tmp.lpIDList, debugstr_w(wszApplicationName));
|
TRACE("-- idlist=%p (%s)\n", sei_tmp.lpIDList, debugstr_w(wszApplicationName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1710,10 +1702,10 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
|
||||||
/* Has the IDList not yet been translated? */
|
/* Has the IDList not yet been translated? */
|
||||||
if (sei_tmp.fMask & SEE_MASK_IDLIST)
|
if (sei_tmp.fMask & SEE_MASK_IDLIST)
|
||||||
{
|
{
|
||||||
appKnownSingular = SHELL_translate_idlist( &sei_tmp, wszParameters,
|
SHELL_translate_idlist( &sei_tmp, wszParameters,
|
||||||
parametersLen,
|
parametersLen,
|
||||||
wszApplicationName,
|
wszApplicationName,
|
||||||
dwApplicationNameLen );
|
dwApplicationNameLen );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* convert file URLs */
|
/* convert file URLs */
|
||||||
|
@ -1746,7 +1738,6 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
|
||||||
HeapFree(GetProcessHeap(), 0, wszApplicationName);
|
HeapFree(GetProcessHeap(), 0, wszApplicationName);
|
||||||
dwApplicationNameLen = len + 1;
|
dwApplicationNameLen = len + 1;
|
||||||
wszApplicationName = buf;
|
wszApplicationName = buf;
|
||||||
/* appKnownSingular unmodified */
|
|
||||||
|
|
||||||
sei_tmp.lpFile = wszApplicationName;
|
sei_tmp.lpFile = wszApplicationName;
|
||||||
}
|
}
|
||||||
|
@ -1770,70 +1761,7 @@ static BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc )
|
||||||
|
|
||||||
/* Else, try to execute the filename */
|
/* Else, try to execute the filename */
|
||||||
TRACE("execute:%s,%s,%s\n", debugstr_w(wszApplicationName), debugstr_w(wszParameters), debugstr_w(wszDir));
|
TRACE("execute:%s,%s,%s\n", debugstr_w(wszApplicationName), debugstr_w(wszParameters), debugstr_w(wszDir));
|
||||||
|
lpFile = sei_tmp.lpFile;
|
||||||
/* separate out command line arguments from executable file name */
|
|
||||||
if (!*sei_tmp.lpParameters && !appKnownSingular) {
|
|
||||||
/* If the executable path is quoted, handle the rest of the command line as parameters. */
|
|
||||||
if (sei_tmp.lpFile[0] == '"') {
|
|
||||||
LPWSTR src = wszApplicationName/*sei_tmp.lpFile*/ + 1;
|
|
||||||
LPWSTR dst = wfileName;
|
|
||||||
LPWSTR end;
|
|
||||||
|
|
||||||
/* copy the unquoted executable path to 'wfileName' */
|
|
||||||
while(*src && *src!='"')
|
|
||||||
*dst++ = *src++;
|
|
||||||
|
|
||||||
*dst = '\0';
|
|
||||||
|
|
||||||
if (*src == '"') {
|
|
||||||
end = ++src;
|
|
||||||
|
|
||||||
while(isspace(*src))
|
|
||||||
++src;
|
|
||||||
} else
|
|
||||||
end = src;
|
|
||||||
|
|
||||||
/* copy the parameter string to 'wszParameters' */
|
|
||||||
strcpyW(wszParameters, src);
|
|
||||||
|
|
||||||
/* terminate previous command string after the quote character */
|
|
||||||
*end = '\0';
|
|
||||||
lpFile = wfileName;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* If the executable name is not quoted, we have to use this search loop here,
|
|
||||||
that in CreateProcess() is not sufficient because it does not handle shell links. */
|
|
||||||
WCHAR buffer[MAX_PATH], xlpFile[MAX_PATH];
|
|
||||||
LPWSTR space, s;
|
|
||||||
|
|
||||||
LPWSTR beg = wszApplicationName/*sei_tmp.lpFile*/;
|
|
||||||
for(s=beg; (space=strchrW(s, ' ')); s=space+1) {
|
|
||||||
int idx = space-sei_tmp.lpFile;
|
|
||||||
memcpy(buffer, sei_tmp.lpFile, idx * sizeof(WCHAR));
|
|
||||||
buffer[idx] = '\0';
|
|
||||||
|
|
||||||
/*FIXME This finds directory paths if the targeted file name contains spaces. */
|
|
||||||
if (SearchPathW(*sei_tmp.lpDirectory? sei_tmp.lpDirectory: NULL, buffer, wszExe, sizeof(xlpFile)/sizeof(xlpFile[0]), xlpFile, NULL))
|
|
||||||
{
|
|
||||||
/* separate out command from parameter string */
|
|
||||||
LPCWSTR p = space + 1;
|
|
||||||
|
|
||||||
while(isspaceW(*p))
|
|
||||||
++p;
|
|
||||||
|
|
||||||
strcpyW(wszParameters, p);
|
|
||||||
*space = '\0';
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
lpFile = sei_tmp.lpFile;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
lpFile = sei_tmp.lpFile;
|
|
||||||
|
|
||||||
wcmd = wcmdBuffer;
|
wcmd = wcmdBuffer;
|
||||||
len = lstrlenW(wszApplicationName) + 1;
|
len = lstrlenW(wszApplicationName) + 1;
|
||||||
if (sei_tmp.lpParameters[0])
|
if (sei_tmp.lpParameters[0])
|
||||||
|
|
|
@ -902,7 +902,7 @@ static filename_tests_t filename_tests[]=
|
||||||
{"QuotedUpperL", "%s\\test file.shlexec", 0x0, 33},
|
{"QuotedUpperL", "%s\\test file.shlexec", 0x0, 33},
|
||||||
|
|
||||||
/* Test file masked due to space */
|
/* Test file masked due to space */
|
||||||
{NULL, "%s\\masked file.shlexec", 0x1, 33},
|
{NULL, "%s\\masked file.shlexec", 0x0, 33},
|
||||||
/* Test if quoting prevents the masking */
|
/* Test if quoting prevents the masking */
|
||||||
{NULL, "%s\\masked file.shlexec", 0x40, 33},
|
{NULL, "%s\\masked file.shlexec", 0x40, 33},
|
||||||
|
|
||||||
|
@ -933,7 +933,7 @@ static void test_lpFile_parsed(void)
|
||||||
/* existing "drawback_file.noassoc" prevents finding "drawback_file.noassoc foo.shlexec" on wine */
|
/* existing "drawback_file.noassoc" prevents finding "drawback_file.noassoc foo.shlexec" on wine */
|
||||||
sprintf(fileA, "%s\\drawback_file.noassoc foo.shlexec", tmpdir);
|
sprintf(fileA, "%s\\drawback_file.noassoc foo.shlexec", tmpdir);
|
||||||
rc=shell_execute(NULL, fileA, NULL, NULL);
|
rc=shell_execute(NULL, fileA, NULL, NULL);
|
||||||
todo_wine ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
|
ok(rc > 32, "%s failed: rc=%lu\n", shell_call, rc);
|
||||||
|
|
||||||
/* if quoted, existing "drawback_file.noassoc" not prevents finding "drawback_file.noassoc foo.shlexec" on wine */
|
/* if quoted, existing "drawback_file.noassoc" not prevents finding "drawback_file.noassoc foo.shlexec" on wine */
|
||||||
sprintf(fileA, "\"%s\\drawback_file.noassoc foo.shlexec\"", tmpdir);
|
sprintf(fileA, "\"%s\\drawback_file.noassoc foo.shlexec\"", tmpdir);
|
||||||
|
@ -1542,18 +1542,10 @@ static void test_filename(void)
|
||||||
}
|
}
|
||||||
if (rc > 32)
|
if (rc > 32)
|
||||||
rc=33;
|
rc=33;
|
||||||
if ((test->todo & 0x1)==0)
|
ok(rc==test->rc ||
|
||||||
{
|
broken(quotedfile && rc == SE_ERR_FNF), /* NT4 */
|
||||||
ok(rc==test->rc ||
|
"%s failed: rc=%ld err=%u\n", shell_call,
|
||||||
broken(quotedfile && rc == SE_ERR_FNF), /* NT4 */
|
rc, GetLastError());
|
||||||
"%s failed: rc=%ld err=%u\n", shell_call,
|
|
||||||
rc, GetLastError());
|
|
||||||
}
|
|
||||||
else todo_wine
|
|
||||||
{
|
|
||||||
ok(rc==test->rc, "%s failed: rc=%ld err=%u\n", shell_call,
|
|
||||||
rc, GetLastError());
|
|
||||||
}
|
|
||||||
if (rc == 33)
|
if (rc == 33)
|
||||||
{
|
{
|
||||||
const char* verb;
|
const char* verb;
|
||||||
|
|
Loading…
Reference in New Issue