https://git.reactos.org/?p=reactos.git;a=commitdiff;h=90c63d12a1960b75b518ac8e9dad81efce5a7fac

commit 90c63d12a1960b75b518ac8e9dad81efce5a7fac
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Thu Nov 14 23:25:21 2019 +0900
Commit:     GitHub <[email protected]>
CommitDate: Thu Nov 14 23:25:21 2019 +0900

    [SHELL32][BOOTDATA] Implement Command Prompt here (#2029)
    
    Add "Command Prompt here" menu item to the Right-click menu of normal 
folders and drives. Currently, this menu item doesn't work correctly because of 
the bug of pushd. CORE-12150
---
 boot/bootdata/hivecls.inf                 | 16 ++++++++
 dll/win32/shell32/CDefaultContextMenu.cpp | 65 ++++++++++++++++++-------------
 dll/win32/shell32/lang/bg-BG.rc           |  1 +
 dll/win32/shell32/lang/ca-ES.rc           |  1 +
 dll/win32/shell32/lang/cs-CZ.rc           |  1 +
 dll/win32/shell32/lang/da-DK.rc           |  1 +
 dll/win32/shell32/lang/de-DE.rc           |  1 +
 dll/win32/shell32/lang/el-GR.rc           |  1 +
 dll/win32/shell32/lang/en-GB.rc           |  1 +
 dll/win32/shell32/lang/en-US.rc           |  1 +
 dll/win32/shell32/lang/es-ES.rc           |  1 +
 dll/win32/shell32/lang/et-EE.rc           |  1 +
 dll/win32/shell32/lang/fi-FI.rc           |  1 +
 dll/win32/shell32/lang/fr-FR.rc           |  1 +
 dll/win32/shell32/lang/he-IL.rc           |  1 +
 dll/win32/shell32/lang/hi-IN.rc           |  1 +
 dll/win32/shell32/lang/hu-HU.rc           |  1 +
 dll/win32/shell32/lang/id-ID.rc           |  1 +
 dll/win32/shell32/lang/it-IT.rc           |  1 +
 dll/win32/shell32/lang/ja-JP.rc           |  1 +
 dll/win32/shell32/lang/ko-KR.rc           |  1 +
 dll/win32/shell32/lang/nl-NL.rc           |  1 +
 dll/win32/shell32/lang/no-NO.rc           |  1 +
 dll/win32/shell32/lang/pl-PL.rc           |  1 +
 dll/win32/shell32/lang/pt-BR.rc           |  1 +
 dll/win32/shell32/lang/pt-PT.rc           |  1 +
 dll/win32/shell32/lang/ro-RO.rc           |  1 +
 dll/win32/shell32/lang/ru-RU.rc           |  1 +
 dll/win32/shell32/lang/sk-SK.rc           |  1 +
 dll/win32/shell32/lang/sl-SI.rc           |  1 +
 dll/win32/shell32/lang/sq-AL.rc           |  1 +
 dll/win32/shell32/lang/sv-SE.rc           |  1 +
 dll/win32/shell32/lang/tr-TR.rc           |  1 +
 dll/win32/shell32/lang/uk-UA.rc           |  1 +
 dll/win32/shell32/lang/zh-CN.rc           |  1 +
 dll/win32/shell32/lang/zh-TW.rc           |  1 +
 dll/win32/shell32/shlexec.cpp             | 40 ++++++++++++++++++-
 dll/win32/shell32/shresdef.h              |  1 +
 38 files changed, 129 insertions(+), 27 deletions(-)

diff --git a/boot/bootdata/hivecls.inf b/boot/bootdata/hivecls.inf
index d3ae861c06b..d2cd5bada57 100644
--- a/boot/bootdata/hivecls.inf
+++ b/boot/bootdata/hivecls.inf
@@ -26,6 +26,22 @@ 
HKCR,"Folder\shell\explore","BrowserFlags",0x00010001,"0x00000022"
 HKCR,"Folder\shell\explore","ExplorerFlags",0x00010001,"0x00000021"
 HKCR,"Folder\shell\explore\command","",0x00000000,"explorer.exe /e,""%1"""
 
+; Directory
+HKCR,"Directory","",0x00000000,"File Folder"
+;HKCR,"Directory\DefaultIcon","",0x00000000,"%SystemRoot%\system32\shell32.dll,-4"
+HKCR,"Directory","AlwaysShowExt",0x00000000,""
+HKCR,"Directory","NoRecentDocs",0x00000000,""
+HKCR,"Directory\shell\cmd","",0x00020000,"@%SystemRoot%\system32\shell32.dll,-306"
+HKCR,"Directory\shell\cmd","Extended",0x00000000,""
+HKCR,"Directory\shell\cmd\command","",0x00000000,"cmd /s /k pushd ""%V"""
+
+; Drive
+HKCR,"Drive","",0x00000000,"Drive"
+;HKCR,"Drive\DefaultIcon","",0x00000000,"%SystemRoot%\system32\shell32.dll,-4"
+HKCR,"Drive\shell\cmd","",0x00020000,"@%SystemRoot%\system32\shell32.dll,-306"
+HKCR,"Drive\shell\cmd","Extended",0x00000000,""
+HKCR,"Drive\shell\cmd\command","",0x00000000,"cmd /s /k pushd ""%V"""
+
 ; Clipboard Element
 HKCR,".clp","",0x00000000,"clpfile"
 HKCR,".clp","Content Type",0x00000000,"application/x-msclip"
diff --git a/dll/win32/shell32/CDefaultContextMenu.cpp 
b/dll/win32/shell32/CDefaultContextMenu.cpp
index aa250481a08..31edee28e7d 100644
--- a/dll/win32/shell32/CDefaultContextMenu.cpp
+++ b/dll/win32/shell32/CDefaultContextMenu.cpp
@@ -562,49 +562,62 @@ CDefaultContextMenu::AddStaticContextMenusToMenu(
         /* By default use verb for menu item name */
         mii.dwTypeData = pEntry->szVerb;
 
+        WCHAR wszKey[256];
+        HRESULT hr;
+        hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", 
pEntry->szVerb);
+        if (FAILED_UNEXPECTEDLY(hr))
+        {
+            pEntry = pEntry->pNext;
+            continue;
+        }
+
+        BOOL Extended = FALSE;
+        HKEY hkVerb;
         if (idResource > 0)
         {
             if (LoadStringW(shell32_hInstance, idResource, wszVerb, 
_countof(wszVerb)))
                 mii.dwTypeData = wszVerb; /* use translated verb */
             else
                 ERR("Failed to load string\n");
+
+            LONG res = RegOpenKeyW(pEntry->hkClass, wszKey, &hkVerb);
+            if (res == ERROR_SUCCESS)
+            {
+                res = RegQueryValueExW(hkVerb, L"Extended", NULL, NULL, NULL, 
NULL);
+                Extended = (res == ERROR_SUCCESS);
+
+                RegCloseKey(hkVerb);
+            }
         }
         else
         {
-            WCHAR wszKey[256];
-            HRESULT hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", 
pEntry->szVerb);
-
-            if (SUCCEEDED(hr))
+            LONG res = RegOpenKeyW(pEntry->hkClass, wszKey, &hkVerb);
+            if (res == ERROR_SUCCESS)
             {
-                HKEY hkVerb;
                 DWORD cbVerb = sizeof(wszVerb);
-                LONG res = RegOpenKeyW(pEntry->hkClass, wszKey, &hkVerb);
+                res = RegLoadMUIStringW(hkVerb, NULL, wszVerb, cbVerb, NULL, 
0, NULL);
                 if (res == ERROR_SUCCESS)
                 {
-                    res = RegLoadMUIStringW(hkVerb,
-                                            NULL,
-                                            wszVerb,
-                                            cbVerb,
-                                            NULL,
-                                            0,
-                                            NULL);
-                    if (res == ERROR_SUCCESS)
-                    {
-                        /* use description for the menu entry */
-                        mii.dwTypeData = wszVerb;
-                    }
-
-                    RegCloseKey(hkVerb);
+                    /* use description for the menu entry */
+                    mii.dwTypeData = wszVerb;
                 }
+
+                res = RegQueryValueExW(hkVerb, L"Extended", NULL, NULL, NULL, 
NULL);
+                Extended = (res == ERROR_SUCCESS);
+
+                RegCloseKey(hkVerb);
             }
         }
 
-        mii.cch = wcslen(mii.dwTypeData);
-        mii.fState = fState;
-        mii.wID = iIdCmdFirst + cIds;
-        InsertMenuItemW(hMenu, *pIndexMenu, TRUE, &mii);
-        (*pIndexMenu)++;
-        cIds++;
+        if (!Extended || GetAsyncKeyState(VK_SHIFT) < 0)
+        {
+            mii.cch = wcslen(mii.dwTypeData);
+            mii.fState = fState;
+            mii.wID = iIdCmdFirst + cIds;
+            InsertMenuItemW(hMenu, *pIndexMenu, TRUE, &mii);
+            (*pIndexMenu)++;
+            cIds++;
+        }
 
         pEntry = pEntry->pNext;
 
diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc
index e61b6c675fb..42d1fb138bf 100644
--- a/dll/win32/shell32/lang/bg-BG.rc
+++ b/dll/win32/shell32/lang/bg-BG.rc
@@ -911,6 +911,7 @@ BEGIN
     IDS_EDIT_VERB "Обработка"
     IDS_FIND_VERB "Търсене"
     IDS_PRINT_VERB "Разпечатване"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u файла, %u папки"
     IDS_PRINTERS "Печатачи"
diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc
index b2e25f93076..5f01647f972 100644
--- a/dll/win32/shell32/lang/ca-ES.rc
+++ b/dll/win32/shell32/lang/ca-ES.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc
index b5f4c2c2616..c668b7b14d8 100644
--- a/dll/win32/shell32/lang/cs-CZ.rc
+++ b/dll/win32/shell32/lang/cs-CZ.rc
@@ -916,6 +916,7 @@ BEGIN
     IDS_EDIT_VERB "Upravit"
     IDS_FIND_VERB "Najít"
     IDS_PRINT_VERB "Tisknout"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u souborů, %u složek"
     IDS_PRINTERS "Tiskárny"
diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc
index 7a063778cab..30172aed75d 100644
--- a/dll/win32/shell32/lang/da-DK.rc
+++ b/dll/win32/shell32/lang/da-DK.rc
@@ -916,6 +916,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc
index f0145f348be..1f6b2cc673d 100644
--- a/dll/win32/shell32/lang/de-DE.rc
+++ b/dll/win32/shell32/lang/de-DE.rc
@@ -911,6 +911,7 @@ BEGIN
     IDS_EDIT_VERB "Bearbeiten"
     IDS_FIND_VERB "Finden"
     IDS_PRINT_VERB "Drucken"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Dateien, %u Ordner"
     IDS_PRINTERS "Drucker"
diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc
index aaf9db3c3b7..5196614198a 100644
--- a/dll/win32/shell32/lang/el-GR.rc
+++ b/dll/win32/shell32/lang/el-GR.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc
index 7eb8229884e..5d4cf6bc4a9 100644
--- a/dll/win32/shell32/lang/en-GB.rc
+++ b/dll/win32/shell32/lang/en-GB.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc
index bce8bc31278..f50562a6982 100644
--- a/dll/win32/shell32/lang/en-US.rc
+++ b/dll/win32/shell32/lang/en-US.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc
index 1464b4d14f0..12e5e17d7d8 100644
--- a/dll/win32/shell32/lang/es-ES.rc
+++ b/dll/win32/shell32/lang/es-ES.rc
@@ -918,6 +918,7 @@ BEGIN
     IDS_EDIT_VERB "Editar"
     IDS_FIND_VERB "Buscar"
     IDS_PRINT_VERB "Imprimir"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u archivos, %u carpetas"
     IDS_PRINTERS "Impresoras"
diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc
index e2e8cf41e28..63b137c76df 100644
--- a/dll/win32/shell32/lang/et-EE.rc
+++ b/dll/win32/shell32/lang/et-EE.rc
@@ -917,6 +917,7 @@ BEGIN
     IDS_EDIT_VERB "Muuda"
     IDS_FIND_VERB "Leia"
     IDS_PRINT_VERB "Prindi"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Faili, %u Kausta"
     IDS_PRINTERS "Printerid"
diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc
index f6cd13e6878..5fc6ddfadf4 100644
--- a/dll/win32/shell32/lang/fi-FI.rc
+++ b/dll/win32/shell32/lang/fi-FI.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc
index 58464c856ff..e5d0e25e44f 100644
--- a/dll/win32/shell32/lang/fr-FR.rc
+++ b/dll/win32/shell32/lang/fr-FR.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Éditer"
     IDS_FIND_VERB "Chercher"
     IDS_PRINT_VERB "Imprimer"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u fichiers, %u répertoires"
     IDS_PRINTERS "Imprimantes"
diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc
index 9e63d54b428..e9e64d7eafe 100644
--- a/dll/win32/shell32/lang/he-IL.rc
+++ b/dll/win32/shell32/lang/he-IL.rc
@@ -912,6 +912,7 @@ BEGIN
     IDS_EDIT_VERB "ערוך"
     IDS_FIND_VERB "מצא"
     IDS_PRINT_VERB "הדפס"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u קבצים, %u תיקיות"
     IDS_PRINTERS "מדפסות"
diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc
index 6903fe2372e..7e637bad1c5 100644
--- a/dll/win32/shell32/lang/hi-IN.rc
+++ b/dll/win32/shell32/lang/hi-IN.rc
@@ -905,6 +905,7 @@ BEGIN
     IDS_EDIT_VERB "संपादित करें"
     IDS_FIND_VERB "ढूंढे"
     IDS_PRINT_VERB "प्रिंट"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u फ़ाइलें, %u फ़ोल्डर"
     IDS_PRINTERS "प्रिंटर"
diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc
index 037d7f8e4c9..1c9f001830e 100644
--- a/dll/win32/shell32/lang/hu-HU.rc
+++ b/dll/win32/shell32/lang/hu-HU.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc
index 4d5abb5d14e..c9736262764 100644
--- a/dll/win32/shell32/lang/id-ID.rc
+++ b/dll/win32/shell32/lang/id-ID.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Cari"
     IDS_PRINT_VERB "Cetak"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Berkas, %u Folder"
     IDS_PRINTERS "Printer"
diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc
index fa5cd0d287e..7a854349b50 100644
--- a/dll/win32/shell32/lang/it-IT.rc
+++ b/dll/win32/shell32/lang/it-IT.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Modifica"
     IDS_FIND_VERB "Cerca"
     IDS_PRINT_VERB "Stampa"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u File, %u Cartelle"
     IDS_PRINTERS "Stampanti"
diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc
index 56a7ca99a3d..9c2732f4a09 100644
--- a/dll/win32/shell32/lang/ja-JP.rc
+++ b/dll/win32/shell32/lang/ja-JP.rc
@@ -907,6 +907,7 @@ BEGIN
     IDS_EDIT_VERB "編集"
     IDS_FIND_VERB "検索"
     IDS_PRINT_VERB "印刷"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u 個のファイル、 %u 個のフォルダ"
     IDS_PRINTERS "プリンタ"
diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc
index 4239b7e3da5..3b33cefd7fe 100644
--- a/dll/win32/shell32/lang/ko-KR.rc
+++ b/dll/win32/shell32/lang/ko-KR.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc
index cb9ec3ef3e9..e7a697f12da 100644
--- a/dll/win32/shell32/lang/nl-NL.rc
+++ b/dll/win32/shell32/lang/nl-NL.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc
index 16c0a4333ea..51d999b495b 100644
--- a/dll/win32/shell32/lang/no-NO.rc
+++ b/dll/win32/shell32/lang/no-NO.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Rediger"
     IDS_FIND_VERB "Finn"
     IDS_PRINT_VERB "Skriv ut"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u filer, %u mapper"
     IDS_PRINTERS "Skrivere"
diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc
index 38724ea0bbd..7c0cc733c22 100644
--- a/dll/win32/shell32/lang/pl-PL.rc
+++ b/dll/win32/shell32/lang/pl-PL.rc
@@ -915,6 +915,7 @@ BEGIN
     IDS_EDIT_VERB "Edytuj"
     IDS_FIND_VERB "Wyszukaj"
     IDS_PRINT_VERB "Drukuj"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Plików, %u Katalogów"
     IDS_PRINTERS "Drukarki"
diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc
index 035a4ae514a..c34ae71fc0d 100644
--- a/dll/win32/shell32/lang/pt-BR.rc
+++ b/dll/win32/shell32/lang/pt-BR.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Editar"
     IDS_FIND_VERB "Procurar"
     IDS_PRINT_VERB "Imprimir"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Arquivos, %u Pastas"
     IDS_PRINTERS "Impressoras"
diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc
index 685f86cf1bc..6560b089148 100644
--- a/dll/win32/shell32/lang/pt-PT.rc
+++ b/dll/win32/shell32/lang/pt-PT.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Editar"
     IDS_FIND_VERB "Procurar"
     IDS_PRINT_VERB "Imprimir"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Ficheiros, %u Pastas"
     IDS_PRINTERS "Impressoras"
diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc
index 5d6c56c8a7c..a3dfce4391b 100644
--- a/dll/win32/shell32/lang/ro-RO.rc
+++ b/dll/win32/shell32/lang/ro-RO.rc
@@ -912,6 +912,7 @@ BEGIN
     IDS_EDIT_VERB "Editează"
     IDS_FIND_VERB "Caută"
     IDS_PRINT_VERB "Imprimă"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u fișiere, %u dosare"
     IDS_PRINTERS "Imprimante"
diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc
index 36002d87d62..46b397572aa 100644
--- a/dll/win32/shell32/lang/ru-RU.rc
+++ b/dll/win32/shell32/lang/ru-RU.rc
@@ -917,6 +917,7 @@ BEGIN
     IDS_EDIT_VERB "Изменить"
     IDS_FIND_VERB "Поиск"
     IDS_PRINT_VERB "Печать"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u файлов, %u папок"
     IDS_PRINTERS "Принтеры"
diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc
index 165f210a79d..01000ca3e98 100644
--- a/dll/win32/shell32/lang/sk-SK.rc
+++ b/dll/win32/shell32/lang/sk-SK.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Upraviť"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Tlačiť"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "súbory: %u, priečinky: %u"
     IDS_PRINTERS "Tlačiarne"
diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc
index 678c5f5f7be..640f4cb7e5b 100644
--- a/dll/win32/shell32/lang/sl-SI.rc
+++ b/dll/win32/shell32/lang/sl-SI.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Edit"
     IDS_FIND_VERB "Find"
     IDS_PRINT_VERB "Print"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Files, %u Folders"
     IDS_PRINTERS "Printers"
diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc
index f65bf86b3f2..fe6992e9834 100644
--- a/dll/win32/shell32/lang/sq-AL.rc
+++ b/dll/win32/shell32/lang/sq-AL.rc
@@ -914,6 +914,7 @@ BEGIN
     IDS_EDIT_VERB "Modifiko"
     IDS_FIND_VERB "Gjej"
     IDS_PRINT_VERB "Printo"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Dokumenta, %u Dosje"
     IDS_PRINTERS "Printera"
diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc
index e17328ecc79..06749268ad7 100644
--- a/dll/win32/shell32/lang/sv-SE.rc
+++ b/dll/win32/shell32/lang/sv-SE.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Redigera"
     IDS_FIND_VERB "Hitta"
     IDS_PRINT_VERB "Skriv ut"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u filer, %u mappar"
     IDS_PRINTERS "Skrivare"
diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc
index bc6addfed2b..88449402f00 100644
--- a/dll/win32/shell32/lang/tr-TR.rc
+++ b/dll/win32/shell32/lang/tr-TR.rc
@@ -912,6 +912,7 @@ BEGIN
     IDS_EDIT_VERB "Düzenle"
     IDS_FIND_VERB "Bul"
     IDS_PRINT_VERB "Yazdır"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u Kütük, %u Dizin"
     IDS_PRINTERS "Yazıcılar"
diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc
index 97ec05510e7..faa2254e158 100644
--- a/dll/win32/shell32/lang/uk-UA.rc
+++ b/dll/win32/shell32/lang/uk-UA.rc
@@ -910,6 +910,7 @@ BEGIN
     IDS_EDIT_VERB "Змінити"
     IDS_FIND_VERB "Пошук"
     IDS_PRINT_VERB "Друк"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u файлів, %u папок"
     IDS_PRINTERS "Принтери"
diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc
index f3debf50826..af8f3c41076 100644
--- a/dll/win32/shell32/lang/zh-CN.rc
+++ b/dll/win32/shell32/lang/zh-CN.rc
@@ -920,6 +920,7 @@ BEGIN
     IDS_EDIT_VERB "编辑"
     IDS_FIND_VERB "查找"
     IDS_PRINT_VERB "打印"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u 个文件,%u 个文件夹"
     IDS_PRINTERS "打印机"
diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc
index 31faf69e845..a9cf8074ce1 100644
--- a/dll/win32/shell32/lang/zh-TW.rc
+++ b/dll/win32/shell32/lang/zh-TW.rc
@@ -921,6 +921,7 @@ BEGIN
     IDS_EDIT_VERB "編輯"
     IDS_FIND_VERB "搜索"
     IDS_PRINT_VERB "列印"
+    IDS_CMD_VERB "Command Prompt here"
 
     IDS_FILE_FOLDER "%u 個檔案, %u 個檔案夾"
     IDS_PRINTERS "印表機"
diff --git a/dll/win32/shell32/shlexec.cpp b/dll/win32/shell32/shlexec.cpp
index 5a741467cb0..049426dd7da 100644
--- a/dll/win32/shell32/shlexec.cpp
+++ b/dll/win32/shell32/shlexec.cpp
@@ -3,7 +3,7 @@
  *
  * Copyright 1998 Marcus Meissner
  * Copyright 2002 Eric Pouech
- * Copyright 2018 Katayama Hirofumi MZ
+ * Copyright 2018-2019 Katayama Hirofumi MZ
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -167,6 +167,8 @@ static void ParseTildeEffect(PWSTR &res, LPCWSTR &args, 
DWORD &len, DWORD &used,
  * %I address of a global item ID (explorer switch /idlist)
  * %L seems to be %1 as long filename followed by the 8+3 variation
  * %S ???
+ * %W Working directory
+ * %V Use either %L or %W
  * %* all following parameters (see batfile)
  *
  * The way we parse the command line arguments was determined through extensive
@@ -302,6 +304,42 @@ static BOOL SHELL_ArgifyW(WCHAR* out, DWORD len, const 
WCHAR* fmt, const WCHAR*
                     found_p1 = TRUE;
                     break;
 
+                case 'w':
+                case 'W':
+                    if (lpDir)
+                    {
+                        used += wcslen(lpDir);
+                        if (used < len)
+                        {
+                            wcscpy(res, lpDir);
+                            res += wcslen(lpDir);
+                        }
+                    }
+                    break;
+
+                case 'v':
+                case 'V':
+                    if (lpFile)
+                    {
+                        used += wcslen(lpFile);
+                        if (used < len)
+                        {
+                            wcscpy(res, lpFile);
+                            res += wcslen(lpFile);
+                        }
+                        found_p1 = TRUE;
+                    }
+                    else if (lpDir)
+                    {
+                        used += wcslen(lpDir);
+                        if (used < len)
+                        {
+                            wcscpy(res, lpDir);
+                            res += wcslen(lpDir);
+                        }
+                    }
+                    break;
+
                 case 'i':
                 case 'I':
                     if (pidl)
diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h
index 2b729d6a2ea..3e425eac704 100644
--- a/dll/win32/shell32/shresdef.h
+++ b/dll/win32/shell32/shresdef.h
@@ -200,6 +200,7 @@
 #define IDS_EDIT_VERB    303
 #define IDS_FIND_VERB    304
 #define IDS_PRINT_VERB   305
+#define IDS_CMD_VERB     306
 
 #define IDS_FILE_FOLDER          308
 #define IDS_CREATELINK           309

Reply via email to