https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9a55c931f89915cbd69f9401550a3398cf2e5d4f

commit 9a55c931f89915cbd69f9401550a3398cf2e5d4f
Author:     Whindmar Saksit <whinds...@proton.me>
AuthorDate: Fri Feb 28 18:52:48 2025 +0100
Commit:     GitHub <nore...@github.com>
CommitDate: Fri Feb 28 18:52:48 2025 +0100

    [BROWSEUI][SHELL32] Fix desktop and computer find files locations (#7721)
    
    - Searching the Desktop now searches the two desktop folders.
    - Searching My Computer now searches all local disks.
    - Adds a "Browse..." entry to the combobox list.
---
 dll/win32/browseui/shellfind/CFindFolder.cpp |  28 ++-
 dll/win32/browseui/shellfind/CSearchBar.cpp  | 273 ++++++++++++++++++++++++---
 dll/win32/browseui/shellfind/CSearchBar.h    |   5 +-
 dll/win32/browseui/shellfind/shellfind.h     |  48 ++++-
 dll/win32/shell32/lang/bg-BG.rc              |   2 +
 dll/win32/shell32/lang/ca-ES.rc              |   2 +
 dll/win32/shell32/lang/cs-CZ.rc              |   2 +
 dll/win32/shell32/lang/da-DK.rc              |   2 +
 dll/win32/shell32/lang/de-DE.rc              |   2 +
 dll/win32/shell32/lang/el-GR.rc              |   2 +
 dll/win32/shell32/lang/en-GB.rc              |   2 +
 dll/win32/shell32/lang/en-US.rc              |   2 +
 dll/win32/shell32/lang/es-ES.rc              |   2 +
 dll/win32/shell32/lang/et-EE.rc              |   2 +
 dll/win32/shell32/lang/eu-ES.rc              |   2 +
 dll/win32/shell32/lang/fi-FI.rc              |   2 +
 dll/win32/shell32/lang/fr-FR.rc              |   2 +
 dll/win32/shell32/lang/he-IL.rc              |   3 +
 dll/win32/shell32/lang/hi-IN.rc              |   2 +
 dll/win32/shell32/lang/hu-HU.rc              |   2 +
 dll/win32/shell32/lang/id-ID.rc              |   2 +
 dll/win32/shell32/lang/it-IT.rc              |   2 +
 dll/win32/shell32/lang/ja-JP.rc              |   2 +
 dll/win32/shell32/lang/ko-KR.rc              |   2 +
 dll/win32/shell32/lang/nl-NL.rc              |   2 +
 dll/win32/shell32/lang/no-NO.rc              |   2 +
 dll/win32/shell32/lang/pl-PL.rc              |   2 +
 dll/win32/shell32/lang/pt-BR.rc              |   2 +
 dll/win32/shell32/lang/pt-PT.rc              |   2 +
 dll/win32/shell32/lang/ro-RO.rc              |   2 +
 dll/win32/shell32/lang/ru-RU.rc              |   2 +
 dll/win32/shell32/lang/sk-SK.rc              |   2 +
 dll/win32/shell32/lang/sl-SI.rc              |   2 +
 dll/win32/shell32/lang/sq-AL.rc              |   2 +
 dll/win32/shell32/lang/sv-SE.rc              |   2 +
 dll/win32/shell32/lang/tr-TR.rc              |   2 +
 dll/win32/shell32/lang/uk-UA.rc              |   2 +
 dll/win32/shell32/lang/zh-CN.rc              |   2 +
 dll/win32/shell32/lang/zh-HK.rc              |   2 +
 dll/win32/shell32/lang/zh-TW.rc              |   2 +
 dll/win32/shell32/shresdef.h                 |   4 +
 41 files changed, 398 insertions(+), 33 deletions(-)

diff --git a/dll/win32/browseui/shellfind/CFindFolder.cpp 
b/dll/win32/browseui/shellfind/CFindFolder.cpp
index ea703158c30..4a08b8a0852 100644
--- a/dll/win32/browseui/shellfind/CFindFolder.cpp
+++ b/dll/win32/browseui/shellfind/CFindFolder.cpp
@@ -148,7 +148,7 @@ struct _SearchData
 {
     HWND hwnd;
     HANDLE hStopEvent;
-    CStringW szPath;
+    LOCATIONITEM *pPaths;
     CStringW szFileName;
     CStringA szQueryA;
     CStringW szQueryW;
@@ -156,6 +156,11 @@ struct _SearchData
     CStringA szQueryU8;
     BOOL SearchHidden;
     CComPtr<CFindFolder> pFindFolder;
+
+    ~_SearchData()
+    {
+        FreeList(pPaths);
+    }
 };
 
 template<typename TChar, typename TString, int (&StrNCmp)(const TChar *, const 
TChar *, size_t)>
@@ -461,11 +466,17 @@ DWORD WINAPI CFindFolder::SearchThreadProc(LPVOID 
lpParameter)
 {
     _SearchData *data = static_cast<_SearchData*>(lpParameter);
 
+    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
+
     HRESULT hrCoInit = CoInitializeEx(NULL, COINIT_MULTITHREADED);
 
     data->pFindFolder->NotifyConnections(DISPID_SEARCHSTART);
 
-    UINT uTotalFound = RecursiveFind(data->szPath, data);
+    UINT uTotalFound = 0;
+    for (LOCATIONITEM *pLocation = data->pPaths; pLocation; pLocation = 
pLocation->pNext)
+    {
+        uTotalFound += RecursiveFind(pLocation->szPath, data);
+    }
 
     data->pFindFolder->NotifyConnections(DISPID_SEARCHCOMPLETE);
 
@@ -521,7 +532,7 @@ LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM wParam, 
LPARAM lParam, BOOL &
     pSearchData->hwnd = m_hWnd;
 
     SearchStart *pSearchParams = (SearchStart *) lParam;
-    pSearchData->szPath = pSearchParams->szPath;
+    pSearchData->pPaths = pSearchParams->pPaths;
     pSearchData->szFileName = pSearchParams->szFileName;
     pSearchData->szQueryA = pSearchParams->szQuery;
     pSearchData->szQueryW = pSearchParams->szQuery;
@@ -589,12 +600,15 @@ LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM 
wParam, LPARAM lParam, BOOL &
         SetEvent(m_hStopEvent);
     pSearchData->hStopEvent = m_hStopEvent = CreateEvent(NULL, TRUE, FALSE, 
NULL);
 
-    if (!SHCreateThread(SearchThreadProc, pSearchData, NULL, NULL))
+    if (!SHCreateThread(SearchThreadProc, pSearchData, 0, NULL))
     {
-        SHFree(pSearchData);
-        return 0;
+        if (pSearchData->hStopEvent)
+        {
+            CloseHandle(pSearchData->hStopEvent);
+            m_hStopEvent = NULL;
+        }
+        delete pSearchData;
     }
-
     return 0;
 }
 
diff --git a/dll/win32/browseui/shellfind/CSearchBar.cpp 
b/dll/win32/browseui/shellfind/CSearchBar.cpp
index 2ff47bfaf24..543151394b3 100644
--- a/dll/win32/browseui/shellfind/CSearchBar.cpp
+++ b/dll/win32/browseui/shellfind/CSearchBar.cpp
@@ -47,8 +47,130 @@ static UINT GetShellViewItemCount(IShellView *pSV)
     return 0;
 }
 
+
+struct SPECIALFINDITEMID
+{
+    WORD cb;
+    BYTE Type, Id;
+    CLSID Cls;
+    WORD Terminator;
+};
+enum { SPECIAL_BROWSE = 42 };
+
+static const SPECIALFINDITEMID g_pidlBrowseDir = { 
FIELD_OFFSET(SPECIALFINDITEMID, Terminator),
+                                                   0, SPECIAL_BROWSE, 
CLSID_FindFolder, 0 };
+
+static BYTE GetSpecial(PCIDLIST_ABSOLUTE pidl)
+{
+    if (pidl && pidl->mkid.cb == FIELD_OFFSET(SPECIALFINDITEMID, Terminator))
+    {
+        SPECIALFINDITEMID *pSpecial = (SPECIALFINDITEMID*)pidl;
+        if (pSpecial->Type == g_pidlBrowseDir.Type && pSpecial->Cls == 
g_pidlBrowseDir.Cls &&
+            ILIsEmpty(ILGetNext(pidl)))
+        {
+            return pSpecial->Id;
+        }
+    }
+    return 0;
+}
+
+static HRESULT BindToObject(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv)
+{
+    PCUITEMID_CHILD pidlChild;
+    CComPtr<IShellFolder> psf;
+    HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), 
&pidlChild);
+    return SUCCEEDED(hr) ? psf->BindToObject(pidlChild, NULL, riid, ppv) : hr;
+}
+
+static HRESULT GetClassOfItem(PCIDLIST_ABSOLUTE pidl, CLSID *pCLSID)
+{
+    CComPtr<IShellFolder> psf;
+    HRESULT hr = BindToObject(pidl, IID_PPV_ARG(IShellFolder, &psf));
+    return SUCCEEDED(hr) ? IUnknown_GetClassID(psf, pCLSID) : hr;
+}
+
+void FreeList(LOCATIONITEM *pItems)
+{
+    while (pItems)
+    {
+        LOCATIONITEM *pNext = pItems->pNext;
+        CoTaskMemFree(pItems);
+        pItems = pNext;
+    }
+}
+
+static LOCATIONITEM* CreateLocationListItem(PCWSTR szPath)
+{
+    const SIZE_T cch = lstrlenW(szPath) + 1;
+    LOCATIONITEM *p = (LOCATIONITEM*)CoTaskMemAlloc(FIELD_OFFSET(LOCATIONITEM, 
szPath[cch]));
+    if (p)
+    {
+        p->pNext = NULL;
+        CopyMemory(p->szPath, szPath, cch * sizeof(*szPath));
+    }
+    return p;
+}
+
+template<class T> static LOCATIONITEM* BuildLocationList(T **rgszPaths, SIZE_T 
nCount)
+{
+    LOCATIONITEM *pStart = NULL, *pPrev = NULL;
+    for (SIZE_T i = 0; i < nCount; ++i)
+    {
+        LOCATIONITEM *pItem = CreateLocationListItem(rgszPaths[i]);
+        if (!pStart)
+            pStart = pItem;
+        else if (pPrev)
+            pPrev->pNext = pItem;
+        pPrev = pItem;
+        if (!pItem)
+        {
+            FreeList(pStart);
+            return NULL;
+        }
+    }
+    return pStart;
+}
+
+static LOCATIONITEM* GetDesktopLocations()
+{
+    SIZE_T nCount = 0;
+    PCWSTR rgszLocations[2];
+    WCHAR szUser[MAX_PATH], szCommon[MAX_PATH];
+
+    rgszLocations[nCount] = szUser;
+    nCount += !!SHGetSpecialFolderPathW(NULL, szUser, CSIDL_DESKTOPDIRECTORY, 
TRUE);
+    rgszLocations[nCount] = szCommon;
+    nCount += !!SHGetSpecialFolderPathW(NULL, szCommon, 
CSIDL_COMMON_DESKTOPDIRECTORY, TRUE);
+    return BuildLocationList(rgszLocations, nCount);
+}
+
+static LOCATIONITEM* GetLocalDisksLocations()
+{
+    PCWSTR rgszLocations[26];
+    WCHAR rgszDrives[_countof(rgszLocations)][4];
+    UINT nCount = 0;
+    for (UINT i = 0, fDrives = GetLogicalDrives(); i < 
_countof(rgszLocations); ++i)
+    {
+        if (fDrives & (1 << i))
+        {
+            rgszDrives[nCount][0] = 'A' + i;
+            rgszDrives[nCount][1] = ':';
+            rgszDrives[nCount][2] = '\\';
+            rgszDrives[nCount][3] = UNICODE_NULL;
+            UINT fType = GetDriveTypeW(rgszDrives[nCount]);
+            if (fType == DRIVE_FIXED || fType == DRIVE_RAMDISK)
+            {
+                rgszLocations[nCount] = rgszDrives[nCount];
+                nCount++;
+            }
+        }
+    }
+    return BuildLocationList(rgszLocations, nCount);
+}
+
 CSearchBar::CSearchBar() :
     m_pSite(NULL),
+    m_RealItemIndex(0),
     m_bVisible(FALSE)
 {
 }
@@ -194,11 +316,15 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD 
wNotifyCode, WORD wID, HWND hWndC
 
     pSearchStart->SearchHidden = IsDlgButtonChecked(IDC_SEARCH_HIDDEN);
 
-    if (!GetAddressEditBoxPath(pSearchStart->szPath))
+    WCHAR buf[MAX_PATH];
+    pSearchStart->pPaths = GetAddressEditBoxLocations(buf);
+    if (!pSearchStart->pPaths)
     {
-        ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd, 
MAKEINTRESOURCEW(IDS_SEARCHINVALID), MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK | 
MB_ICONERROR, pSearchStart->szPath);
+        ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd, 
MAKEINTRESOURCEW(IDS_SEARCHINVALID),
+                         MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK | 
MB_ICONERROR, buf);
         return 0;
     }
+    ScopedFreeLocationItems FreeLocationsHelper(pSearchStart->pPaths);
 
     // See if we have an szFileName by testing for its entry lenth > 0 and our 
searched FileName does not contain
     // an asterisk or a question mark. If so, then prepend and append an 
asterisk to the searched FileName.
@@ -255,6 +381,7 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, 
WORD wID, HWND hWndC
             return 0;
     }
 
+    FreeLocationsHelper.Detach();
     ::PostMessageW(hwnd, WM_SEARCH_START, 0, (LPARAM) pSearchStart.Detach());
 
     SetSearchInProgress(TRUE);
@@ -272,31 +399,89 @@ LRESULT CSearchBar::OnStopButtonClicked(WORD wNotifyCode, 
WORD wID, HWND hWndCtl
     return 0;
 }
 
-BOOL CSearchBar::GetAddressEditBoxPath(WCHAR *szPath)
+LRESULT CSearchBar::OnLocationEditChange(WORD wNotifyCode, WORD wID, HWND 
hWndCtl, BOOL &bHandled)
 {
+    HWND hComboboxEx = hWndCtl;
+    INT_PTR idx = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0);
+    if (idx < 0)
+        return 0;
+    COMBOBOXEXITEMW item;
+    item.mask = CBEIF_LPARAM;
+    item.iItem = idx;
+    item.cchTextMax = 0;
+    if (!SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item) ||
+        GetSpecial((LPITEMIDLIST)item.lParam) != SPECIAL_BROWSE)
+    {
+        m_RealItemIndex = idx;
+        return 0;
+    }
+
+    idx = max(m_RealItemIndex, 0);
+    SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); // Reset to previous item
+
+    BROWSEINFOW bi = { hComboboxEx };
+    bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
+    if (PIDLIST_ABSOLUTE pidl = SHBrowseForFolderW(&bi))
+    {
+        idx = FindItemInComboEx(hComboboxEx, pidl, ILIsEqual, TRUE);
+        if (idx < 0)
+        {
+            SHFILEINFO shfi;
+            if (SHGetFileInfoW((WCHAR*)pidl, 0, &shfi, sizeof(shfi), 
SHGFI_PIDL | SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX))
+            {
+                item.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_SELECTEDIMAGE | 
CBEIF_IMAGE;
+                item.iItem = -1;
+                item.iImage = item.iSelectedImage = shfi.iIcon;
+                item.pszText = shfi.szDisplayName;
+                item.lParam = (LPARAM)pidl; // IAddressEditBox takes ownership
+                idx = SendMessageW(hComboboxEx, CBEM_INSERTITEMW, 0, 
(LPARAM)&item);
+            }
+        }
+        if (idx >= 0)
+            SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); // Select the 
browsed item
+        else
+            SHFree(pidl);
+    }
+    return 0;
+}
+
+LOCATIONITEM* CSearchBar::GetAddressEditBoxLocations(WCHAR *szPath)
+{
+    WCHAR szItemText[MAX_PATH], *pszPath = szPath;
     HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX);
     ::GetWindowTextW(hComboboxEx, szPath, MAX_PATH);
     INT iSelectedIndex = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0);
     if (iSelectedIndex != CB_ERR)
     {
-        WCHAR szItemText[MAX_PATH];
-        COMBOBOXEXITEMW item = {0};
+        COMBOBOXEXITEMW item;
         item.mask = CBEIF_LPARAM | CBEIF_TEXT;
         item.iItem = iSelectedIndex;
         item.pszText = szItemText;
         item.cchTextMax = _countof(szItemText);
         SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
-
-        if (!wcscmp(szItemText, szPath) && 
SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szItemText))
+        if (!wcscmp(szItemText, szPath))
         {
-            StringCbCopyW(szPath, MAX_PATH * sizeof(WCHAR), szItemText);
-            return TRUE;
+            LPCITEMIDLIST pidl = (LPCITEMIDLIST)item.lParam;
+            CLSID clsid;
+            HRESULT hr = GetClassOfItem(pidl, &clsid);
+            if (SUCCEEDED(hr) && clsid == CLSID_MyComputer)
+                return GetLocalDisksLocations();
+            // TODO: Shell enumerate the network neighborhood if it is chosen
+            if (!pidl || !pidl->mkid.cb)
+                return GetDesktopLocations();
+            if (GetSpecial(pidl) || !SHGetPathFromIDListW(pidl, szItemText))
+                return NULL;
+            pszPath = szItemText;
         }
     }
 
-    DWORD dwAttributes = GetFileAttributesW(szPath);
-    return dwAttributes != INVALID_FILE_ATTRIBUTES
-        && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY);
+    DWORD dwAttributes = GetFileAttributesW(pszPath);
+    if (dwAttributes != INVALID_FILE_ATTRIBUTES && (dwAttributes & 
FILE_ATTRIBUTE_DIRECTORY) &&
+        PathIsAbsolute(pszPath))
+    {
+        return BuildLocationList(&pszPath, 1);
+    }
+    return NULL;
 }
 
 LRESULT CSearchBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled)
@@ -607,30 +792,70 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID 
dispIdMember, REFIID riid, L
         if (FAILED_UNEXPECTEDLY(hResult))
             return hResult;
         HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX);
-        int index = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0);
-        if (index <= 0)
+        INT_PTR count = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0);
+        if (count <= 0)
             return S_OK;
         COMBOBOXEXITEMW item = {0};
         item.mask = CBEIF_LPARAM;
-        item.iItem = index - 1;
+        item.iItem = count - 1;
         SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
         if (!item.lParam)
             return S_OK;
-        CComPtr<IShellFolder> pDesktopFolder;
-        hResult = SHGetDesktopFolder(&pDesktopFolder);
-        if (FAILED_UNEXPECTEDLY(hResult))
-            return hResult;
-        CComPtr<IShellFolder> pShellFolder;
-        hResult = pDesktopFolder->BindToObject((LPCITEMIDLIST)item.lParam, 
NULL, IID_PPV_ARG(IShellFolder, &pShellFolder));
-        if (FAILED(hResult))
-            return S_OK;
         CLSID clsid;
-        hResult = IUnknown_GetClassID(pShellFolder, &clsid);
+        hResult = GetClassOfItem((LPCITEMIDLIST)item.lParam, &clsid);
         if (SUCCEEDED(hResult) && clsid == CLSID_FindFolder)
         {
             SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 0);
             SendMessageW(hComboboxEx, CB_SETCURSEL, 0, 0);
+            // Starting in My Computer is better than just searching the 
desktop folder
+            PIDLIST_ABSOLUTE pidl;
+            if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, 
&pidl)))
+            {
+                INT_PTR idx = FindItemInComboEx(hComboboxEx, pidl, ILIsEqual, 
TRUE);
+                if (idx >= 0)
+                    SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0);
+                SHFree(pidl);
+            }
+        }
+
+        // Remove all non-filesystem items since we currently use 
FindFirstFile to search
+        BOOL fFoundBrowse = FALSE;
+        for (item.iItem = 0; SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, 
(LPARAM)&item); item.iItem++)
+        {
+            LPCITEMIDLIST pidl = (LPCITEMIDLIST)item.lParam;
+            BYTE special = GetSpecial(pidl);
+            fFoundBrowse |= special == SPECIAL_BROWSE;
+            if (special)
+                continue;
+            const UINT fQuery = SFGAO_FILESYSTEM | SFGAO_FILESYSANCESTOR;
+            SHFILEINFO shfi;
+            shfi.dwAttributes = fQuery;
+            if (SHGetFileInfoW((WCHAR*)pidl, 0, &shfi, sizeof(shfi), 
SHGFI_PIDL | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED))
+            {
+                if (!(shfi.dwAttributes & fQuery))
+                {
+                    if (SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 
0) != CB_ERR)
+                        item.iItem--;
+                }
+            }
         }
+
+        // Add our custom Browse item
+        if (!fFoundBrowse)
+        {
+            WCHAR buf[200];
+            item.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT;
+            item.iItem = -1;
+            item.iIndent = -2; // Remove space reserved for the non-existing 
item icon
+            item.lParam = (LPARAM)ILClone((LPITEMIDLIST)&g_pidlBrowseDir);
+            item.pszText = const_cast<PWSTR>(L"...");
+            #define IDS_SEARCH_BROWSEITEM 10244 /* shell32 shresdef.h */
+            if (LoadStringW(GetModuleHandleW(L"SHELL32"), 
IDS_SEARCH_BROWSEITEM, buf, _countof(buf)))
+                item.pszText = buf;
+            if (item.lParam)
+                SendMessageW(hComboboxEx, CBEM_INSERTITEMW, 0, (LPARAM)&item);
+        }
+
         return S_OK;
     }
     case DISPID_SEARCHCOMPLETE:
diff --git a/dll/win32/browseui/shellfind/CSearchBar.h 
b/dll/win32/browseui/shellfind/CSearchBar.h
index 0a4ead4d307..0e3710152f1 100644
--- a/dll/win32/browseui/shellfind/CSearchBar.h
+++ b/dll/win32/browseui/shellfind/CSearchBar.h
@@ -24,10 +24,11 @@ private:
     // *** BaseBarSite information ***
     CComPtr<IUnknown> m_pSite;
     CComPtr<IAddressEditBox> m_AddressEditBox;
+    INT_PTR m_RealItemIndex;
     BOOL m_bVisible;
 
     HRESULT GetSearchResultsFolder(IShellBrowser **ppShellBrowser, HWND 
*pHwnd, IShellFolder **ppShellFolder);
-    BOOL GetAddressEditBoxPath(WCHAR *szPath);
+    LOCATIONITEM* GetAddressEditBoxLocations(WCHAR *szPath);
     void SetSearchInProgress(BOOL bInProgress);
     HRESULT TrySubscribeToSearchEvents();
     void TrySetFocus(UINT Source);
@@ -37,6 +38,7 @@ private:
     LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
     LRESULT OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, 
BOOL &bHandled);
     LRESULT OnStopButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL 
&bHandled);
+    LRESULT OnLocationEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, 
BOOL &bHandled);
     LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
 
 public:
@@ -105,5 +107,6 @@ public:
         MESSAGE_HANDLER(WM_SIZE, OnSize)
         COMMAND_HANDLER(IDC_SEARCH_BUTTON, BN_CLICKED, OnSearchButtonClicked)
         COMMAND_HANDLER(IDC_SEARCH_STOP_BUTTON, BN_CLICKED, 
OnStopButtonClicked)
+        COMMAND_HANDLER(IDC_SEARCH_COMBOBOX, CBN_EDITCHANGE, 
OnLocationEditChange)
     END_MSG_MAP()
 };
diff --git a/dll/win32/browseui/shellfind/shellfind.h 
b/dll/win32/browseui/shellfind/shellfind.h
index 93256cb7970..1f42f99d7c1 100644
--- a/dll/win32/browseui/shellfind/shellfind.h
+++ b/dll/win32/browseui/shellfind/shellfind.h
@@ -31,12 +31,58 @@
 #define WM_SEARCH_ADD_RESULT     WM_USER + 2
 #define WM_SEARCH_UPDATE_STATUS  WM_USER + 3
 
+typedef struct tagLOCATIONITEM
+{
+    struct tagLOCATIONITEM *pNext;
+    WCHAR szPath[ANYSIZE_ARRAY];
+} LOCATIONITEM;
+
+void FreeList(LOCATIONITEM *pLI);
+
+struct ScopedFreeLocationItems
+{
+    LOCATIONITEM *m_ptr;
+    ScopedFreeLocationItems(LOCATIONITEM *ptr) : m_ptr(ptr) {}
+    ~ScopedFreeLocationItems() { FreeList(m_ptr); }
+    void Detach() { m_ptr = NULL; }
+};
+
 struct SearchStart
 {
-    WCHAR szPath[MAX_PATH];
+    LOCATIONITEM *pPaths;
     WCHAR szFileName[MAX_PATH];
     WCHAR szQuery[MAX_PATH];
     BOOL  SearchHidden;
 };
 
+template<class T, class F, class R>
+static INT_PTR FindItemInComboEx(HWND hCombo, T &FindItem, F CompareFunc, R 
RetMatch)
+{
+    COMBOBOXEXITEMW item;
+    item.mask = CBEIF_LPARAM;
+    item.cchTextMax = 0;
+    for (item.iItem = 0; SendMessageW(hCombo, CBEM_GETITEMW, 0, 
(LPARAM)&item); item.iItem++)
+    {
+        if (CompareFunc((T&)item.lParam, FindItem) == RetMatch)
+            return item.iItem;
+    }
+    return -1;
+}
+
+static inline bool PathIsOnDrive(PCWSTR Path)
+{
+    return PathGetDriveNumberW(Path) >= 0 && (Path[2] == '\\' || !Path[2]);
+}
+
+static inline BOOL PathIsOnUnc(PCWSTR Path)
+{
+    return PathIsUNCW(Path); // FIXME: Verify the path starts with 
<\\Server\Share>[\]
+}
+
+static inline bool PathIsAbsolute(PCWSTR Path)
+{
+    // Note: PathIsRelativeW is too forgiving
+    return PathIsOnDrive(Path) || PathIsOnUnc(Path);
+}
+
 #endif /* _SHELLFIND_PCH_ */
diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc
index a6f1ec66737..ffa7fa93d77 100644
--- a/dll/win32/shell32/lang/bg-BG.rc
+++ b/dll/win32/shell32/lang/bg-BG.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Обзор..."
+
     IDS_TITLE_MYCOMP "Моят компютър"
     IDS_TITLE_MYNET "Моята мрежа"
     IDS_TITLE_BIN_1 "Кошче (пълно)"
diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc
index 50088b84052..e8f729c7c9e 100644
--- a/dll/win32/shell32/lang/ca-ES.rc
+++ b/dll/win32/shell32/lang/ca-ES.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Browse..."
+
     IDS_TITLE_MYCOMP "My Computer"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc
index 744d8c727a7..9a2a3ebec95 100644
--- a/dll/win32/shell32/lang/cs-CZ.rc
+++ b/dll/win32/shell32/lang/cs-CZ.rc
@@ -1006,6 +1006,8 @@ BEGIN
     IDS_OBJECTS "Položek: %d"
     IDS_OBJECTS_SELECTED "Položek vybráno: %d"
 
+    IDS_SEARCH_BROWSEITEM "Procházet..."
+
     IDS_TITLE_MYCOMP "Tento počítač"
     IDS_TITLE_MYNET "Místa v síti"
     IDS_TITLE_BIN_1 "Koš (plný)"
diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc
index 7cb598194ad..46bc8854b97 100644
--- a/dll/win32/shell32/lang/da-DK.rc
+++ b/dll/win32/shell32/lang/da-DK.rc
@@ -1005,6 +1005,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Gennemse..."
+
     IDS_TITLE_MYCOMP "Min Computer"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc
index ecb87154a4b..1270e5c1702 100644
--- a/dll/win32/shell32/lang/de-DE.rc
+++ b/dll/win32/shell32/lang/de-DE.rc
@@ -999,6 +999,8 @@ BEGIN
     IDS_OBJECTS "%d Objekte"
     IDS_OBJECTS_SELECTED "%d Objekte ausgewählt"
 
+    IDS_SEARCH_BROWSEITEM "Durchsuchen..."
+
     IDS_TITLE_MYCOMP "Arbeitsplatz"
     IDS_TITLE_MYNET "Netzwerkumgebung"
     IDS_TITLE_BIN_1 "Papierkorb (voll)"
diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc
index e26cab3ff42..906192f80db 100644
--- a/dll/win32/shell32/lang/el-GR.rc
+++ b/dll/win32/shell32/lang/el-GR.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Αναζήτηση..."
+
     IDS_TITLE_MYCOMP "Ο υπολογιστής μου"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Κάδος ανακύκλωσης (γεμάτος)"
diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc
index 5c7426cba73..acc08e4f3bd 100644
--- a/dll/win32/shell32/lang/en-GB.rc
+++ b/dll/win32/shell32/lang/en-GB.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Browse..."
+
     IDS_TITLE_MYCOMP "My Computer"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc
index be1df9decac..46a403aa4d6 100644
--- a/dll/win32/shell32/lang/en-US.rc
+++ b/dll/win32/shell32/lang/en-US.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Browse..."
+
     IDS_TITLE_MYCOMP "My Computer"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc
index 0d4e112eada..8d515c6cbc0 100644
--- a/dll/win32/shell32/lang/es-ES.rc
+++ b/dll/win32/shell32/lang/es-ES.rc
@@ -1007,6 +1007,8 @@ BEGIN
     IDS_OBJECTS "%d elementos"
     IDS_OBJECTS_SELECTED "%d elementos seleccionados"
 
+    IDS_SEARCH_BROWSEITEM "Examinar..."
+
     IDS_TITLE_MYCOMP "Mi equipo"
     IDS_TITLE_MYNET "Mis sitios de red"
     IDS_TITLE_BIN_1 "Papelera (llena)"
diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc
index 67324abb2da..35a11ea9b6e 100644
--- a/dll/win32/shell32/lang/et-EE.rc
+++ b/dll/win32/shell32/lang/et-EE.rc
@@ -1005,6 +1005,8 @@ BEGIN
     IDS_OBJECTS "%d objekti"
     IDS_OBJECTS_SELECTED "%d objekti valitud"
 
+    IDS_SEARCH_BROWSEITEM "Sirvi..."
+
     IDS_TITLE_MYCOMP "Minu arvuti"
     IDS_TITLE_MYNET "Minu võrgukohad"
     IDS_TITLE_BIN_1 "Prügikast (täis)"
diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc
index 0eb4c03261c..9ce6a760948 100644
--- a/dll/win32/shell32/lang/eu-ES.rc
+++ b/dll/win32/shell32/lang/eu-ES.rc
@@ -1003,6 +1003,8 @@ BEGIN
     IDS_OBJECTS "%d elementuak"
     IDS_OBJECTS_SELECTED "%d elementu hautatuak"
 
+    IDS_SEARCH_BROWSEITEM "Arakatu..."
+
     IDS_TITLE_MYCOMP "Ordenagailua"
     IDS_TITLE_MYNET "Nire sarelekuak"
     IDS_TITLE_BIN_1 "Zakarrontzia (betea)"
diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc
index 1d7a4be529f..0743841d7e3 100644
--- a/dll/win32/shell32/lang/fi-FI.rc
+++ b/dll/win32/shell32/lang/fi-FI.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Selaa..."
+
     IDS_TITLE_MYCOMP "Oma Tietokone"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc
index c38a47692fb..fbd939d7941 100644
--- a/dll/win32/shell32/lang/fr-FR.rc
+++ b/dll/win32/shell32/lang/fr-FR.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d objet(s)"
     IDS_OBJECTS_SELECTED "%d objet(s) sélectionné(s)"
 
+    IDS_SEARCH_BROWSEITEM "Parcourir..."
+
     IDS_TITLE_MYCOMP "Poste de travail"
     IDS_TITLE_MYNET "Mon réseau"
     IDS_TITLE_BIN_1 "Corbeille (pleine)"
diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc
index 5f3bd630847..4ae2969e694 100644
--- a/dll/win32/shell32/lang/he-IL.rc
+++ b/dll/win32/shell32/lang/he-IL.rc
@@ -1005,6 +1005,9 @@ BEGIN
     IDS_OBJECTS "%d פריטים"
     IDS_OBJECTS_SELECTED "%d פריטים נבחרו"
 
+    IDS_SEARCH_BROWSEITEM "עיון..."
+
+
     IDS_TITLE_MYCOMP "המחשב שלי"
     IDS_TITLE_MYNET "מיקומי הרשת שלי"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc
index 8a6ed3d42b3..fc38faac4f1 100644
--- a/dll/win32/shell32/lang/hi-IN.rc
+++ b/dll/win32/shell32/lang/hi-IN.rc
@@ -1000,6 +1000,8 @@ BEGIN
     IDS_OBJECTS "%d वस्तुओं"
     IDS_OBJECTS_SELECTED "%d वस्तुओं का चयन किया"
 
+    IDS_SEARCH_BROWSEITEM "ब्राउज़ करें..."
+
     IDS_TITLE_MYCOMP "मेरा कंप्यूटर"
     IDS_TITLE_MYNET "मेरे नेटवर्क स्थान"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc
index dca369f41aa..28a7923bb29 100644
--- a/dll/win32/shell32/lang/hu-HU.rc
+++ b/dll/win32/shell32/lang/hu-HU.rc
@@ -997,6 +997,8 @@ BEGIN
     IDS_OBJECTS "%d elem"
     IDS_OBJECTS_SELECTED "%d kijelölt elem"
 
+    IDS_SEARCH_BROWSEITEM "Böngészés..."
+
     IDS_TITLE_MYCOMP "Számítógép"
     IDS_TITLE_MYNET "Hálózati helyek"
     IDS_TITLE_BIN_1 "Lomtár (tele)"
diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc
index 14851b34ba0..50250ed016b 100644
--- a/dll/win32/shell32/lang/id-ID.rc
+++ b/dll/win32/shell32/lang/id-ID.rc
@@ -995,6 +995,8 @@ BEGIN
     IDS_OBJECTS "%d Obyek"
     IDS_OBJECTS_SELECTED "%d Obyek terpilih"
 
+    IDS_SEARCH_BROWSEITEM "Jelajah..."
+
     IDS_TITLE_MYCOMP "Komputer Saya"
     IDS_TITLE_MYNET "Tempat Jaringan Saya"
     IDS_TITLE_BIN_1 "Tampungan Daur Ulang (penuh)"
diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc
index 2f06fb39638..889df335f8a 100644
--- a/dll/win32/shell32/lang/it-IT.rc
+++ b/dll/win32/shell32/lang/it-IT.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Oggetti"
     IDS_OBJECTS_SELECTED "%d Oggetti selezionati"
 
+    IDS_SEARCH_BROWSEITEM "Esplora..."
+
     IDS_TITLE_MYCOMP "Risorse del Computer"
     IDS_TITLE_MYNET "Risorse di rete"
     IDS_TITLE_BIN_1 "Cestino (pieno)"
diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc
index b4002272715..a186027c5fe 100644
--- a/dll/win32/shell32/lang/ja-JP.rc
+++ b/dll/win32/shell32/lang/ja-JP.rc
@@ -995,6 +995,8 @@ BEGIN
     IDS_OBJECTS "%d 個のオブジェクト"
     IDS_OBJECTS_SELECTED "%d 個のオブジェクトが選択済み"
 
+    IDS_SEARCH_BROWSEITEM "参照..."
+
     IDS_TITLE_MYCOMP "マイ コンピュータ"
     IDS_TITLE_MYNET "マイ ネットワーク"
     IDS_TITLE_BIN_1 "ごみ箱 (いっぱい)"
diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc
index b702a01f108..d6a31a17bdb 100644
--- a/dll/win32/shell32/lang/ko-KR.rc
+++ b/dll/win32/shell32/lang/ko-KR.rc
@@ -1005,6 +1005,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "찾아보기..."
+
     IDS_TITLE_MYCOMP "내 컴퓨터"
     IDS_TITLE_MYNET "내 네트워크 환경"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc
index 4ffb90d81eb..82d22450c87 100644
--- a/dll/win32/shell32/lang/nl-NL.rc
+++ b/dll/win32/shell32/lang/nl-NL.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Bladeren..."
+
     IDS_TITLE_MYCOMP "My Computer"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc
index c0f8bd18da8..0321417fb24 100644
--- a/dll/win32/shell32/lang/no-NO.rc
+++ b/dll/win32/shell32/lang/no-NO.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Bla gjennom..."
+
     IDS_TITLE_MYCOMP "Min datamaskin"
     IDS_TITLE_MYNET "Mine nettverkssteder"
     IDS_TITLE_BIN_1 "Papirkurv (full)"
diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc
index e495ffef72b..1614266d238 100644
--- a/dll/win32/shell32/lang/pl-PL.rc
+++ b/dll/win32/shell32/lang/pl-PL.rc
@@ -1007,6 +1007,8 @@ BEGIN
     IDS_OBJECTS "Elementów: %d"
     IDS_OBJECTS_SELECTED "Zaznaczonych elementów: %d"
 
+    IDS_SEARCH_BROWSEITEM "Przeglądaj..."
+
     IDS_TITLE_MYCOMP "Mój komputer"
     IDS_TITLE_MYNET "Moje miejsca sieciowe"
     IDS_TITLE_BIN_1 "Kosz (pełny)"
diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc
index 16d1422681e..0b5c46f359f 100644
--- a/dll/win32/shell32/lang/pt-BR.rc
+++ b/dll/win32/shell32/lang/pt-BR.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Procurar..."
+
     IDS_TITLE_MYCOMP "Meu Computador"
     IDS_TITLE_MYNET "Meus Locais de Rede"
     IDS_TITLE_BIN_1 "Lixeira (cheia)"
diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc
index 2236d5c1dae..d606c701112 100644
--- a/dll/win32/shell32/lang/pt-PT.rc
+++ b/dll/win32/shell32/lang/pt-PT.rc
@@ -1007,6 +1007,8 @@ BEGIN
     IDS_OBJECTS "%d Objectos"
     IDS_OBJECTS_SELECTED "%d Objectos seleccionados"
 
+    IDS_SEARCH_BROWSEITEM "Procurar..."
+
     IDS_TITLE_MYCOMP "O Meu Computador"
     IDS_TITLE_MYNET "Os Meus Locais na Rede"
     IDS_TITLE_BIN_1 "Reciclagem (cheia)"
diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc
index 35ba49334c8..c5109abb36d 100644
--- a/dll/win32/shell32/lang/ro-RO.rc
+++ b/dll/win32/shell32/lang/ro-RO.rc
@@ -1006,6 +1006,8 @@ BEGIN
     IDS_OBJECTS "%d Obiecte"
     IDS_OBJECTS_SELECTED "%d Obiecte selectate"
 
+    IDS_SEARCH_BROWSEITEM "Răsfoire..."
+
     IDS_TITLE_MYCOMP "Computerul meu"
     IDS_TITLE_MYNET "Locaţii în reţea"
     IDS_TITLE_BIN_1 "Coş de reciclare (plin)"
diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc
index 773dde053f5..f81a82b00da 100644
--- a/dll/win32/shell32/lang/ru-RU.rc
+++ b/dll/win32/shell32/lang/ru-RU.rc
@@ -1007,6 +1007,8 @@ BEGIN
     IDS_OBJECTS "Объектов: %d"
     IDS_OBJECTS_SELECTED "Выделено объектов: %d"
 
+    IDS_SEARCH_BROWSEITEM "Обзор..."
+
     IDS_TITLE_MYCOMP "Мой компьютер"
     IDS_TITLE_MYNET "Сетевое окружение"
     IDS_TITLE_BIN_1 "Корзина (полная)"
diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc
index 59bb8bf6097..e17019cd76d 100644
--- a/dll/win32/shell32/lang/sk-SK.rc
+++ b/dll/win32/shell32/lang/sk-SK.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Prehľadávať..."
+
     IDS_TITLE_MYCOMP "Tento počítač"
     IDS_TITLE_MYNET "Miesta v sieti"
     IDS_TITLE_BIN_1 "Kôš (plný)"
diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc
index 40013522a90..17b3d7d9bee 100644
--- a/dll/win32/shell32/lang/sl-SI.rc
+++ b/dll/win32/shell32/lang/sl-SI.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Prebrskaj..."
+
     IDS_TITLE_MYCOMP "My Computer"
     IDS_TITLE_MYNET "My Network Places"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc
index fcf87e2f734..6915235b1b3 100644
--- a/dll/win32/shell32/lang/sq-AL.rc
+++ b/dll/win32/shell32/lang/sq-AL.rc
@@ -1005,6 +1005,8 @@ BEGIN
     IDS_OBJECTS "%d Objects"
     IDS_OBJECTS_SELECTED "%d Objects Selected"
 
+    IDS_SEARCH_BROWSEITEM "Shfleto..."
+
     IDS_TITLE_MYCOMP "Kompjuteri Im"
     IDS_TITLE_MYNET "Vendi Rrjetit Tim"
     IDS_TITLE_BIN_1 "Plehra (plot)"
diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc
index 9d5486e743d..9628f301240 100644
--- a/dll/win32/shell32/lang/sv-SE.rc
+++ b/dll/win32/shell32/lang/sv-SE.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d objekt"
     IDS_OBJECTS_SELECTED "%d markerade objekt"
 
+    IDS_SEARCH_BROWSEITEM "Bläddra..."
+
     IDS_TITLE_MYCOMP "Den här datorn"
     IDS_TITLE_MYNET "Mina nätverksplatser"
     IDS_TITLE_BIN_1 "Papperskorgen (full)"
diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc
index 2d52e60d51d..04a16690660 100644
--- a/dll/win32/shell32/lang/tr-TR.rc
+++ b/dll/win32/shell32/lang/tr-TR.rc
@@ -1007,6 +1007,8 @@ BEGIN
     IDS_OBJECTS "%d Nesne"
     IDS_OBJECTS_SELECTED "%d Nesne Seçili"
 
+    IDS_SEARCH_BROWSEITEM "Gözat..."
+
     IDS_TITLE_MYCOMP "Bilgisayarım"
     IDS_TITLE_MYNET "Ağ Bağlantılarım"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc
index 853f4041a02..0a943e91999 100644
--- a/dll/win32/shell32/lang/uk-UA.rc
+++ b/dll/win32/shell32/lang/uk-UA.rc
@@ -998,6 +998,8 @@ BEGIN
     IDS_OBJECTS "%d об'єктів"
     IDS_OBJECTS_SELECTED "Обрано %d об'єктів"
 
+    IDS_SEARCH_BROWSEITEM "Огляд..."
+
     IDS_TITLE_MYCOMP "Мій комп'ютер"
     IDS_TITLE_MYNET "Мережне оточення"
     IDS_TITLE_BIN_1 "Кошик (повний)"
diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc
index 3d58230cc58..6685c210944 100644
--- a/dll/win32/shell32/lang/zh-CN.rc
+++ b/dll/win32/shell32/lang/zh-CN.rc
@@ -1008,6 +1008,8 @@ BEGIN
     IDS_OBJECTS "%d 个对象"
     IDS_OBJECTS_SELECTED "已选中 %d 个对象"
 
+    IDS_SEARCH_BROWSEITEM "浏览..."
+
     IDS_TITLE_MYCOMP "我的电脑"
     IDS_TITLE_MYNET "网上邻居"
     IDS_TITLE_BIN_1 "回收站(满)"
diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc
index e4700b57e72..dd7d89bef55 100644
--- a/dll/win32/shell32/lang/zh-HK.rc
+++ b/dll/win32/shell32/lang/zh-HK.rc
@@ -1006,6 +1006,8 @@ BEGIN
     IDS_OBJECTS "%d 個物件"
     IDS_OBJECTS_SELECTED "已選擇 %d 個物件"
 
+    IDS_SEARCH_BROWSEITEM "瀏覽..."
+
     IDS_TITLE_MYCOMP "我的電腦"
     IDS_TITLE_MYNET "網絡上的芳鄰"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc
index 2bc2ea7d49f..7d5a8e2b402 100644
--- a/dll/win32/shell32/lang/zh-TW.rc
+++ b/dll/win32/shell32/lang/zh-TW.rc
@@ -1007,6 +1007,8 @@ BEGIN
     IDS_OBJECTS "%d 個物件"
     IDS_OBJECTS_SELECTED "已選擇 %d 個物件"
 
+    IDS_SEARCH_BROWSEITEM "瀏覽..."
+
     IDS_TITLE_MYCOMP "我的電腦"
     IDS_TITLE_MYNET "網路上的芳鄰"
     IDS_TITLE_BIN_1 "Recycle Bin (full)"
diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h
index d4c8422d29a..cc9a651da93 100644
--- a/dll/win32/shell32/shresdef.h
+++ b/dll/win32/shell32/shresdef.h
@@ -282,6 +282,10 @@
 #define IDS_OBJECTS                6466
 #define IDS_OBJECTS_SELECTED       6477
 
+/* Explorer file search */
+#define IDS_SEARCH_LOCALDRIVES     10241
+#define IDS_SEARCH_BROWSEITEM      10244
+
 /* Desktop icon titles */
 #define IDS_TITLE_MYCOMP                            30386
 #define IDS_TITLE_MYNET                             30387

Reply via email to