ReactOS 0.4.17-dev-1190-g4c812f4
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_ENTRY * GetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Private Attributes

LPITEMIDLIST pidlRoot
 
CComPtr< IShellFolder2 > m_regFolder
 
INT8 m_DriveDisplayMode
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNID * LPSHCOLUMNID
 
typedef const SHCOLUMNID * LPCSHCOLUMNID
 
- 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 IShellFolder * LPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknown * LPUNKNOWN
 
- Public Types inherited from IPersistFolder2
typedef IPersistFolder2 * LPPERSISTFOLDER2
 
- Public Types inherited from IPersistFolder
typedef IPersistFolder * LPPERSISTFOLDER
 
- Public Types inherited from IPersist
typedef IPersist * LPPERSIST
 
- 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 689 of file CDrivesFolder.cpp.

690{
691 pidlRoot = NULL;
693}
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 695 of file CDrivesFolder.cpp.

696{
697 TRACE("-- destroying IShellFolder(%p)\n", this);
699}
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
#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 807 of file CDrivesFolder.cpp.

808{
809 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
810 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
811
812 if (!pidl)
813 return E_INVALIDARG;
814
815 if (_ILIsSpecialFolder(pidl))
816 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
817
818 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
819
820 PERSIST_FOLDER_TARGET_INFO pfti = {0};
821 pfti.dwAttributes = -1;
822 pfti.csidl = -1;
823 pfti.szTargetParsingName[0] = *pchDrive;
824 pfti.szTargetParsingName[1] = L':';
825 pfti.szTargetParsingName[2] = L'\\';
826
828 &pfti,
829 pidl,
830 &CLSID_ShellFSFolder,
831 riid,
832 ppvOut);
834 return hr;
835
836 return S_OK;
837}
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
HRESULT hr
Definition: delayimp.cpp:582
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define L(x)
Definition: resources.c:13
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
char CHAR
Definition: pedump.c:57
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2280
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2128
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:325
struct tagDriveStruct drive
Definition: pidl.h:234
union tagPIDLDATA::@698 u

Referenced by GetUIObjectOf(), and ParseDisplayName().

◆ BindToStorage()

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

Definition at line 842 of file CDrivesFolder.cpp.

843{
844 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
845 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
846
847 *ppvOut = NULL;
848 return E_NOTIMPL;
849}
#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 1444 of file CDrivesFolder.cpp.

1445{
1446 enum { IDC_PROPERTIES };
1447 /* no data object means no selection */
1448 if (!pdtobj)
1449 {
1450 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1451 {
1452 // "System" properties
1453 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"sysdm.cpl") ? S_OK : E_FAIL;
1454 }
1455 else if (uMsg == DFM_MERGECONTEXTMENU) // TODO: DFM_MERGECONTEXTMENU_BOTTOM
1456 {
1457 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1458 HMENU hpopup = CreatePopupMenu();
1460 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1461 DestroyMenu(hpopup);
1462 return S_OK;
1463 }
1464 }
1465 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1466}
#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:35
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:223
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:656
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
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
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:2575
HMENU hmenu
Definition: shlobj.h:1435
UINT idCmdLast
Definition: shlobj.h:1438
UINT idCmdFirst
Definition: shlobj.h:1437
UINT indexMenu
Definition: shlobj.h:1436

◆ CompareIDs()

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

Implements IShellFolder.

Definition at line 854 of file CDrivesFolder.cpp.

855{
857 UINT iColumn = LOWORD(lParam);
858
859 if (iColumn >= _countof(MyComputerSFHeader))
860 return E_INVALIDARG;
861
862 if (!pidl1 || !pidl2)
863 {
864 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
865 return E_INVALIDARG;
866 }
867
868 CHAR* pszDrive1 = _ILIsDrive(pidl1) ? _ILGetDataPointer(pidl1)->u.drive.szDriveName : NULL;
869 if (!pszDrive1 && !IsRegItem(pidl1) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
870 return E_INVALIDARG;
871 CHAR* pszDrive2 = _ILIsDrive(pidl2) ? _ILGetDataPointer(pidl2)->u.drive.szDriveName : NULL;
872 if (!pszDrive2 && !IsRegItem(pidl2) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
873 return E_INVALIDARG;
874
875 int result;
876 switch (MyComputerSFHeader[iColumn].colnameid)
877 {
879 {
880 if (!pszDrive1 && !pszDrive2)
881 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
882 else if (pszDrive1 && pszDrive2)
883 result = _stricmp(pszDrive1, pszDrive2);
884 else
885 result = (int)!pszDrive1 - (int)!pszDrive2; // Sort drives first
887 break;
888 }
889
892 {
893 if (!pszDrive1 || !pszDrive2)
894 {
895 hres = MAKE_COMPARE_HRESULT((int)!pszDrive1 - (int)!pszDrive2);
896 break;
897 }
898
899 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
900 BOOL bValid1 = FALSE, bValid2 = FALSE;
901
902 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
903 bValid1 = GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
904 else
905 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
906
907 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
908 bValid2 = GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
909 else
910 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
911
912 LARGE_INTEGER Diff;
913 if (MyComputerSFHeader[iColumn].colnameid == IDS_SHV_COLUMN_DISK_CAPACITY) /* Size */
914 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
915 else /* Size available */
916 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
917
918 if (bValid1 != bValid2)
919 hres = MAKE_COMPARE_HRESULT((int)!bValid1 - (int)!bValid2);
920 else
922
923 break;
924 }
927 {
928 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
929 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
930 }
932 }
933
934 if (HRESULT_CODE(hres) == 0)
935 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
936
937 return hres;
938}
static const CLSID * IsRegItem(LPCITEMIDLIST pidl)
static const shvheader MyComputerSFHeader[]
#define ERR(fmt,...)
Definition: precomp.h:57
#define _stricmp
Definition: cat.c:22
#define FALSE
Definition: types.h:117
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:90
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:89
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
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint64EXT * result
Definition: glext.h:11304
unsigned int UINT
Definition: sysinfo.c:13
HRESULT hres
Definition: protocol.c:432
#define DEFAULT_UNREACHABLE
#define LOWORD(l)
Definition: pedump.c:82
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2139
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:740
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:381
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:404
#define IDS_SHV_COLUMN_DISK_AVAILABLE
Definition: shresdef.h:53
#define IDS_SHV_COLUMN_DISK_CAPACITY
Definition: shresdef.h:52
#define IDS_SHV_COLUMN_COMMENTS
Definition: shresdef.h:65
#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:188

◆ CreateViewObject()

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

Definition at line 943 of file CDrivesFolder.cpp.

944{
945 CComPtr<IShellView> pShellView;
947
948 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
949 hwndOwner, shdebugstr_guid (&riid), ppvOut);
950
951 if (!ppvOut)
952 return hr;
953
954 *ppvOut = NULL;
955
956 if (IsEqualIID(riid, IID_IDropTarget))
957 {
958 WARN("IDropTarget not implemented\n");
959 hr = E_NOTIMPL;
960 }
961 else if (IsEqualIID(riid, IID_IContextMenu))
962 {
963 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this };
964 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
965 }
966 else if (IsEqualIID(riid, IID_IShellView))
967 {
968 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this, NULL, this };
969 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
970 }
971 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
972 return hr;
973}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4806
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 796 of file CDrivesFolder.cpp.

797{
798 CComPtr<IEnumIDList> pRegEnumerator;
799 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
800
801 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
802}
#define IID_PPV_ARG(Itype, ppType)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1225 of file CDrivesFolder.cpp.

1226{
1227 *ppenum = NULL;
1228 return E_NOTIMPL;
1229}

◆ FinalConstruct()

HRESULT WINAPI CDrivesFolder::FinalConstruct ( )

Definition at line 701 of file CDrivesFolder.cpp.

702{
703 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
704 if (pidlRoot == NULL)
705 return E_OUTOFMEMORY;
706
707 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
709 pidlRoot,
711
712 return hr;
713}
static const REGFOLDERINFO g_RegFolderInfo
HRESULT CRegFolder_CreateInstance(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:995
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1807

◆ GetAttributesOf()

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

Definition at line 978 of file CDrivesFolder.cpp.

979{
980 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
981 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
982
983 if (cidl && !apidl)
984 return E_INVALIDARG;
985
986 if (*rgfInOut == 0)
987 *rgfInOut = ~0;
988
989 if(cidl == 0)
990 *rgfInOut &= dwComputerAttributes;
991 else
992 {
993 for (UINT i = 0; i < cidl; ++i)
994 {
995 if (_ILIsDrive(apidl[i]))
996 {
997 *rgfInOut &= dwDriveAttributes;
998
999 if (_ILGetDriveType(apidl[i]) == DRIVE_CDROM)
1000 *rgfInOut &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
1001 }
1002 else if (IsRegItem(apidl[i], CLSID_ControlPanel))
1003 {
1004 *rgfInOut &= dwControlPanelAttributes;
1005 }
1006 else if (_ILIsSpecialFolder(*apidl))
1007 {
1008 m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
1009 }
1010 else
1011 {
1012 ERR("Got unknown pidl type!\n");
1013 }
1014 }
1015 }
1016
1017 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1018 *rgfInOut &= ~SFGAO_VALIDATE;
1019
1020 TRACE("-- result=0x%08x\n", *rgfInOut);
1021 return S_OK;
1022}
UINT _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: winbase.h:279

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CDrivesFolder::GetClassID ( CLSID *  lpClassId)
override

Implements IPersist.

Definition at line 1367 of file CDrivesFolder.cpp.

1368{
1369 TRACE("(%p)\n", this);
1370
1371 if (!lpClassId)
1372 return E_POINTER;
1373
1374 *lpClassId = CLSID_MyComputer;
1375 return S_OK;
1376}
#define E_POINTER
Definition: winerror.h:3480

◆ GetCurFolder()

HRESULT WINAPI CDrivesFolder::GetCurFolder ( PIDLIST_ABSOLUTE *  pidl)
override

Implements IPersistFolder2.

Definition at line 1391 of file CDrivesFolder.cpp.

1392{
1393 TRACE("(%p)->(%p)\n", this, pidl);
1394
1395 if (!pidl)
1396 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1397
1398 *pidl = ILClone(pidlRoot);
1399 return S_OK;
1400}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 1231 of file CDrivesFolder.cpp.

1232{
1233 TRACE("(%p)\n", this);
1234 return E_NOTIMPL; // Not required when column 0 is our default.
1235}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1237 of file CDrivesFolder.cpp.

1238{
1239 TRACE("(%p)\n", this);
1240
1241 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1242 return E_INVALIDARG;
1243 *pcsFlags = MyComputerSFHeader[iColumn].colstate;
1244 return S_OK;
1245}
WORD colstate
Definition: shfldr.h:32

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID ( GUID *  pguid)
override

Implements IShellFolder2.

Definition at line 1217 of file CDrivesFolder.cpp.

1218{
1219 if (LOBYTE(GetVersion()) >= 6)
1220 return E_NOTIMPL;
1221 *pguid = CLSID_ShellSearchExt;
1222 return S_OK;
1223}
DWORD WINAPI GetVersion(void)
Definition: version.c:1458
#define LOBYTE(W)
Definition: jmemdos.c:487

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1247 of file CDrivesFolder.cpp.

1248{
1249 const CLSID *pCLSID = IsRegItem(pidl);
1250 if (pscid->fmtid == FMTID_ShellDetails)
1251 {
1252 switch (pscid->pid)
1253 {
1254 case PID_DESCRIPTIONID:
1255 {
1256 if (pCLSID)
1259 switch (_ILGetDriveType(pidl))
1260 {
1261 case DRIVE_REMOVABLE: id = _ILGetRemovableTypeId(pidl); break;
1262 case DRIVE_FIXED: id = SHDID_COMPUTER_FIXED; break;
1263 case DRIVE_REMOTE: id = SHDID_COMPUTER_NETDRIVE; break;
1264 case DRIVE_CDROM: id = SHDID_COMPUTER_CDROM; break;
1265 case DRIVE_RAMDISK: id = SHDID_COMPUTER_RAMDISK; break;
1266 }
1267 return SHELL_CreateSHDESCRIPTIONID(pv, id, &CLSID_NULL);
1268 }
1269 }
1270 }
1271 if (pCLSID)
1272 return m_regFolder->GetDetailsEx(pidl, pscid, pv);
1273 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, FALSE);
1274}
static UINT _ILGetRemovableTypeId(LPCITEMIDLIST pidl)
#define CLSID_NULL
Definition: guiddef.h:99
static HRESULT SHELL_CreateSHDESCRIPTIONID(VARIANT *pVar, DWORD Id, const CLSID *pCLSID)
Definition: shell32_main.h:324
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:152
#define PID_DESCRIPTIONID
Definition: shlguid.h:175
#define SHDID_COMPUTER_NETDRIVE
Definition: shlobj.h:1509
#define SHDID_COMPUTER_FIXED
Definition: shlobj.h:1508
#define SHDID_COMPUTER_CDROM
Definition: shlobj.h:1510
#define SHDID_COMPUTER_OTHER
Definition: shlobj.h:1512
#define SHDID_COMPUTER_RAMDISK
Definition: shlobj.h:1511
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1501
#define DRIVE_REMOTE
Definition: winbase.h:278
#define DRIVE_RAMDISK
Definition: winbase.h:280
#define DRIVE_FIXED
Definition: winbase.h:277
#define DRIVE_REMOVABLE
Definition: winbase.h:276

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1276 of file CDrivesFolder.cpp.

1277{
1278 HRESULT hr;
1279
1280 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1281
1282 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1283 return E_INVALIDARG;
1284
1285 if (!pidl)
1286 {
1287 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1288 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1289 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1290 }
1291 else if (!_ILIsDrive(pidl))
1292 {
1293 switch (MyComputerSFHeader[iColumn].colnameid)
1294 {
1296 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_NAME, psd);
1298 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_TYPE, psd);
1301 return SHSetStrRetEmpty(&psd->str);
1303 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_COMMENT, psd);
1305 }
1306 }
1307 else
1308 {
1309 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1310 WCHAR szDrive[8];
1311 INT8 DriveNum = GetDrivePath(pidl, szDrive);
1312 UINT DriveType = GetCachedDriveType(DriveNum);
1315
1316 switch (MyComputerSFHeader[iColumn].colnameid)
1317 {
1320 break;
1322 if (DriveType == DRIVE_UNKNOWN)
1323 hr = SHSetStrRetEmpty(&psd->str);
1324 else if (DriveType == DRIVE_REMOVABLE && IsFloppyDrive(szDrive))
1325 hr = SHSetStrRet(&psd->str, IDS_DRIVE_FLOPPY);
1326 else
1327 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1328 break;
1331 psd->str.cStr[0] = 0x00;
1332 psd->str.uType = STRRET_CSTR;
1333 if (GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1334 {
1335 GetDiskFreeSpaceExW(szDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1336 if (iColumn == 2)
1337 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1338 else
1339 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1340 }
1341 hr = S_OK;
1342 break;
1344 hr = SHSetStrRetEmpty(&psd->str); /* FIXME: comments */
1345 break;
1347 }
1348 }
1349
1350 return hr;
1351}
static bool IsFloppyDrive(PCWSTR DrivePath)
static UINT GetCachedDriveType(INT8 DrvNum)
static int iDriveTypeIds[7]
INT8 GetDrivePath(PCUITEMID_CHILD pidl, PWSTR Path)
UINT DriveType
signed char INT8
Definition: basetsd.h:183
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
#define MAX_PATH
Definition: compat.h:34
BOOL WINAPI GetDiskFreeSpaceExW(IN LPCWSTR lpDirectoryName OPTIONAL, OUT PULARGE_INTEGER lpFreeBytesAvailableToCaller, OUT PULARGE_INTEGER lpTotalNumberOfBytes, OUT PULARGE_INTEGER lpTotalNumberOfFreeBytes)
Definition: disk.c:342
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:226
LPSTR WINAPI StrFormatByteSize64A(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:997
short WCHAR
Definition: pedump.c:58
#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_FLOPPY
Definition: shresdef.h:112
@ 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
#define DRIVE_UNKNOWN
Definition: winbase.h:281

◆ GetDisplayNameOf()

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

Definition at line 1093 of file CDrivesFolder.cpp.

1094{
1095 WCHAR szDrive[8];
1096
1097 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1098 pdump (pidl);
1099
1100 if (!strRet)
1101 return E_INVALIDARG;
1102
1103 if (!_ILIsPidlSimple (pidl))
1104 {
1105 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1106 }
1107 else if (_ILIsSpecialFolder(pidl))
1108 {
1109 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1110 }
1111 else if (GetDrivePath(pidl, szDrive) < 0)
1112 {
1113 ERR("Wrong pidl type\n");
1114 return E_INVALIDARG;
1115 }
1116
1117 PWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1118 if (!pszPath)
1119 return E_OUTOFMEMORY;
1120 pszPath[0] = UNICODE_NULL;
1121 szDrive[0] &= ~32; // Always uppercase
1122
1123 /* long view "lw_name (C:)" */
1125 if (!(dwFlags & SHGDN_FORPARSING))
1126 {
1127 if (m_DriveDisplayMode < 0)
1128 {
1129 DWORD err, type, data, cb = sizeof(data);
1130 err = SHRegGetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1131 L"ShowDriveLettersFirst", &type, &data, &cb, FALSE, NULL, 0);
1132 m_DriveDisplayMode = (!err && type == REG_DWORD && cb == sizeof(data)) ? (BYTE)data : 0;
1133 }
1134 BOOL bRemoteFirst = m_DriveDisplayMode == 1;
1135 BOOL bNoLetter = m_DriveDisplayMode == 2;
1136 BOOL bAllFirst = m_DriveDisplayMode == 4;
1137 PWSTR pszLabel = pszPath;
1138
1139 if (!bNoLetter && (bAllFirst || (bRemoteFirst && GetCachedDriveType(szDrive) == DRIVE_REMOTE)))
1140 {
1141 bNoLetter = TRUE; // Handling the letter now, don't append it again later
1142 if (!bEditLabel)
1143 pszLabel += wsprintfW(pszPath, L"(%c:) ", szDrive[0]);
1144 }
1145
1146 if (GetDriveLabel(szDrive, pszLabel, MAX_PATH - 7) != S_OK && !bEditLabel)
1147 {
1148 UINT ResId = 0, DrvType = GetCachedDriveType(szDrive);
1149 if (DrvType == DRIVE_REMOVABLE)
1151 else if (DrvType < _countof(iDriveTypeIds))
1152 ResId = iDriveTypeIds[DrvType];
1153
1154 if (ResId)
1155 {
1156 UINT len = LoadStringW(shell32_hInstance, ResId, pszLabel, MAX_PATH - 7);
1157 if (len > MAX_PATH - 7)
1158 pszLabel[MAX_PATH-7] = UNICODE_NULL;
1159 }
1160 }
1161
1162 if (!*pszLabel && !bEditLabel) // No label nor fallback description, use SHGDN_FORPARSING
1163 *pszPath = UNICODE_NULL;
1164 else if (!bNoLetter && !bEditLabel)
1165 wsprintfW(pszPath + wcslen(pszPath), L" (%c:)", szDrive[0]);
1166 }
1167
1168 if (!*pszPath && !bEditLabel) // SHGDN_FORPARSING or failure above (except editing empty label)
1169 {
1171 szDrive[2] = UNICODE_NULL; // Remove backslash
1172 wcscpy(pszPath, szDrive);
1173 }
1174 strRet->uType = STRRET_WSTR;
1175 strRet->pOleStr = pszPath;
1176
1177 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1178 return S_OK;
1179}
static HRESULT GetDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
#define shell32_hInstance
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
LONG WINAPI SHRegGetUSValueW(const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len, BOOL ignore_hkcu, void *default_data, DWORD default_data_len)
Definition: registry.c:4077
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
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
#define debugstr_w
Definition: kernel32.h:32
#define UNICODE_NULL
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
#define err(...)
#define REG_DWORD
Definition: sdbapi.c:615
wcscpy
#define LoadStringW
Definition: utils.h:64
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:363
#define IDS_DRIVE_REMOVABLE
Definition: shresdef.h:113
@ STRRET_WSTR
Definition: shtypes.idl:85
LPWSTR pOleStr
Definition: shtypes.idl:96
uint16_t * PWSTR
Definition: typedefs.h:56
uint16_t * LPWSTR
Definition: typedefs.h:56
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 1036 of file CDrivesFolder.cpp.

1039{
1040 LPVOID pObj = NULL;
1042
1043 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
1044 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1045
1046 if (!ppvOut)
1047 return hr;
1048
1049 *ppvOut = NULL;
1050
1051 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
1052 {
1053 if (_ILIsDrive(apidl[0]))
1054 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
1055 else
1056 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1057 }
1058 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
1059 {
1060 hr = IDataObject_Constructor(hwndOwner,
1061 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1062 }
1063 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1064 {
1065 if (_ILIsDrive(apidl[0]))
1066 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1067 else
1068 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1069 }
1070 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
1071 {
1072 CComPtr<IShellFolder> psfChild;
1073 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1075 return hr;
1076
1077 return psfChild->CreateViewObject(NULL, riid, ppvOut);
1078 }
1079 else
1080 hr = E_NOINTERFACE;
1081
1082 if (SUCCEEDED(hr) && !pObj)
1083 hr = E_OUTOFMEMORY;
1084
1085 *ppvOut = pObj;
1086 TRACE("(%p)->hr=0x%08x\n", this, hr);
1087 return hr;
1088}
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:3479

◆ Initialize()

HRESULT WINAPI CDrivesFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1383 of file CDrivesFolder.cpp.

1384{
1385 return S_OK;
1386}

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1353 of file CDrivesFolder.cpp.

1354{
1355 switch (column < _countof(MyComputerSFHeader) ? MyComputerSFHeader[column].colnameid : ~0UL)
1356 {
1357 case IDS_SHV_COLUMN_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
1358 case IDS_SHV_COLUMN_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
1359 case IDS_SHV_COLUMN_COMMENTS: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
1360 }
1361 return E_INVALIDARG;
1362}
#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:165

◆ MessageSFVCB()

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

Definition at line 1415 of file CDrivesFolder.cpp.

1416{
1417 switch (uMsg)
1418 {
1419 case SFVM_FSNOTIFY:
1420 if (lParam == SHCNE_DRIVEADD && wParam)
1421 {
1422 g_IsFloppyCache = 0;
1424 if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES)))
1425 return S_FALSE;
1426 }
1427 else if (lParam == SHCNE_DRIVEREMOVED)
1428 {
1429 g_IsFloppyCache = 0;
1430 }
1431 break;
1432 #if ROSPOLICY_DRIVESFOLDER_DEFLARGEICONS
1433 case SFVM_DEFVIEWMODE:
1435 return S_OK;
1436 #endif
1437 }
1438 return E_NOTIMPL;
1439}
UINT g_IsFloppyCache
static INT8 GetDriveNumber(PCUITEMID_CHILD pidl)
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1943
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1363
#define SHCNE_DRIVEADD
Definition: shlobj.h:1944
#define SFVM_FSNOTIFY
Definition: shlobj.h:1352
@ REST_NODRIVES
Definition: shlobj.h:1697
FOLDERVIEWMODE
Definition: shobjidl.idl:722
@ FVM_ICON
Definition: shobjidl.idl:724
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
#define S_FALSE
Definition: winerror.h:3451

◆ ParseDisplayName()

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

Definition at line 718 of file CDrivesFolder.cpp.

720{
722
723 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
724 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
725 pchEaten, ppidl, pdwAttributes);
726
727 if (!ppidl)
728 return hr;
729
730 *ppidl = NULL;
731
732 if (!lpszDisplayName)
733 return hr;
734
735 /* handle CLSID paths */
736 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
737 {
738 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
739 pdwAttributes);
740 }
741
742 if (((L'A' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'Z') ||
743 (L'a' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'z')) &&
744 lpszDisplayName[1] == L':' && (lpszDisplayName[2] == L'\\' || !lpszDisplayName[2]))
745 {
746 if (!lpszDisplayName[2] && LOBYTE(GetVersion()) < 6)
747 return E_INVALIDARG; // NT5 does not support parsing "c:"
748
749 // "C:\..."
750 WCHAR szRoot[8];
751 PathBuildRootW(szRoot, ((*lpszDisplayName - 1) & 0x1F));
752
753 if (SHIsFileSysBindCtx(pbc, NULL) != S_OK && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
754 {
755 if (::GetDriveType(szRoot) == DRIVE_NO_ROOT_DIR)
757 }
758
759 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateDrive(szRoot));
760 if (!pidlTemp)
761 return E_OUTOFMEMORY;
762
763 if (lpszDisplayName[2] && lpszDisplayName[3])
764 {
765 CComPtr<IShellFolder> pChildFolder;
766 hr = BindToObject(pidlTemp, pbc, IID_PPV_ARG(IShellFolder, &pChildFolder));
768 return hr;
769
770 ULONG chEaten;
771 CComHeapPtr<ITEMIDLIST> pidlChild;
772 hr = pChildFolder->ParseDisplayName(hwndOwner, pbc, &lpszDisplayName[3], &chEaten,
773 &pidlChild, pdwAttributes);
775 return hr;
776
777 hr = SHILCombine(pidlTemp, pidlChild, ppidl);
778 }
779 else
780 {
781 *ppidl = pidlTemp.Detach();
782 if (pdwAttributes && *pdwAttributes)
783 GetAttributesOf(1, (PCUITEMID_CHILD_ARRAY)ppidl, pdwAttributes);
784 hr = S_OK;
785 }
786 }
787
788 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr);
789
790 return hr;
791}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:336
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:361
LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive)
Definition: path.c:105
#define STGM_CREATE
Definition: objbase.h:945
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
Definition: pidl.c:2009
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:282
#define GetDriveType
Definition: winbase.h:3535
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228

◆ SetDriveLabel()

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

Definition at line 1207 of file CDrivesFolder.cpp.

1208{
1210 if (SUCCEEDED(hr))
1211 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, DrivePath, DrivePath); // DisplayName changed
1212 else if (hwndOwner)
1213 SHELL_ErrorBox(hwndOwner, hr);
1214 return hr;
1215}
PWCHAR Label
Definition: format.c:69
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:1953
#define SHCNF_PATHW
Definition: shlobj.h:1972
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 1193 of file CDrivesFolder.cpp.

1195{
1196 if (_ILIsDrive(pidl))
1197 {
1198 WCHAR szDrive[8];
1199 HRESULT hr = GetDrivePath(pidl, szDrive) >= 0 ? SetDriveLabel(hwndOwner, szDrive, lpName) : E_FAIL;
1200 if (pPidlOut)
1201 *pPidlOut = SUCCEEDED(hr) ? _ILCreateDrive(szDrive) : NULL;
1202 return hr;
1203 }
1204 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1205}
static HRESULT SetDriveLabel(HWND hwndOwner, PCWSTR DrivePath, PCWSTR Label)
_In_ LPCSTR lpName
Definition: winbase.h:2519

◆ ShouldShow()

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

Implements IFolderFilter.

Definition at line 1405 of file CDrivesFolder.cpp.

1406{
1407 if (const CLSID* pClsid = IsRegItem(pidlItem))
1408 return SHELL32_IsShellFolderNamespaceItemHidden(L"HideMyComputerIcons", *pClsid) ? S_FALSE : S_OK;
1409 return S_OK;
1410}
BOOL SHELL32_IsShellFolderNamespaceItemHidden(LPCWSTR SubKey, REFCLSID Clsid)
Returns true if the item should be hidden in DefView but not in the Explorer folder tree.

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: