[SHELL32] Respect the REST_NODRIVES restriction (#7907)

This is the "My Computer => Drives" setting in TweakUI.
This commit is contained in:
Whindmar Saksit 2025-04-21 23:16:59 +02:00 committed by GitHub
parent fb6191b71a
commit 73b019a390
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 26 additions and 10 deletions

View file

@ -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<ITEMIDLIST_RELATIVE> pidl0Temp, pidl1Temp;

View file

@ -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 */

View file

@ -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;