Francois Gouget : setupapi: Fix handling of inf paths that are quoted ( due to spaces, typically).
Module: wine Branch: refs/heads/master Commit: 3b7fb551ce211210abd5877b41207f6194fb3700 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3b7fb551ce211210abd5877b... Author: Francois Gouget <fgouget(a)codeweavers.com> Date: Wed Aug 9 19:20:48 2006 +0200 setupapi: Fix handling of inf paths that are quoted (due to spaces, typically). --- dlls/setupapi/install.c | 66 +++++++++++++++++++++++++++++++++++++---------- 1 files changed, 52 insertions(+), 14 deletions(-) diff --git a/dlls/setupapi/install.c b/dlls/setupapi/install.c index 591e9e6..876a9b2 100644 --- a/dlls/setupapi/install.c +++ b/dlls/setupapi/install.c @@ -1001,23 +1001,61 @@ #else /* FIXME: other platforms */ #endif static const WCHAR nt_genericW[] = {'.','n','t',0}; - WCHAR *p, *path, section[MAX_PATH + sizeof(nt_platformW)/sizeof(WCHAR)]; + WCHAR *s, *d, *path, section[MAX_PATH + sizeof(nt_platformW)/sizeof(WCHAR)]; void *callback_context; - UINT mode; + UINT mode, in_quotes, bcount; HINF hinf; TRACE("hwnd %p, handle %p, cmdline %s\n", hwnd, handle, debugstr_w(cmdline)); lstrcpynW( section, cmdline, MAX_PATH ); - if (!(p = strchrW( section, ' ' ))) return; - *p++ = 0; - while (*p == ' ') p++; - mode = atoiW( p ); + if (!(s = strchrW( section, ' ' ))) return; + *s++ = 0; + while (*s == ' ') s++; + mode = atoiW( s ); - if (!(p = strchrW( p, ' ' ))) return; - path = p + 1; - while (*path == ' ') path++; + if (!(s = strchrW( s, ' ' ))) return; + while (*s == ' ') s++; + + /* The inf path may be quoted. Code adapted from CommandLineToArgvW() */ + bcount=0; + in_quotes=0; + path=d=s; + while (*s) + { + if (*s==0 || ((*s=='\t' || *s==' ') && !in_quotes)) { + /* end of this command line argument */ + break; + } else if (*s=='\\') { + /* '\\' */ + *d++=*s++; + bcount++; + } else if (*s=='"') { + /* '"' */ + if ((bcount & 1)==0) { + /* Preceded by an even number of '\', this is half that + * number of '\', plus a quote which we erase. + */ + d-=bcount/2; + in_quotes=!in_quotes; + s++; + } else { + /* Preceded by an odd number of '\', this is half that + * number of '\' followed by a '"' + */ + d=d-bcount/2-1; + *d++='"'; + s++; + } + bcount=0; + } else { + /* a regular character */ + *d++=*s++; + bcount=0; + } + } + *d=0; hinf = SetupOpenInfFileW( path, NULL, INF_STYLE_WIN4, NULL ); if (hinf == INVALID_HANDLE_VALUE) return; @@ -1028,14 +1066,14 @@ #endif /* check for <section>.ntx86 (or corresponding name for the current platform) * and then <section>.nt */ - p = section + strlenW(section); - memcpy( p, nt_platformW, sizeof(nt_platformW) ); + s = section + strlenW(section); + memcpy( s, nt_platformW, sizeof(nt_platformW) ); if (!(SetupFindFirstLineW( hinf, section, NULL, &context ))) { - memcpy( p, nt_genericW, sizeof(nt_genericW) ); - if (!(SetupFindFirstLineW( hinf, section, NULL, &context ))) *p = 0; + memcpy( s, nt_genericW, sizeof(nt_genericW) ); + if (!(SetupFindFirstLineW( hinf, section, NULL, &context ))) *s = 0; } - if (*p) TRACE( "using section %s instead\n", debugstr_w(section) ); + if (*s) TRACE( "using section %s instead\n", debugstr_w(section) ); } callback_context = SetupInitDefaultQueueCallback( hwnd );
participants (1)
-
Alexandre Julliard