Fixed WinExec16 to handle quoted filenames correctly.
diff --git a/loader/module.c b/loader/module.c
index f743586..4ce1202 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -720,35 +720,60 @@
*/
HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
{
- LPCSTR p = NULL;
+ LPCSTR p, args = NULL;
+ LPCSTR name_beg, name_end;
LPSTR name, cmdline;
- int len;
+ int arglen;
HINSTANCE16 ret;
char buffer[MAX_PATH];
- if ( ( *lpCmdLine == '"' ) && ( p = strchr ( lpCmdLine+1, '"' ) ) )
- p = strchr ( p, ' ' );
- else
- p = strchr( lpCmdLine, ' ' );
- if ( p )
+ if (*lpCmdLine == '"') /* has to be only one and only at beginning ! */
{
- if (!(name = HeapAlloc( GetProcessHeap(), 0, p - lpCmdLine + 1 )))
- return ERROR_NOT_ENOUGH_MEMORY;
- memcpy( name, lpCmdLine, p - lpCmdLine );
- name[p - lpCmdLine] = 0;
- p++;
- len = strlen(p);
- cmdline = SEGPTR_ALLOC( len + 2 );
- cmdline[0] = (BYTE)len;
- strcpy( cmdline + 1, p );
+ name_beg = lpCmdLine+1;
+ p = strchr ( lpCmdLine+1, '"' );
+ if (p)
+ {
+ name_end = p;
+ args = strchr ( p, ' ' );
+ }
+ else /* yes, even valid with trailing '"' missing */
+ name_end = lpCmdLine+strlen(lpCmdLine);
+ }
+ else
+ {
+ name_beg = lpCmdLine;
+ args = strchr( lpCmdLine, ' ' );
+ name_end = args ? args : lpCmdLine+strlen(lpCmdLine);
+ }
+
+ if ((name_beg == lpCmdLine) && (!args))
+ { /* just use the original cmdline string as file name */
+ name = (LPSTR)lpCmdLine;
}
else
{
- name = (LPSTR)lpCmdLine;
- cmdline = SEGPTR_ALLOC(2);
- cmdline[0] = cmdline[1] = 0;
+ if (!(name = HeapAlloc( GetProcessHeap(), 0, name_end - name_beg + 1 )))
+ return ERROR_NOT_ENOUGH_MEMORY;
+ memcpy( name, name_beg, name_end - name_beg );
+ name[name_end - name_beg] = '\0';
}
+ if (args)
+ {
+ args++;
+ arglen = strlen(args);
+ cmdline = SEGPTR_ALLOC( 2 + arglen );
+ cmdline[0] = (BYTE)arglen;
+ strcpy( cmdline + 1, args );
+ }
+ else
+ {
+ cmdline = SEGPTR_ALLOC( 2 );
+ cmdline[0] = cmdline[1] = 0;
+ }
+
+ TRACE("name: %s, cmdline: %.*s\n", name, cmdline[0], &cmdline[1]);
+
if (SearchPathA( NULL, name, ".exe", sizeof(buffer), buffer, NULL ))
{
LOADPARAMS16 params;