Module: wine Branch: master Commit: a9c33bbc4aa254e72e5c2876387718e285b43e0f URL: http://source.winehq.org/git/wine.git/?a=commit;h=a9c33bbc4aa254e72e5c287638...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Jul 21 12:22:01 2009 +0200
kernel32: Try to load a 32-bit builtin in WinExec16 if the file doesn't exist.
---
dlls/kernel32/ne_module.c | 43 ++++++++++++++++++++++++++++++------------- 1 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/dlls/kernel32/ne_module.c b/dlls/kernel32/ne_module.c index 4b45e7b..87a1a86 100644 --- a/dlls/kernel32/ne_module.c +++ b/dlls/kernel32/ne_module.c @@ -119,6 +119,15 @@ static inline void patch_code_segment( NE_MODULE *pModule )
/*********************************************************************** + * contains_path + */ +static inline int contains_path( LPCSTR name ) +{ + return ((*name && (name[1] == ':')) || strchr(name, '/') || strchr(name, '\')); +} + + +/*********************************************************************** * NE_strcasecmp * * locale-independent case conversion for module lookups @@ -1674,6 +1683,8 @@ HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow ) int arglen; HINSTANCE16 ret; char buffer[MAX_PATH]; + LOADPARAMS16 params; + WORD showCmd[2];
if (*lpCmdLine == '"') /* has to be only one and only at beginning ! */ { @@ -1722,23 +1733,29 @@ HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
TRACE("name: '%s', cmdline: '%.*s'\n", name, cmdline[0], &cmdline[1]);
- if (SearchPathA( NULL, name, ".exe", sizeof(buffer), buffer, NULL )) - { - LOADPARAMS16 params; - WORD showCmd[2]; - showCmd[0] = 2; - showCmd[1] = nCmdShow; + showCmd[0] = 2; + showCmd[1] = nCmdShow;
- params.hEnvironment = 0; - params.cmdLine = MapLS( cmdline ); - params.showCmd = MapLS( showCmd ); - params.reserved = 0; + params.hEnvironment = 0; + params.cmdLine = MapLS( cmdline ); + params.showCmd = MapLS( showCmd ); + params.reserved = 0;
+ if (SearchPathA( NULL, name, ".exe", sizeof(buffer), buffer, NULL )) + { ret = LoadModule16( buffer, ¶ms ); - UnMapLS( params.cmdLine ); - UnMapLS( params.showCmd ); } - else ret = GetLastError(); + else if (!contains_path( name )) /* try 16-bit builtin */ + { + lstrcpynA( buffer, name, sizeof(buffer) ); + if (strlen( buffer ) < sizeof(buffer) - 4 && !strchr( buffer, '.' )) strcat( buffer, ".exe" ); + ret = LoadModule16( buffer, ¶ms ); + if (ret == ERROR_FILE_NOT_FOUND) ret = 21; /* it might be a 32-bit builtin too */ + } + else ret = ERROR_FILE_NOT_FOUND; + + UnMapLS( params.cmdLine ); + UnMapLS( params.showCmd );
HeapFree( GetProcessHeap(), 0, cmdline ); if (name != lpCmdLine) HeapFree( GetProcessHeap(), 0, name );