[ros-diffs] [janderwald] 35643: - Prevent a crash by checking the applet name if it is empty and does exist - %1 is used for file argument, where %2, %3, %n indicate the index of the passed param, %* is the rest of the command - Directly pass the full filename to ShellExecuteExW from the default context menu - Should fix executing cpl in default shellview

janderwald at svn.reactos.org janderwald at svn.reactos.org
Mon Aug 25 23:02:22 CEST 2008


Author: janderwald
Date: Mon Aug 25 16:02:21 2008
New Revision: 35643

URL: http://svn.reactos.org/svn/reactos?rev=35643&view=rev
Log:
- Prevent a crash by checking the applet name if it is empty and does exist
- %1 is used for file argument, where %2, %3, %n indicate the index of the passed param, %* is the rest of the command
- Directly pass the full filename to ShellExecuteExW from the default context menu
- Should fix executing cpl in default shellview

Modified:
    trunk/reactos/dll/win32/shell32/control.c
    trunk/reactos/dll/win32/shell32/shlexec.c
    trunk/reactos/dll/win32/shell32/shv_def_cmenu.c

Modified: trunk/reactos/dll/win32/shell32/control.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/control.c?rev=35643&r1=35642&r2=35643&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/control.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/control.c [iso-8859-1] Mon Aug 25 16:02:21 2008
@@ -427,12 +427,20 @@
 	  sp = 0;
        }
 
-       if ((extraPmts)&&(!spSet))
+       if ((extraPmts) && extraPmts[0] &&(!spSet))
        {
           while ((lstrcmpiW(extraPmts, applet->info[sp].szName)) && (sp < applet->count))
             sp++;
+
+          if (sp >= applet->count)
+          {
+            ReleaseMutex(hMutex);
+            CloseHandle(hMutex);
+            Control_UnloadApplet(applet);
+            HeapFree(GetProcessHeap(), 0, buffer);
+            return;
+          }
        }
-
        if (applet->info[sp].dwSize) {
 	  if (!applet->proc(applet->hWnd, CPL_STARTWPARMSA, sp, (LPARAM)extraPmts))
 	     applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].lData);

Modified: trunk/reactos/dll/win32/shell32/shlexec.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlexec.c?rev=35643&r1=35642&r2=35643&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shlexec.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shlexec.c [iso-8859-1] Mon Aug 25 16:02:21 2008
@@ -129,6 +129,7 @@
                         used++;
                         if (used < len)
                             *res++ = '"';
+                        break;
                     }
                     else
                     {
@@ -146,7 +147,10 @@
                     }
                     break;
                 }
-                /* else fall through */
+                else
+                {
+                    break;
+                }
             case '1':
                 if (!done || (*fmt == '1'))
                 {

Modified: trunk/reactos/dll/win32/shell32/shv_def_cmenu.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_def_cmenu.c?rev=35643&r1=35642&r2=35643&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shv_def_cmenu.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shv_def_cmenu.c [iso-8859-1] Mon Aug 25 16:02:21 2008
@@ -1508,6 +1508,8 @@
     IDefaultContextMenuImpl *This,
     LPCMINVOKECOMMANDINFO lpcmi)
 {
+    STRRET strFile;
+    WCHAR szPath[MAX_PATH];
     SHELLEXECUTEINFOW sei;
     PStaticShellEntry pCurrent = This->shead;
     int verb = LOWORD(lpcmi->lpVerb) - This->iIdSCMFirst;
@@ -1520,16 +1522,25 @@
         return E_FAIL;
 
 
+    if (IShellFolder2_GetDisplayNameOf(This->dcm.psf, This->dcm.apidl[0], SHGDN_FORPARSING, &strFile) != S_OK)
+    {
+        ERR("IShellFolder_GetDisplayNameOf failed for apidl\n");
+        return E_FAIL;
+    }
+
+    if (StrRetToBufW(&strFile, This->dcm.apidl[0], szPath, MAX_PATH) != S_OK)
+        return E_FAIL;
+
+
     ZeroMemory(&sei, sizeof(sei));
     sei.cbSize = sizeof(sei);
-    sei.fMask = SEE_MASK_CLASSNAME | SEE_MASK_IDLIST;
+    sei.fMask = SEE_MASK_CLASSNAME;
     sei.lpClass = pCurrent->szClass;
     sei.hwnd = lpcmi->hwnd;
     sei.nShow = SW_SHOWNORMAL;
     sei.lpVerb = pCurrent->szVerb;
-    sei.lpIDList = ILCombine(This->dcm.pidlFolder, This->dcm.apidl[0]);
+    sei.lpFile = szPath;
     ShellExecuteExW(&sei);
-    SHFree(sei.lpIDList);
     return S_OK;
 
 }



More information about the Ros-diffs mailing list