Alex Villacís Lasso <[EMAIL PROTECTED]> writes:
> Alexandre Julliard wrote:
>
>>It's OK to change argv[0] when started from a Unix shell, but not when
>>started from another Windows process. Your patch does it in all cases,
>>which is not correct.
>>
> Sounds reasonable. What is the proper way to tell apart the two cases?
I would suggest something like this:
Index: dlls/kernel/process.c
===================================================================
RCS file: /opt/cvs-commit/wine/dlls/kernel/process.c,v
retrieving revision 1.109
diff -u -p -r1.109 process.c
--- dlls/kernel/process.c 10 Oct 2005 10:28:48 -0000 1.109
+++ dlls/kernel/process.c 31 Oct 2005 21:43:46 -0000
@@ -515,19 +515,23 @@ static void set_registry_environment(voi
*/
static void set_library_wargv( char **argv )
{
- int argc;
+ int argc, first = 0;
char *q;
WCHAR *p;
WCHAR **wargv;
DWORD total = 0;
- for (argc = 0; argv[argc]; argc++)
+ /* if we didn't get a command line from our parent,
+ * force argv[0] to be the path of the main binary */
+ if (argv[0] &&
!NtCurrentTeb()->Peb->ProcessParameters->CommandLine.Buffer) first = 1;
+
+ for (argc = first; argv[argc]; argc++)
total += MultiByteToWideChar( CP_UNIXCP, 0, argv[argc], -1, NULL, 0 );
wargv = RtlAllocateHeap( GetProcessHeap(), 0,
total * sizeof(WCHAR) + (argc + 1) *
sizeof(*wargv) );
p = (WCHAR *)(wargv + argc + 1);
- for (argc = 0; argv[argc]; argc++)
+ for (argc = first; argv[argc]; argc++)
{
DWORD reslen = MultiByteToWideChar( CP_UNIXCP, 0, argv[argc], -1, p,
total );
wargv[argc] = p;
@@ -535,6 +539,7 @@ static void set_library_wargv( char **ar
total -= reslen;
}
wargv[argc] = NULL;
+ if (first) wargv[0] =
NtCurrentTeb()->Peb->ProcessParameters->ImagePathName.Buffer;
/* convert argv back from Unicode since it has to be in the Ansi codepage
not the Unix one */
--
Alexandre Julliard
[EMAIL PROTECTED]