ReactOS 0.4.16-dev-1025-gd3456f5
CDrivesFolder Class Reference

#include <CDrivesFolder.h>

Inheritance diagram for CDrivesFolder:
Collaboration diagram for CDrivesFolder:

Public Member Functions

 CDrivesFolder ()
 
 ~CDrivesFolder ()
 
HRESULT WINAPI FinalConstruct ()
 
STDMETHOD() ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
 
STDMETHOD() EnumObjects (HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
 
STDMETHOD() BindToObject (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() BindToStorage (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() CompareIDs (LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
 
STDMETHOD() CreateViewObject (HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() GetAttributesOf (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
 
STDMETHOD() GetUIObjectOf (HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
 
STDMETHOD() GetDisplayNameOf (PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
 
STDMETHOD() SetNameOf (HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
 
STDMETHOD() GetDefaultSearchGUID (GUID *pguid) override
 
STDMETHOD() EnumSearches (IEnumExtraSearch **ppenum) override
 
STDMETHOD() GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
 
STDMETHOD() GetDefaultColumnState (UINT iColumn, DWORD *pcsFlags) override
 
STDMETHOD() GetDetailsEx (PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
 
STDMETHOD() GetDetailsOf (PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
 
STDMETHOD() MapColumnToSCID (UINT column, SHCOLUMNID *pscid) override
 
STDMETHOD() GetClassID (CLSID *lpClassId) override
 
STDMETHOD() Initialize (PCIDLIST_ABSOLUTE pidl) override
 
STDMETHOD() GetCurFolder (PIDLIST_ABSOLUTE *pidl) override
 
STDMETHOD() CallBack (IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
 
STDMETHODIMP MessageSFVCB (UINT uMsg, WPARAM wParam, LPARAM lParam) override
 
STDMETHOD() ShouldShow (IShellFolder *psf, PCIDLIST_ABSOLUTE pidlFolder, PCUITEMID_CHILD pidlItem) override
 
STDMETHODIMP GetEnumFlags (IShellFolder *, PCIDLIST_ABSOLUTE, HWND *, DWORD *) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
HRESULT GetDefaultSearchGUID ([out] GUID *lpguid)
 
HRESULT EnumSearches ([out] IEnumExtraSearch **ppenum)
 
HRESULT GetDefaultColumn ([in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay)
 
HRESULT GetDefaultColumnState ([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
 
HRESULT GetDetailsEx ([in] PCUITEMID_CHILD pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv)
 
HRESULT GetDetailsOf ([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
 
HRESULT MapColumnToSCID ([in] UINT iColumn, [in] SHCOLUMNID *pscid)
 
- Public Member Functions inherited from IShellFolder
HRESULT ParseDisplayName ([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
 
HRESULT EnumObjects ([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
 
HRESULT BindToObject ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT BindToStorage ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj)
 
HRESULT CompareIDs ([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
 
HRESULT CreateViewObject ([in] HWND hwndOwner, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetAttributesOf ([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
 
HRESULT GetUIObjectOf ([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetDisplayNameOf ([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
 
HRESULT SetNameOf ([in] HWND hwnd, [in] PCUITEMID_CHILD pidl, [in, string] LPCOLESTR lpszName, [in] SHGDNF uFlags, [out] PITEMID_CHILD *ppidlOut)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
HRESULT GetCurFolder ([out] PIDLIST_ABSOLUTE *ppidl)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidl)
 
HRESULT GetClassID ([out] CLSID *pClassID)
 
HRESULT CallBack ([in] IShellFolder *psf, [in] HWND hwndOwner, [in] IDataObject *pdtobj, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam)
 
HRESULT ShouldShow ([in] IShellFolder *psf, [in, unique] PCIDLIST_ABSOLUTE pidlFolder, [in] PCUITEMID_CHILD pidlItem)
 
HRESULT GetEnumFlags ([in] IShellFolder *psf, [in] PCIDLIST_ABSOLUTE pidlFolder, [out] HWND *phwnd, [in, out] DWORD *pgrfFlags)
 

Static Public Member Functions

static HRESULT SetDriveLabel (HWND hwndOwner, PCWSTR DrivePath, PCWSTR Label)
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Private Attributes

LPITEMIDLIST pidlRoot
 
CComPtr< IShellFolder2m_regFolder
 
INT8 m_DriveDisplayMode
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNIDLPSHCOLUMNID
 
typedef const SHCOLUMNIDLPCSHCOLUMNID
 
- Public Types inherited from IShellFolder
enum  tagSHGDN {
  SHGDN_NORMAL = 0 , SHGDN_INFOLDER = 1 , SHGDN_FOREDITING = 0x1000 , SHGDN_INCLUDE_NONFILESYS = 0x2000 ,
  SHGDN_FORADDRESSBAR = 0x4000 , SHGDN_FORPARSING = 0x8000
}
 
enum  tagSHCONTF {
  SHCONTF_FOLDERS = 32 , SHCONTF_NONFOLDERS = 64 , SHCONTF_INCLUDEHIDDEN = 128 , SHCONTF_INIT_ON_FIRST_NEXT = 256 ,
  SHCONTF_NETPRINTERSRCH = 512 , SHCONTF_SHAREABLE = 1024 , SHCONTF_STORAGE = 2048 , SHCONTF_NAVIGATION_ENUM = 0x01000 ,
  SHCONTF_FASTITEMS = 0x02000 , SHCONTF_FLATLIST = 0x04000 , SHCONTF_ENABLE_ASYNC = 0x08000 , SHCONTF_INCLUDESUPERHIDDEN = 0x10000
}
 
typedef IShellFolderLPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IPersistFolder2
typedef IPersistFolder2LPPERSISTFOLDER2
 
- Public Types inherited from IPersistFolder
typedef IPersistFolderLPPERSISTFOLDER
 
- Public Types inherited from IPersist
typedef IPersistLPPERSIST
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 26 of file CDrivesFolder.h.

Constructor & Destructor Documentation

◆ CDrivesFolder()

CDrivesFolder::CDrivesFolder ( )

Definition at line 615 of file CDrivesFolder.cpp.

616{
617 pidlRoot = NULL;
619}
LPITEMIDLIST pidlRoot
Definition: CDrivesFolder.h:37
INT8 m_DriveDisplayMode
Definition: CDrivesFolder.h:39
#define NULL
Definition: types.h:112

◆ ~CDrivesFolder()

CDrivesFolder::~CDrivesFolder ( )

Definition at line 621 of file CDrivesFolder.cpp.

622{
623 TRACE("-- destroying IShellFolder(%p)\n", this);
625}
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
#define TRACE(s)
Definition: solgame.cpp:4

Member Function Documentation

◆ BindToObject()

HRESULT WINAPI CDrivesFolder::BindToObject ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 730 of file CDrivesFolder.cpp.

731{
732 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
733 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
734
735 if (!pidl)
736 return E_INVALIDARG;
737
738 if (_ILIsSpecialFolder(pidl))
739 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
740
741 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
742
743 PERSIST_FOLDER_TARGET_INFO pfti = {0};
744 pfti.dwAttributes = -1;
745 pfti.csidl = -1;
746 pfti.szTargetParsingName[0] = *pchDrive;
747 pfti.szTargetParsingName[1] = L':';
748 pfti.szTargetParsingName[2] = L'\\';
749
751 &pfti,
752 pidl,
753 &CLSID_ShellFSFolder,
754 riid,
755 ppvOut);
757 return hr;
758
759 return S_OK;
760}
CComPtr< IShellFolder2 > m_regFolder
Definition: CDrivesFolder.h:38
#define E_INVALIDARG
Definition: ddrawi.h:101
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:438
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define L(x)
Definition: ntvdm.h:50
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2271
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2119
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
HRESULT hr
Definition: shlfolder.c:183
struct tagDriveStruct drive
Definition: pidl.h:214
union tagPIDLDATA::@595 u
char CHAR
Definition: xmlstorage.h:175

Referenced by GetUIObjectOf(), and ParseDisplayName().

◆ BindToStorage()

HRESULT WINAPI CDrivesFolder::BindToStorage ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 765 of file CDrivesFolder.cpp.

766{
767 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
768 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
769
770 *ppvOut = NULL;
771 return E_NOTIMPL;
772}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CallBack()

HRESULT WINAPI CDrivesFolder::CallBack ( IShellFolder psf,
HWND  hwndOwner,
IDataObject pdtobj,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
override

Implements IContextMenuCB.

Definition at line 1344 of file CDrivesFolder.cpp.

1345{
1346 enum { IDC_PROPERTIES };
1347 /* no data object means no selection */
1348 if (!pdtobj)
1349 {
1350 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1351 {
1352 // "System" properties
1353 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"sysdm.cpl") ? S_OK : E_FAIL;
1354 }
1355 else if (uMsg == DFM_MERGECONTEXTMENU) // TODO: DFM_MERGECONTEXTMENU_BOTTOM
1356 {
1357 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1358 HMENU hpopup = CreatePopupMenu();
1360 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1361 DestroyMenu(hpopup);
1362 return S_OK;
1363 }
1364 }
1365 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1366}
#define IDS_PROPERTIES
Definition: resource.h:108
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
#define TRUE
Definition: types.h:120
#define IDC_PROPERTIES
Definition: resource.h:32
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:188
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:613
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define MM_ADDSEPARATOR
Definition: shlobj.h:2536
HMENU hmenu
Definition: shlobj.h:1398
UINT idCmdLast
Definition: shlobj.h:1401
UINT idCmdFirst
Definition: shlobj.h:1400
UINT indexMenu
Definition: shlobj.h:1399
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFS_ENABLED
Definition: winuser.h:761
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:757
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ CompareIDs()

HRESULT WINAPI CDrivesFolder::CompareIDs ( LPARAM  lParam,
PCUIDLIST_RELATIVE  pidl1,
PCUIDLIST_RELATIVE  pidl2 
)
override

Implements IShellFolder.

Definition at line 778 of file CDrivesFolder.cpp.

779{
781
782 if (!pidl1 || !pidl2)
783 {
784 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
785 return E_INVALIDARG;
786 }
787
788 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
789 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
790
791 UINT iColumn = LOWORD(lParam);
792 if (!_ILIsDrive(pidl1) || !_ILIsDrive(pidl2) || iColumn >= _countof(MyComputerSFHeader))
793 return E_INVALIDARG;
794
795 CHAR* pszDrive1 = _ILGetDataPointer(pidl1)->u.drive.szDriveName;
796 CHAR* pszDrive2 = _ILGetDataPointer(pidl2)->u.drive.szDriveName;
797
798 int result;
799 switch (MyComputerSFHeader[iColumn].colnameid)
800 {
802 {
803 result = _stricmp(pszDrive1, pszDrive2);
805 break;
806 }
808 {
809 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
810 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
811 }
814 {
815 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
816
817 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
818 GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
819 else
820 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
821
822 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
823 GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
824 else
825 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
826
827 LARGE_INTEGER Diff;
828 if (lParam == 3) /* Size */
829 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
830 else /* Size available */
831 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
832
834 break;
835 }
838 break;
840 }
841
842 if (HRESULT_CODE(hres) == 0)
843 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
844
845 return hres;
846}
static const shvheader MyComputerSFHeader[]
#define ERR(fmt,...)
Definition: precomp.h:57
#define _stricmp
Definition: cat.c:22
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:78
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:77
BOOL WINAPI GetDiskFreeSpaceExA(IN LPCSTR lpDirectoryName OPTIONAL, OUT PULARGE_INTEGER lpFreeBytesAvailableToCaller, OUT PULARGE_INTEGER lpTotalNumberOfBytes, OUT PULARGE_INTEGER lpTotalNumberOfFreeBytes)
Definition: disk.c:313
BOOL WINAPI GetVolumeInformationA(IN LPCSTR lpRootPathName, IN LPSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:32
GLuint64EXT * result
Definition: glext.h:11304
HRESULT hres
Definition: protocol.c:465
unsigned int UINT
Definition: ndis.h:50
#define DEFAULT_UNREACHABLE
#define LOWORD(l)
Definition: pedump.c:82
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2130
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:630
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:349
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:372
#define IDS_SHV_COLUMN_DISK_AVAILABLE
Definition: shresdef.h:55
#define IDS_SHV_COLUMN_DISK_CAPACITY
Definition: shresdef.h:54
#define IDS_SHV_COLUMN_COMMENTS
Definition: shresdef.h:67
#define _countof(array)
Definition: sndvol32.h:70
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
LONGLONG QuadPart
Definition: typedefs.h:114
#define HRESULT_CODE(hr)
Definition: winerror.h:76

◆ CreateViewObject()

HRESULT WINAPI CDrivesFolder::CreateViewObject ( HWND  hwndOwner,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 851 of file CDrivesFolder.cpp.

852{
853 CComPtr<IShellView> pShellView;
855
856 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
857 hwndOwner, shdebugstr_guid (&riid), ppvOut);
858
859 if (!ppvOut)
860 return hr;
861
862 *ppvOut = NULL;
863
864 if (IsEqualIID(riid, IID_IDropTarget))
865 {
866 WARN("IDropTarget not implemented\n");
867 hr = E_NOTIMPL;
868 }
869 else if (IsEqualIID(riid, IID_IContextMenu))
870 {
871 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this };
872 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
873 }
874 else if (IsEqualIID(riid, IID_IShellView))
875 {
876 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this, NULL, static_cast<IShellFolderViewCB*>(this) };
877 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
878 }
879 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
880 return hr;
881}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4793
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
#define WARN(fmt,...)
Definition: precomp.h:61
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
struct _SFV_CREATE SFV_CREATE

◆ EnumObjects()

HRESULT WINAPI CDrivesFolder::EnumObjects ( HWND  hwndOwner,
DWORD  dwFlags,
LPENUMIDLIST *  ppEnumIDList 
)
override

Definition at line 719 of file CDrivesFolder.cpp.

720{
721 CComPtr<IEnumIDList> pRegEnumerator;
722 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
723
724 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
725}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define IID_PPV_ARG(Itype, ppType)

◆ EnumSearches()

HRESULT WINAPI CDrivesFolder::EnumSearches ( IEnumExtraSearch **  ppenum)
override

Implements IShellFolder2.

Definition at line 1133 of file CDrivesFolder.cpp.

1134{
1135 FIXME("(%p)\n", this);
1136 return E_NOTIMPL;
1137}

◆ FinalConstruct()

HRESULT WINAPI CDrivesFolder::FinalConstruct ( )

Definition at line 627 of file CDrivesFolder.cpp.

628{
629 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
630 if (pidlRoot == NULL)
631 return E_OUTOFMEMORY;
632
633 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
635 pidlRoot,
637
638 return hr;
639}
static const REGFOLDERINFO g_RegFolderInfo
HRESULT CRegFolder_CreateInstance(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:970
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1798

◆ GetAttributesOf()

HRESULT WINAPI CDrivesFolder::GetAttributesOf ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
DWORD rgfInOut 
)
override

Definition at line 886 of file CDrivesFolder.cpp.

887{
888 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
889 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
890
891 if (cidl && !apidl)
892 return E_INVALIDARG;
893
894 if (*rgfInOut == 0)
895 *rgfInOut = ~0;
896
897 if(cidl == 0)
898 *rgfInOut &= dwComputerAttributes;
899 else
900 {
901 for (UINT i = 0; i < cidl; ++i)
902 {
903 if (_ILIsDrive(apidl[i]))
904 {
905 *rgfInOut &= dwDriveAttributes;
906
907 if (_ILGetDriveType(apidl[i]) == DRIVE_CDROM)
908 *rgfInOut &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
909 }
910 else if (IsRegItem(apidl[i], CLSID_ControlPanel))
911 {
912 *rgfInOut &= dwControlPanelAttributes;
913 }
914 else if (_ILIsSpecialFolder(*apidl))
915 {
916 m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
917 }
918 else
919 {
920 ERR("Got unknown pidl type!\n");
921 }
922 }
923 }
924
925 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
926 *rgfInOut &= ~SFGAO_VALIDATE;
927
928 TRACE("-- result=0x%08x\n", *rgfInOut);
929 return S_OK;
930}
static const CLSID * IsRegItem(LPCITEMIDLIST pidl)
BOOL _ILGetDriveType(LPCITEMIDLIST pidl)
static const DWORD dwComputerAttributes
static const DWORD dwDriveAttributes
static const DWORD dwControlPanelAttributes
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define DRIVE_CDROM
Definition: machpc98.h:119

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CDrivesFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1277 of file CDrivesFolder.cpp.

1278{
1279 TRACE("(%p)\n", this);
1280
1281 if (!lpClassId)
1282 return E_POINTER;
1283
1284 *lpClassId = CLSID_MyComputer;
1285 return S_OK;
1286}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurFolder()

HRESULT WINAPI CDrivesFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1301 of file CDrivesFolder.cpp.

1302{
1303 TRACE("(%p)->(%p)\n", this, pidl);
1304
1305 if (!pidl)
1306 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1307
1308 *pidl = ILClone(pidlRoot);
1309 return S_OK;
1310}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ GetDefaultColumn()

HRESULT WINAPI CDrivesFolder::GetDefaultColumn ( DWORD  dwRes,
ULONG pSort,
ULONG pDisplay 
)
override

Implements IShellFolder2.

Definition at line 1139 of file CDrivesFolder.cpp.

1140{
1141 TRACE("(%p)\n", this);
1142
1143 if (pSort)
1144 *pSort = 0;
1145 if (pDisplay)
1146 *pDisplay = 0;
1147 return S_OK;
1148}

◆ GetDefaultColumnState()

HRESULT WINAPI CDrivesFolder::GetDefaultColumnState ( UINT  iColumn,
DWORD pcsFlags 
)
override

Implements IShellFolder2.

Definition at line 1150 of file CDrivesFolder.cpp.

1151{
1152 TRACE("(%p)\n", this);
1153
1154 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1155 return E_INVALIDARG;
1156 *pcsFlags = MyComputerSFHeader[iColumn].colstate;
1157 return S_OK;
1158}
WORD colstate
Definition: shfldr.h:32

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 1127 of file CDrivesFolder.cpp.

1128{
1129 FIXME("(%p)\n", this);
1130 return E_NOTIMPL;
1131}

◆ GetDetailsEx()

HRESULT WINAPI CDrivesFolder::GetDetailsEx ( PCUITEMID_CHILD  pidl,
const SHCOLUMNID pscid,
VARIANT pv 
)
override

Implements IShellFolder2.

Definition at line 1160 of file CDrivesFolder.cpp.

1161{
1162 const CLSID *pCLSID = IsRegItem(pidl);
1163 if (pscid->fmtid == FMTID_ShellDetails)
1164 {
1165 switch (pscid->pid)
1166 {
1167 case PID_DESCRIPTIONID:
1168 {
1169 if (pCLSID)
1172 switch (_ILGetDriveType(pidl))
1173 {
1174 case DRIVE_REMOVABLE: id = _ILGetRemovableTypeId(pidl); break;
1175 case DRIVE_FIXED: id = SHDID_COMPUTER_FIXED; break;
1176 case DRIVE_REMOTE: id = SHDID_COMPUTER_NETDRIVE; break;
1177 case DRIVE_CDROM: id = SHDID_COMPUTER_CDROM; break;
1178 case DRIVE_RAMDISK: id = SHDID_COMPUTER_RAMDISK; break;
1179 }
1180 return SHELL_CreateSHDESCRIPTIONID(pv, id, &CLSID_NULL);
1181 }
1182 }
1183 }
1184 if (pCLSID)
1185 return m_regFolder->GetDetailsEx(pidl, pscid, pv);
1186 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, FALSE);
1187}
static UINT _ILGetRemovableTypeId(LPCITEMIDLIST pidl)
#define FALSE
Definition: types.h:117
#define CLSID_NULL
Definition: guiddef.h:99
static HRESULT SHELL_CreateSHDESCRIPTIONID(VARIANT *pVar, DWORD Id, const CLSID *pCLSID)
Definition: shell32_main.h:274
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:133
#define PID_DESCRIPTIONID
Definition: shlguid.h:171
#define SHDID_COMPUTER_NETDRIVE
Definition: shlobj.h:1472
#define SHDID_COMPUTER_FIXED
Definition: shlobj.h:1471
#define SHDID_COMPUTER_CDROM
Definition: shlobj.h:1473
#define SHDID_COMPUTER_OTHER
Definition: shlobj.h:1475
#define SHDID_COMPUTER_RAMDISK
Definition: shlobj.h:1474
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1464
#define DRIVE_REMOTE
Definition: winbase.h:279
#define DRIVE_RAMDISK
Definition: winbase.h:281
#define DRIVE_FIXED
Definition: winbase.h:278
#define DRIVE_REMOVABLE
Definition: winbase.h:277

◆ GetDetailsOf()

HRESULT WINAPI CDrivesFolder::GetDetailsOf ( PCUITEMID_CHILD  pidl,
UINT  iColumn,
SHELLDETAILS psd 
)
override

Implements IShellFolder2.

Definition at line 1189 of file CDrivesFolder.cpp.

1190{
1191 HRESULT hr;
1192
1193 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1194
1195 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1196 return E_INVALIDARG;
1197
1198 if (!pidl)
1199 {
1200 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1201 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1202 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1203 }
1204 else if (!_ILIsDrive(pidl))
1205 {
1206 switch (MyComputerSFHeader[iColumn].colnameid)
1207 {
1209 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_NAME, psd);
1211 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_TYPE, psd);
1214 return SHSetStrRetEmpty(&psd->str);
1216 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_COMMENT, psd);
1218 }
1219 }
1220 else
1221 {
1222 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1223 CHAR* pszDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
1224 UINT DriveType = GetDriveTypeA(pszDrive);
1227
1228 switch (MyComputerSFHeader[iColumn].colnameid)
1229 {
1232 break;
1234 if (DriveType == DRIVE_REMOVABLE && !IsDriveFloppyA(pszDrive))
1235 hr = SHSetStrRet(&psd->str, IDS_DRIVE_REMOVABLE);
1236 else
1237 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1238 break;
1241 psd->str.cStr[0] = 0x00;
1242 psd->str.uType = STRRET_CSTR;
1243 if (GetVolumeInformationA(pszDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1244 {
1245 GetDiskFreeSpaceExA(pszDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1246 if (iColumn == 2)
1247 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1248 else
1249 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1250 }
1251 hr = S_OK;
1252 break;
1254 hr = SHSetStrRet(&psd->str, ""); /* FIXME: comments */
1255 break;
1257 }
1258 }
1259
1260 return hr;
1261}
static int iDriveTypeIds[7]
UINT DriveType
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
#define MAX_PATH
Definition: compat.h:34
UINT WINAPI GetDriveTypeA(IN LPCSTR lpRootPathName)
Definition: disk.c:468
LPSTR WINAPI StrFormatByteSize64A(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:2502
BOOL IsDriveFloppyA(LPCSTR pszDriveRoot)
Definition: drvdefext.cpp:386
#define SHFSF_COL_COMMENT
Definition: shfldr.h:49
#define SHFSF_COL_NAME
Definition: shfldr.h:44
#define SHFSF_COL_TYPE
Definition: shfldr.h:46
#define IDS_DRIVE_REMOVABLE
Definition: shresdef.h:115
@ STRRET_CSTR
Definition: shtypes.idl:87
STRRET str
Definition: shtypes.idl:108
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93

◆ GetDisplayNameOf()

HRESULT WINAPI CDrivesFolder::GetDisplayNameOf ( PCUITEMID_CHILD  pidl,
DWORD  dwFlags,
LPSTRRET  strRet 
)
override

Definition at line 1001 of file CDrivesFolder.cpp.

1002{
1003 WCHAR szDrive[8];
1004
1005 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1006 pdump (pidl);
1007
1008 if (!strRet)
1009 return E_INVALIDARG;
1010
1011 if (!_ILIsPidlSimple (pidl))
1012 {
1013 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1014 }
1015 else if (_ILIsSpecialFolder(pidl))
1016 {
1017 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1018 }
1019 else if (!GetDrivePath(pidl, szDrive))
1020 {
1021 ERR("Wrong pidl type\n");
1022 return E_INVALIDARG;
1023 }
1024
1025 PWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1026 if (!pszPath)
1027 return E_OUTOFMEMORY;
1028 pszPath[0] = UNICODE_NULL;
1029 szDrive[0] &= ~32; // Always uppercase
1030
1031 /* long view "lw_name (C:)" */
1033 if (!(dwFlags & SHGDN_FORPARSING))
1034 {
1035 if (m_DriveDisplayMode < 0)
1036 {
1037 DWORD err, type, data, cb = sizeof(data);
1038 err = SHRegGetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1039 L"ShowDriveLettersFirst", &type, &data, &cb, FALSE, NULL, 0);
1040 m_DriveDisplayMode = (!err && type == REG_DWORD && cb == sizeof(data)) ? (BYTE)data : 0;
1041 }
1042 BOOL bRemoteFirst = m_DriveDisplayMode == 1;
1043 BOOL bNoLetter = m_DriveDisplayMode == 2;
1044 BOOL bAllFirst = m_DriveDisplayMode == 4;
1045 PWSTR pszLabel = pszPath;
1046
1047 if (!bNoLetter && (bAllFirst || (bRemoteFirst && GetDriveTypeW(szDrive) == DRIVE_REMOTE)))
1048 {
1049 bNoLetter = TRUE; // Handling the letter now, don't append it again later
1050 if (!bEditLabel)
1051 pszLabel += wsprintfW(pszPath, L"(%c:) ", szDrive[0]);
1052 }
1053
1054 if (GetDriveLabel(szDrive, pszLabel, MAX_PATH - 7) != S_OK && !bEditLabel)
1055 {
1056 UINT ResourceId = 0;
1057 switch (GetDriveTypeW(szDrive))
1058 {
1059 case DRIVE_REMOVABLE: ResourceId = IDS_DRIVE_REMOVABLE; break; // TODO: Floppy (cached)
1060 case DRIVE_FIXED: ResourceId = IDS_DRIVE_FIXED; break;
1062 case DRIVE_CDROM: ResourceId = IDS_DRIVE_CDROM; break;
1063 }
1064 if (ResourceId)
1065 {
1067 if (len > MAX_PATH - 7)
1068 pszLabel[MAX_PATH-7] = UNICODE_NULL;
1069 }
1070 }
1071
1072 if (!*pszLabel && !bEditLabel) // No label nor fallback description, use SHGDN_FORPARSING
1073 *pszPath = UNICODE_NULL;
1074 else if (!bNoLetter && !bEditLabel)
1075 wsprintfW(pszPath + wcslen(pszPath), L" (%c:)", szDrive[0]);
1076 }
1077
1078 if (!*pszPath && !bEditLabel) // SHGDN_FORPARSING or failure above (except editing empty label)
1079 {
1081 szDrive[2] = UNICODE_NULL; // Remove backslash
1082 wcscpy(pszPath, szDrive);
1083 }
1084 strRet->uType = STRRET_WSTR;
1085 strRet->pOleStr = pszPath;
1086
1087 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1088 return S_OK;
1089}
static T * GetDrivePath(PCUITEMID_CHILD pidl, T *Path)
static HRESULT GetDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
INT ResourceId
Definition: LoadImageGCC.c:72
#define shell32_hInstance
wcscpy
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
LONG WINAPI SHRegGetUSValueW(LPCWSTR pSubKey, LPCWSTR pValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData, BOOL flagIgnoreHKCU, LPVOID pDefaultData, DWORD wDefaultDataSize)
Definition: reg.c:594
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLsizei len
Definition: glext.h:6722
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define debugstr_w
Definition: kernel32.h:32
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define UNICODE_NULL
#define err(...)
#define REG_DWORD
Definition: sdbapi.c:596
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331
#define IDS_DRIVE_CDROM
Definition: shresdef.h:112
#define IDS_DRIVE_FIXED
Definition: shresdef.h:111
#define IDS_DRIVE_NETWORK
Definition: shresdef.h:113
@ STRRET_WSTR
Definition: shtypes.idl:85
LPWSTR pOleStr
Definition: shtypes.idl:96
uint16_t * PWSTR
Definition: typedefs.h:56
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193

Referenced by GetDetailsOf().

◆ GetEnumFlags()

STDMETHODIMP CDrivesFolder::GetEnumFlags ( IShellFolder ,
PCIDLIST_ABSOLUTE  ,
HWND ,
DWORD  
)
inlineoverride

Implements IFolderFilter.

Definition at line 86 of file CDrivesFolder.h.

86{ return E_NOTIMPL; }

◆ GetUIObjectOf()

HRESULT WINAPI CDrivesFolder::GetUIObjectOf ( HWND  hwndOwner,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
REFIID  riid,
UINT prgfInOut,
LPVOID ppvOut 
)
override

Definition at line 944 of file CDrivesFolder.cpp.

947{
948 LPVOID pObj = NULL;
950
951 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
952 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
953
954 if (!ppvOut)
955 return hr;
956
957 *ppvOut = NULL;
958
959 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
960 {
961 if (_ILIsDrive(apidl[0]))
962 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
963 else
964 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
965 }
966 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
967 {
968 hr = IDataObject_Constructor(hwndOwner,
969 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
970 }
971 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
972 {
973 if (_ILIsDrive(apidl[0]))
974 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
975 else
976 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
977 }
978 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
979 {
980 CComPtr<IShellFolder> psfChild;
981 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
983 return hr;
984
985 return psfChild->CreateViewObject(NULL, riid, ppvOut);
986 }
987 else
989
990 if (SUCCEEDED(hr) && !pObj)
992
993 *ppvOut = pObj;
994 TRACE("(%p)->hr=0x%08x\n", this, hr);
995 return hr;
996}
HRESULT CDrivesContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
HRESULT CDrivesExtractIcon_CreateInstance(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
#define SUCCEEDED(hr)
Definition: intsafe.h:50
const GUID IID_IDataObject
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ Initialize()

HRESULT WINAPI CDrivesFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1293 of file CDrivesFolder.cpp.

1294{
1295 return S_OK;
1296}

◆ MapColumnToSCID()

HRESULT WINAPI CDrivesFolder::MapColumnToSCID ( UINT  column,
SHCOLUMNID pscid 
)
override

Implements IShellFolder2.

Definition at line 1263 of file CDrivesFolder.cpp.

1264{
1265 switch (column < _countof(MyComputerSFHeader) ? MyComputerSFHeader[column].colnameid : ~0UL)
1266 {
1267 case IDS_SHV_COLUMN_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
1268 case IDS_SHV_COLUMN_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
1269 case IDS_SHV_COLUMN_COMMENTS: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
1270 }
1271 return E_INVALIDARG;
1272}
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_NAME
Definition: ntquery.h:56
const FMTID FMTID_SummaryInformation
static HRESULT MakeSCID(SHCOLUMNID &scid, REFCLSID fmtid, UINT pid)
Definition: shfldr.h:99
#define UL
Definition: tui.h:164

◆ MessageSFVCB()

STDMETHODIMP CDrivesFolder::MessageSFVCB ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
override

Definition at line 1325 of file CDrivesFolder.cpp.

1326{
1327 switch (uMsg)
1328 {
1329 case SFVM_FSNOTIFY:
1330 if (lParam == SHCNE_DRIVEADD && wParam)
1331 {
1333 if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES)))
1334 return S_FALSE;
1335 }
1336 break;
1337 }
1338 return E_NOTIMPL;
1339}
static INT8 GetDriveNumber(PCUITEMID_CHILD pidl)
signed char INT8
#define SHCNE_DRIVEADD
Definition: shlobj.h:1906
#define SFVM_FSNOTIFY
Definition: shlobj.h:1315
@ REST_NODRIVES
Definition: shlobj.h:1659
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
#define S_FALSE
Definition: winerror.h:2357

◆ ParseDisplayName()

HRESULT WINAPI CDrivesFolder::ParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
override

Definition at line 644 of file CDrivesFolder.cpp.

646{
648
649 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
650 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
651 pchEaten, ppidl, pdwAttributes);
652
653 if (!ppidl)
654 return hr;
655
656 *ppidl = NULL;
657
658 if (!lpszDisplayName)
659 return hr;
660
661 /* handle CLSID paths */
662 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
663 {
664 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
665 pdwAttributes);
666 }
667
668 if (((L'A' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'Z') ||
669 (L'a' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'z')) &&
670 lpszDisplayName[1] == L':' && (lpszDisplayName[2] == L'\\' || !lpszDisplayName[2]))
671 {
672 // "C:\..."
673 WCHAR szRoot[8];
674 PathBuildRootW(szRoot, ((*lpszDisplayName - 1) & 0x1F));
675
676 if (SHIsFileSysBindCtx(pbc, NULL) != S_OK && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
677 {
678 if (::GetDriveType(szRoot) == DRIVE_NO_ROOT_DIR)
680 }
681
682 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateDrive(szRoot));
683 if (!pidlTemp)
684 return E_OUTOFMEMORY;
685
686 if (lpszDisplayName[2] && lpszDisplayName[3])
687 {
688 CComPtr<IShellFolder> pChildFolder;
689 hr = BindToObject(pidlTemp, pbc, IID_PPV_ARG(IShellFolder, &pChildFolder));
691 return hr;
692
693 ULONG chEaten;
694 CComHeapPtr<ITEMIDLIST> pidlChild;
695 hr = pChildFolder->ParseDisplayName(hwndOwner, pbc, &lpszDisplayName[3], &chEaten,
696 &pidlChild, pdwAttributes);
698 return hr;
699
700 hr = SHILCombine(pidlTemp, pidlChild, ppidl);
701 }
702 else
703 {
704 *ppidl = pidlTemp.Detach();
705 if (pdwAttributes && *pdwAttributes)
706 GetAttributesOf(1, (PCUITEMID_CHILD_ARRAY)ppidl, pdwAttributes);
707 hr = S_OK;
708 }
709 }
710
711 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr);
712
713 return hr;
714}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:278
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:303
LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive)
Definition: path.c:348
#define STGM_CREATE
Definition: objbase.h:926
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
Definition: pidl.c:2000
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
uint32_t ULONG
Definition: typedefs.h:59
#define DRIVE_NO_ROOT_DIR
Definition: winbase.h:283
#define GetDriveType
Definition: winbase.h:3843
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92

◆ SetDriveLabel()

HRESULT CDrivesFolder::SetDriveLabel ( HWND  hwndOwner,
PCWSTR  DrivePath,
PCWSTR  Label 
)
static

Definition at line 1117 of file CDrivesFolder.cpp.

1118{
1120 if (SUCCEEDED(hr))
1121 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, DrivePath, DrivePath); // DisplayName changed
1122 else if (hwndOwner)
1123 SHELL_ErrorBox(hwndOwner, hr);
1124 return hr;
1125}
PWCHAR Label
Definition: format.c:70
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL WINAPI SetVolumeLabelW(IN LPCWSTR lpRootPathName, IN LPCWSTR lpVolumeName OPTIONAL)
Definition: volume.c:503
#define HResultFromWin32
Definition: loader.cpp:14
#define SHELL_ErrorBox
Definition: shellutils.h:126
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1915
#define SHCNF_PATHW
Definition: shlobj.h:1933
DWORD WINAPI GetLastError(void)
Definition: except.c:1042

Referenced by CDrvDefExt::GeneralPageProc(), and SetNameOf().

◆ SetNameOf()

HRESULT WINAPI CDrivesFolder::SetNameOf ( HWND  hwndOwner,
PCUITEMID_CHILD  pidl,
LPCOLESTR  lpName,
DWORD  dwFlags,
PITEMID_CHILD pPidlOut 
)
override

Implements IShellFolder.

Definition at line 1103 of file CDrivesFolder.cpp.

1105{
1106 if (_ILIsDrive(pidl))
1107 {
1108 WCHAR szDrive[8];
1109 HRESULT hr = GetDrivePath(pidl, szDrive) ? SetDriveLabel(hwndOwner, szDrive, lpName) : E_FAIL;
1110 if (pPidlOut)
1111 *pPidlOut = SUCCEEDED(hr) ? _ILCreateDrive(szDrive) : NULL;
1112 return hr;
1113 }
1114 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1115}
static HRESULT SetDriveLabel(HWND hwndOwner, PCWSTR DrivePath, PCWSTR Label)
_In_ LPCSTR lpName
Definition: winbase.h:2820

◆ ShouldShow()

HRESULT WINAPI CDrivesFolder::ShouldShow ( IShellFolder psf,
PCIDLIST_ABSOLUTE  pidlFolder,
PCUITEMID_CHILD  pidlItem 
)
override

Implements IFolderFilter.

Definition at line 1315 of file CDrivesFolder.cpp.

1316{
1317 if (const CLSID* pClsid = IsRegItem(pidlItem))
1318 return SHELL32_IsShellFolderNamespaceItemHidden(L"HideMyComputerIcons", *pClsid) ? S_FALSE : S_OK;
1319 return S_OK;
1320}
BOOL SHELL32_IsShellFolderNamespaceItemHidden(LPCWSTR SubKey, REFCLSID Clsid)

Member Data Documentation

◆ m_DriveDisplayMode

INT8 CDrivesFolder::m_DriveDisplayMode
private

Definition at line 39 of file CDrivesFolder.h.

Referenced by CDrivesFolder(), and GetDisplayNameOf().

◆ m_regFolder

◆ pidlRoot

LPITEMIDLIST CDrivesFolder::pidlRoot
private

The documentation for this class was generated from the following files: