* win32-low.c (create_process): New.
(win32_create_inferior): Use create_process instead of CreateProcess. If create_process failed retry appending an ".exe" suffix. Store the GetLastError result immediatelly after create_process calls and use it on the call to error.
This commit is contained in:
parent
26669a2768
commit
aec18585f0
@ -1,3 +1,11 @@
|
||||
2007-09-03 Pedro Alves <pedro_alves@portugalmail.pt>
|
||||
|
||||
* win32-low.c (create_process): New.
|
||||
(win32_create_inferior): Use create_process instead of
|
||||
CreateProcess. If create_process failed retry appending an ".exe"
|
||||
suffix. Store the GetLastError result immediatelly after
|
||||
create_process calls and use it on the call to error.
|
||||
|
||||
2007-09-03 Pedro Alves <pedro_alves@portugalmail.pt>
|
||||
|
||||
* win32-low.c (handle_load_dll): Don't use toolhelp when waiting.
|
||||
|
@ -373,6 +373,55 @@ strwinerror (DWORD error)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static BOOL
|
||||
create_process (const char *program, char *args,
|
||||
DWORD flags, PROCESS_INFORMATION *pi)
|
||||
{
|
||||
BOOL ret;
|
||||
|
||||
#ifdef _WIN32_WCE
|
||||
wchar_t *p, *wprogram, *wargs;
|
||||
size_t argslen;
|
||||
|
||||
wprogram = alloca ((strlen (program) + 1) * sizeof (wchar_t));
|
||||
mbstowcs (wprogram, program, strlen (program) + 1);
|
||||
|
||||
for (p = wprogram; *p; ++p)
|
||||
if (L'/' == *p)
|
||||
*p = L'\\';
|
||||
|
||||
argslen = strlen (args);
|
||||
wargs = alloca ((argslen + 1) * sizeof (wchar_t));
|
||||
mbstowcs (wargs, args, argslen + 1);
|
||||
|
||||
ret = CreateProcessW (wprogram, /* image name */
|
||||
wargs, /* command line */
|
||||
NULL, /* security, not supported */
|
||||
NULL, /* thread, not supported */
|
||||
FALSE, /* inherit handles, not supported */
|
||||
flags, /* start flags */
|
||||
NULL, /* environment, not supported */
|
||||
NULL, /* current directory, not supported */
|
||||
NULL, /* start info, not supported */
|
||||
pi); /* proc info */
|
||||
#else
|
||||
STARTUPINFOA si = { sizeof (STARTUPINFOA) };
|
||||
|
||||
ret = CreateProcessA (program, /* image name */
|
||||
args, /* command line */
|
||||
NULL, /* security */
|
||||
NULL, /* thread */
|
||||
TRUE, /* inherit handles */
|
||||
flags, /* start flags */
|
||||
NULL, /* environment */
|
||||
NULL, /* current directory */
|
||||
&si, /* start info */
|
||||
pi); /* proc info */
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Start a new process.
|
||||
PROGRAM is a path to the program to execute.
|
||||
ARGS is a standard NULL-terminated array of arguments,
|
||||
@ -392,12 +441,7 @@ win32_create_inferior (char *program, char **program_args)
|
||||
int argslen;
|
||||
int argc;
|
||||
PROCESS_INFORMATION pi;
|
||||
#ifndef __MINGW32CE__
|
||||
STARTUPINFOA si = { sizeof (STARTUPINFOA) };
|
||||
char *winenv = NULL;
|
||||
#else
|
||||
wchar_t *wargs, *wprogram;
|
||||
#endif
|
||||
DWORD err;
|
||||
|
||||
if (!program)
|
||||
error ("No executable specified, specify executable to debug.\n");
|
||||
@ -437,34 +481,15 @@ win32_create_inferior (char *program, char **program_args)
|
||||
flags |= CREATE_NEW_PROCESS_GROUP;
|
||||
#endif
|
||||
|
||||
#ifdef __MINGW32CE__
|
||||
to_back_slashes (program);
|
||||
wargs = alloca (argslen * sizeof (wchar_t));
|
||||
mbstowcs (wargs, args, argslen);
|
||||
wprogram = alloca ((strlen (program) + 1) * sizeof (wchar_t));
|
||||
mbstowcs (wprogram, program, strlen (program) + 1);
|
||||
ret = CreateProcessW (wprogram, /* image name */
|
||||
wargs, /* command line */
|
||||
NULL, /* security, not supported */
|
||||
NULL, /* thread, not supported */
|
||||
FALSE, /* inherit handles, not supported */
|
||||
flags, /* start flags */
|
||||
NULL, /* environment, not supported */
|
||||
NULL, /* current directory, not supported */
|
||||
NULL, /* start info, not supported */
|
||||
&pi); /* proc info */
|
||||
#else
|
||||
ret = CreateProcessA (program, /* image name */
|
||||
args, /* command line */
|
||||
NULL, /* security */
|
||||
NULL, /* thread */
|
||||
TRUE, /* inherit handles */
|
||||
flags, /* start flags */
|
||||
winenv, /* environment */
|
||||
NULL, /* current directory */
|
||||
&si, /* start info */
|
||||
&pi); /* proc info */
|
||||
#endif
|
||||
ret = create_process (program, args, flags, &pi);
|
||||
err = GetLastError ();
|
||||
if (!ret && err == ERROR_FILE_NOT_FOUND)
|
||||
{
|
||||
char *exename = alloca (strlen (program) + 5);
|
||||
strcat (strcpy (exename, program), ".exe");
|
||||
ret = create_process (exename, args, flags, &pi);
|
||||
err = GetLastError ();
|
||||
}
|
||||
|
||||
#ifndef USE_WIN32API
|
||||
if (orig_path)
|
||||
@ -473,7 +498,6 @@ win32_create_inferior (char *program, char **program_args)
|
||||
|
||||
if (!ret)
|
||||
{
|
||||
DWORD err = GetLastError ();
|
||||
error ("Error creating process \"%s%s\", (error %d): %s\n",
|
||||
program, args, (int) err, strwinerror (err));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user