steam_helper: separate parameters from command when using ShellExecuteW
ShellExecuteW ignores any extra information passed as part of lpFile resulting in arguments being ignored. Link: https://github.com/ValveSoftware/Proton/pull/6555
This commit is contained in:
parent
ea08ded0ca
commit
e6cd3f8ec3
1 changed files with 24 additions and 6 deletions
|
@ -1028,22 +1028,33 @@ static BOOL streq_niw(const WCHAR *l, const WCHAR *r, size_t len)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL should_use_shell_execute(const WCHAR *cmdline)
|
static WCHAR* get_end_of_excutable_name(WCHAR *cmdline)
|
||||||
{
|
{
|
||||||
BOOL use_shell_execute = TRUE;
|
|
||||||
BOOL quoted = FALSE;
|
BOOL quoted = FALSE;
|
||||||
const WCHAR *executable_name_end = cmdline;
|
WCHAR *executable_name_end = cmdline;
|
||||||
|
|
||||||
/* find the end of the first arg...*/
|
/* find the end of the first arg...*/
|
||||||
while (*executable_name_end != '\0' &&
|
while (*executable_name_end != '\0' &&
|
||||||
(*executable_name_end != ' ' || quoted) &&
|
(*executable_name_end != ' ' || quoted))
|
||||||
(*executable_name_end != '"' || !quoted))
|
|
||||||
{
|
{
|
||||||
quoted ^= *executable_name_end == '"';
|
quoted ^= *executable_name_end == '"';
|
||||||
|
|
||||||
executable_name_end++;
|
executable_name_end++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return executable_name_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL should_use_shell_execute(WCHAR *cmdline)
|
||||||
|
{
|
||||||
|
BOOL use_shell_execute = TRUE;
|
||||||
|
const WCHAR *executable_name_end = (const WCHAR*)get_end_of_excutable_name(cmdline);
|
||||||
|
|
||||||
|
/* if the executable is quoted backtrack a bit */
|
||||||
|
if (*(executable_name_end - 1) == '"')
|
||||||
|
--executable_name_end;
|
||||||
|
|
||||||
|
|
||||||
/* backtrack to before the end of the arg
|
/* backtrack to before the end of the arg
|
||||||
* and check if we end in .exe or not
|
* and check if we end in .exe or not
|
||||||
* and determine whether to use ShellExecute
|
* and determine whether to use ShellExecute
|
||||||
|
@ -1211,10 +1222,17 @@ run:
|
||||||
|
|
||||||
if (use_shell_execute)
|
if (use_shell_execute)
|
||||||
{
|
{
|
||||||
|
WCHAR *param = NULL;
|
||||||
|
WCHAR *executable_name_end = get_end_of_excutable_name(cmdline);
|
||||||
|
if (*executable_name_end != '\0')
|
||||||
|
{
|
||||||
|
*executable_name_end = '\0';
|
||||||
|
param = executable_name_end+1;
|
||||||
|
}
|
||||||
static const WCHAR verb[] = { 'o', 'p', 'e', 'n', 0 };
|
static const WCHAR verb[] = { 'o', 'p', 'e', 'n', 0 };
|
||||||
INT_PTR ret;
|
INT_PTR ret;
|
||||||
|
|
||||||
if ((ret = (INT_PTR)ShellExecuteW(NULL, verb, cmdline, NULL, NULL, hide_window ? SW_HIDE : SW_SHOWNORMAL)) < 32)
|
if ((ret = (INT_PTR)ShellExecuteW(NULL, verb, cmdline, param, NULL, hide_window ? SW_HIDE : SW_SHOWNORMAL)) < 32)
|
||||||
{
|
{
|
||||||
WINE_ERR("Failed to execute %s, ret %u.\n", wine_dbgstr_w(cmdline), (unsigned int)ret);
|
WINE_ERR("Failed to execute %s, ret %u.\n", wine_dbgstr_w(cmdline), (unsigned int)ret);
|
||||||
if (game_process && ret == SE_ERR_NOASSOC && link2ea)
|
if (game_process && ret == SE_ERR_NOASSOC && link2ea)
|
||||||
|
|
Loading…
Reference in a new issue