From 73b019a390b030882e76fb208961441496b745d4 Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Mon, 21 Apr 2025 23:16:59 +0200 Subject: [PATCH] [SHELL32] Respect the REST_NODRIVES restriction (#7907) This is the "My Computer => Drives" setting in TweakUI. --- dll/win32/shell32/CDefView.cpp | 5 ++-- dll/win32/shell32/folders/CDrivesFolder.cpp | 29 ++++++++++++++++----- dll/win32/shell32/folders/CDrivesFolder.h | 2 +- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/dll/win32/shell32/CDefView.cpp b/dll/win32/shell32/CDefView.cpp index 953d7f133d3..b74d5203652 100644 --- a/dll/win32/shell32/CDefView.cpp +++ b/dll/win32/shell32/CDefView.cpp @@ -2923,8 +2923,8 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & ERR("hLock == NULL\n"); return FALSE; } - - TRACE("(%p)(%p,%p,%p)\n", this, Pidls[0], Pidls[1], lParam); + lEvent &= ~SHCNE_INTERRUPT; + TRACE("(%p)(%p,%p,%p) %#x\n", this, Pidls[0], Pidls[1], lParam, lEvent); if (_DoFolderViewCB(SFVM_FSNOTIFY, (WPARAM)Pidls, lEvent) == S_FALSE) { @@ -2934,7 +2934,6 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & // Translate child IDLs. // SHSimpleIDListFromPathW creates fake PIDLs (lacking some attributes) - lEvent &= ~SHCNE_INTERRUPT; HRESULT hr; PITEMID_CHILD child0 = NULL, child1 = NULL; CComHeapPtr pidl0Temp, pidl1Temp; diff --git a/dll/win32/shell32/folders/CDrivesFolder.cpp b/dll/win32/shell32/folders/CDrivesFolder.cpp index 5fcf9d94a7e..c4e76121a91 100644 --- a/dll/win32/shell32/folders/CDrivesFolder.cpp +++ b/dll/win32/shell32/folders/CDrivesFolder.cpp @@ -563,14 +563,12 @@ class CDrivesFolderEnum : if (dwFlags & SHCONTF_FOLDERS) { WCHAR wszDriveName[] = {'A', ':', '\\', '\0'}; - DWORD dwDrivemap = GetLogicalDrives(); - - while (wszDriveName[0] <= 'Z') + DWORD dwDrivemap = GetLogicalDrives() & ~SHRestricted(REST_NODRIVES); + for (; wszDriveName[0] <= 'Z'; wszDriveName[0]++) { - if(dwDrivemap & 0x00000001L) + if (dwDrivemap & 1) AddToEnumList(_ILCreateDrive(wszDriveName)); - wszDriveName[0]++; - dwDrivemap = dwDrivemap >> 1; + dwDrivemap >>= 1; } } @@ -1284,6 +1282,25 @@ HRESULT WINAPI CDrivesFolder::ShouldShow(IShellFolder *psf, PCIDLIST_ABSOLUTE pi return S_OK; } +/************************************************************************** + * CDrivesFolder::MessageSFVCB (IShellFolderViewCB) + */ +STDMETHODIMP CDrivesFolder::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case SFVM_FSNOTIFY: + if (lParam == SHCNE_DRIVEADD && wParam) + { + INT8 drive = GetDriveNumber(((PIDLIST_ABSOLUTE*)wParam)[0]); + if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES))) + return S_FALSE; + } + break; + } + return E_NOTIMPL; +} + /************************************************************************/ /* IContextMenuCB interface */ diff --git a/dll/win32/shell32/folders/CDrivesFolder.h b/dll/win32/shell32/folders/CDrivesFolder.h index 74cb2bef455..61bfa9be956 100644 --- a/dll/win32/shell32/folders/CDrivesFolder.h +++ b/dll/win32/shell32/folders/CDrivesFolder.h @@ -79,7 +79,7 @@ class CDrivesFolder : STDMETHOD(CallBack)(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override; // IShellFolderViewCB - STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override { return E_NOTIMPL; } + STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override; // IFolderFilter STDMETHOD(ShouldShow)(IShellFolder *psf, PCIDLIST_ABSOLUTE pidlFolder, PCUITEMID_CHILD pidlItem) override;