[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"); ERR("hLock == NULL\n");
return FALSE; return FALSE;
} }
lEvent &= ~SHCNE_INTERRUPT;
TRACE("(%p)(%p,%p,%p)\n", this, Pidls[0], Pidls[1], lParam); TRACE("(%p)(%p,%p,%p) %#x\n", this, Pidls[0], Pidls[1], lParam, lEvent);
if (_DoFolderViewCB(SFVM_FSNOTIFY, (WPARAM)Pidls, lEvent) == S_FALSE) 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. // Translate child IDLs.
// SHSimpleIDListFromPathW creates fake PIDLs (lacking some attributes) // SHSimpleIDListFromPathW creates fake PIDLs (lacking some attributes)
lEvent &= ~SHCNE_INTERRUPT;
HRESULT hr; HRESULT hr;
PITEMID_CHILD child0 = NULL, child1 = NULL; PITEMID_CHILD child0 = NULL, child1 = NULL;
CComHeapPtr<ITEMIDLIST_RELATIVE> pidl0Temp, pidl1Temp; CComHeapPtr<ITEMIDLIST_RELATIVE> pidl0Temp, pidl1Temp;

View file

@ -563,14 +563,12 @@ class CDrivesFolderEnum :
if (dwFlags & SHCONTF_FOLDERS) if (dwFlags & SHCONTF_FOLDERS)
{ {
WCHAR wszDriveName[] = {'A', ':', '\\', '\0'}; WCHAR wszDriveName[] = {'A', ':', '\\', '\0'};
DWORD dwDrivemap = GetLogicalDrives(); DWORD dwDrivemap = GetLogicalDrives() & ~SHRestricted(REST_NODRIVES);
for (; wszDriveName[0] <= 'Z'; wszDriveName[0]++)
while (wszDriveName[0] <= 'Z')
{ {
if(dwDrivemap & 0x00000001L) if (dwDrivemap & 1)
AddToEnumList(_ILCreateDrive(wszDriveName)); AddToEnumList(_ILCreateDrive(wszDriveName));
wszDriveName[0]++; dwDrivemap >>= 1;
dwDrivemap = dwDrivemap >> 1;
} }
} }
@ -1284,6 +1282,25 @@ HRESULT WINAPI CDrivesFolder::ShouldShow(IShellFolder *psf, PCIDLIST_ABSOLUTE pi
return S_OK; 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 */ /* 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; STDMETHOD(CallBack)(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override;
// IShellFolderViewCB // IShellFolderViewCB
STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override { return E_NOTIMPL; } STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override;
// IFolderFilter // IFolderFilter
STDMETHOD(ShouldShow)(IShellFolder *psf, PCIDLIST_ABSOLUTE pidlFolder, PCUITEMID_CHILD pidlItem) override; STDMETHOD(ShouldShow)(IShellFolder *psf, PCIDLIST_ABSOLUTE pidlFolder, PCUITEMID_CHILD pidlItem) override;