ReactOS 0.4.17-dev-243-g1369312
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 681 of file CDrivesFolder.cpp.

682{
683 pidlRoot = NULL;
685}
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 687 of file CDrivesFolder.cpp.

688{
689 TRACE("-- destroying IShellFolder(%p)\n", this);
691}
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 796 of file CDrivesFolder.cpp.

797{
798 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
799 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
800
801 if (!pidl)
802 return E_INVALIDARG;
803
804 if (_ILIsSpecialFolder(pidl))
805 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
806
807 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
808
809 PERSIST_FOLDER_TARGET_INFO pfti = {0};
810 pfti.dwAttributes = -1;
811 pfti.csidl = -1;
812 pfti.szTargetParsingName[0] = *pchDrive;
813 pfti.szTargetParsingName[1] = L':';
814 pfti.szTargetParsingName[2] = L'\\';
815
817 &pfti,
818 pidl,
819 &CLSID_ShellFSFolder,
820 riid,
821 ppvOut);
823 return hr;
824
825 return S_OK;
826}
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:31
#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:2278
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2126
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
struct tagDriveStruct drive
Definition: pidl.h:234
union tagPIDLDATA::@586 u

Referenced by GetUIObjectOf(), and ParseDisplayName().

◆ BindToStorage()

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

Definition at line 831 of file CDrivesFolder.cpp.

832{
833 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
834 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
835
836 *ppvOut = NULL;
837 return E_NOTIMPL;
838}
#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 1436 of file CDrivesFolder.cpp.

1437{
1438 enum { IDC_PROPERTIES };
1439 /* no data object means no selection */
1440 if (!pdtobj)
1441 {
1442 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1443 {
1444 // "System" properties
1445 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"sysdm.cpl") ? S_OK : E_FAIL;
1446 }
1447 else if (uMsg == DFM_MERGECONTEXTMENU) // TODO: DFM_MERGECONTEXTMENU_BOTTOM
1448 {
1449 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1450 HMENU hpopup = CreatePopupMenu();
1452 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1453 DestroyMenu(hpopup);
1454 return S_OK;
1455 }
1456 }
1457 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1458}
#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:216
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:624
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
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:1397
UINT idCmdLast
Definition: shlobj.h:1400
UINT idCmdFirst
Definition: shlobj.h:1399
UINT indexMenu
Definition: shlobj.h:1398
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 843 of file CDrivesFolder.cpp.

844{
846 UINT iColumn = LOWORD(lParam);
847
848 if (iColumn >= _countof(MyComputerSFHeader))
849 return E_INVALIDARG;
850
851 if (!pidl1 || !pidl2)
852 {
853 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
854 return E_INVALIDARG;
855 }
856
857 CHAR* pszDrive1 = _ILIsDrive(pidl1) ? _ILGetDataPointer(pidl1)->u.drive.szDriveName : NULL;
858 if (!pszDrive1 && !IsRegItem(pidl1) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
859 return E_INVALIDARG;
860 CHAR* pszDrive2 = _ILIsDrive(pidl2) ? _ILGetDataPointer(pidl2)->u.drive.szDriveName : NULL;
861 if (!pszDrive2 && !IsRegItem(pidl2) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
862 return E_INVALIDARG;
863
864 int result;
865 switch (MyComputerSFHeader[iColumn].colnameid)
866 {
868 {
869 if (!pszDrive1 && !pszDrive2)
870 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
871 else if (pszDrive1 && pszDrive2)
872 result = _stricmp(pszDrive1, pszDrive2);
873 else
874 result = (int)!pszDrive1 - (int)!pszDrive2; // Sort drives first
876 break;
877 }
878
881 {
882 if (!pszDrive1 || !pszDrive2)
883 {
884 hres = MAKE_COMPARE_HRESULT((int)!pszDrive1 - (int)!pszDrive2);
885 break;
886 }
887
888 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
889 BOOL bValid1 = FALSE, bValid2 = FALSE;
890
891 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
892 bValid1 = GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
893 else
894 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
895
896 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
897 bValid2 = GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
898 else
899 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
900
901 LARGE_INTEGER Diff;
902 if (MyComputerSFHeader[iColumn].colnameid == IDS_SHV_COLUMN_DISK_CAPACITY) /* Size */
903 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
904 else /* Size available */
905 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
906
907 if (bValid1 != bValid2)
908 hres = MAKE_COMPARE_HRESULT((int)!bValid1 - (int)!bValid2);
909 else
911
912 break;
913 }
916 {
917 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
918 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
919 }
921 }
922
923 if (HRESULT_CODE(hres) == 0)
924 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
925
926 return hres;
927}
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:89
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:88
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
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:2137
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
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:188

◆ CreateViewObject()

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

Definition at line 932 of file CDrivesFolder.cpp.

933{
934 CComPtr<IShellView> pShellView;
936
937 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
938 hwndOwner, shdebugstr_guid (&riid), ppvOut);
939
940 if (!ppvOut)
941 return hr;
942
943 *ppvOut = NULL;
944
945 if (IsEqualIID(riid, IID_IDropTarget))
946 {
947 WARN("IDropTarget not implemented\n");
948 hr = E_NOTIMPL;
949 }
950 else if (IsEqualIID(riid, IID_IContextMenu))
951 {
952 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this };
953 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
954 }
955 else if (IsEqualIID(riid, IID_IShellView))
956 {
957 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this, NULL, this };
958 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
959 }
960 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
961 return hr;
962}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4824
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 785 of file CDrivesFolder.cpp.

786{
787 CComPtr<IEnumIDList> pRegEnumerator;
788 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
789
790 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
791}
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define IID_PPV_ARG(Itype, ppType)

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1212 of file CDrivesFolder.cpp.

1213{
1214 FIXME("(%p)\n", this);
1215 return E_NOTIMPL;
1216}

◆ FinalConstruct()

HRESULT WINAPI CDrivesFolder::FinalConstruct ( )

Definition at line 693 of file CDrivesFolder.cpp.

694{
695 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
696 if (pidlRoot == NULL)
697 return E_OUTOFMEMORY;
698
699 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
701 pidlRoot,
703
704 return hr;
705}
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:1805

◆ GetAttributesOf()

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

Definition at line 967 of file CDrivesFolder.cpp.

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

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CDrivesFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1359 of file CDrivesFolder.cpp.

1360{
1361 TRACE("(%p)\n", this);
1362
1363 if (!lpClassId)
1364 return E_POINTER;
1365
1366 *lpClassId = CLSID_MyComputer;
1367 return S_OK;
1368}
#define E_POINTER
Definition: winerror.h:3480

◆ GetCurFolder()

HRESULT WINAPI CDrivesFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1383 of file CDrivesFolder.cpp.

1384{
1385 TRACE("(%p)->(%p)\n", this, pidl);
1386
1387 if (!pidl)
1388 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1389
1390 *pidl = ILClone(pidlRoot);
1391 return S_OK;
1392}
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 1218 of file CDrivesFolder.cpp.

1219{
1220 TRACE("(%p)\n", this);
1221
1222 if (pSort)
1223 *pSort = 0;
1224 if (pDisplay)
1225 *pDisplay = 0;
1226 return S_OK;
1227}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1229 of file CDrivesFolder.cpp.

1230{
1231 TRACE("(%p)\n", this);
1232
1233 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1234 return E_INVALIDARG;
1235 *pcsFlags = MyComputerSFHeader[iColumn].colstate;
1236 return S_OK;
1237}
WORD colstate
Definition: shfldr.h:32

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 1206 of file CDrivesFolder.cpp.

1207{
1208 FIXME("(%p)\n", this);
1209 return E_NOTIMPL;
1210}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1239 of file CDrivesFolder.cpp.

1240{
1241 const CLSID *pCLSID = IsRegItem(pidl);
1242 if (pscid->fmtid == FMTID_ShellDetails)
1243 {
1244 switch (pscid->pid)
1245 {
1246 case PID_DESCRIPTIONID:
1247 {
1248 if (pCLSID)
1251 switch (_ILGetDriveType(pidl))
1252 {
1253 case DRIVE_REMOVABLE: id = _ILGetRemovableTypeId(pidl); break;
1254 case DRIVE_FIXED: id = SHDID_COMPUTER_FIXED; break;
1255 case DRIVE_REMOTE: id = SHDID_COMPUTER_NETDRIVE; break;
1256 case DRIVE_CDROM: id = SHDID_COMPUTER_CDROM; break;
1257 case DRIVE_RAMDISK: id = SHDID_COMPUTER_RAMDISK; break;
1258 }
1259 return SHELL_CreateSHDESCRIPTIONID(pv, id, &CLSID_NULL);
1260 }
1261 }
1262 }
1263 if (pCLSID)
1264 return m_regFolder->GetDetailsEx(pidl, pscid, pv);
1265 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, FALSE);
1266}
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:312
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:1471
#define SHDID_COMPUTER_FIXED
Definition: shlobj.h:1470
#define SHDID_COMPUTER_CDROM
Definition: shlobj.h:1472
#define SHDID_COMPUTER_OTHER
Definition: shlobj.h:1474
#define SHDID_COMPUTER_RAMDISK
Definition: shlobj.h:1473
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1463
#define DRIVE_REMOTE
Definition: winbase.h:277
#define DRIVE_RAMDISK
Definition: winbase.h:279
#define DRIVE_FIXED
Definition: winbase.h:276
#define DRIVE_REMOVABLE
Definition: winbase.h:275

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1268 of file CDrivesFolder.cpp.

1269{
1270 HRESULT hr;
1271
1272 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1273
1274 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1275 return E_INVALIDARG;
1276
1277 if (!pidl)
1278 {
1279 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1280 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1281 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1282 }
1283 else if (!_ILIsDrive(pidl))
1284 {
1285 switch (MyComputerSFHeader[iColumn].colnameid)
1286 {
1288 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_NAME, psd);
1290 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_TYPE, psd);
1293 return SHSetStrRetEmpty(&psd->str);
1295 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_COMMENT, psd);
1297 }
1298 }
1299 else
1300 {
1301 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1302 WCHAR szDrive[8];
1303 INT8 DriveNum = GetDrivePath(pidl, szDrive);
1304 UINT DriveType = GetCachedDriveType(DriveNum);
1307
1308 switch (MyComputerSFHeader[iColumn].colnameid)
1309 {
1312 break;
1314 if (DriveType == DRIVE_UNKNOWN)
1315 hr = SHSetStrRetEmpty(&psd->str);
1316 else if (DriveType == DRIVE_REMOVABLE && IsFloppyDrive(szDrive))
1317 hr = SHSetStrRet(&psd->str, IDS_DRIVE_FLOPPY);
1318 else
1319 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1320 break;
1323 psd->str.cStr[0] = 0x00;
1324 psd->str.uType = STRRET_CSTR;
1325 if (GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1326 {
1327 GetDiskFreeSpaceExW(szDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1328 if (iColumn == 2)
1329 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1330 else
1331 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1332 }
1333 hr = S_OK;
1334 break;
1336 hr = SHSetStrRetEmpty(&psd->str); /* FIXME: comments */
1337 break;
1339 }
1340 }
1341
1342 return hr;
1343}
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:2632
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:114
@ 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:280

◆ GetDisplayNameOf()

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

Definition at line 1082 of file CDrivesFolder.cpp.

1083{
1084 WCHAR szDrive[8];
1085
1086 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1087 pdump (pidl);
1088
1089 if (!strRet)
1090 return E_INVALIDARG;
1091
1092 if (!_ILIsPidlSimple (pidl))
1093 {
1094 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1095 }
1096 else if (_ILIsSpecialFolder(pidl))
1097 {
1098 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1099 }
1100 else if (GetDrivePath(pidl, szDrive) < 0)
1101 {
1102 ERR("Wrong pidl type\n");
1103 return E_INVALIDARG;
1104 }
1105
1106 PWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1107 if (!pszPath)
1108 return E_OUTOFMEMORY;
1109 pszPath[0] = UNICODE_NULL;
1110 szDrive[0] &= ~32; // Always uppercase
1111
1112 /* long view "lw_name (C:)" */
1114 if (!(dwFlags & SHGDN_FORPARSING))
1115 {
1116 if (m_DriveDisplayMode < 0)
1117 {
1118 DWORD err, type, data, cb = sizeof(data);
1119 err = SHRegGetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1120 L"ShowDriveLettersFirst", &type, &data, &cb, FALSE, NULL, 0);
1121 m_DriveDisplayMode = (!err && type == REG_DWORD && cb == sizeof(data)) ? (BYTE)data : 0;
1122 }
1123 BOOL bRemoteFirst = m_DriveDisplayMode == 1;
1124 BOOL bNoLetter = m_DriveDisplayMode == 2;
1125 BOOL bAllFirst = m_DriveDisplayMode == 4;
1126 PWSTR pszLabel = pszPath;
1127
1128 if (!bNoLetter && (bAllFirst || (bRemoteFirst && GetCachedDriveType(szDrive) == DRIVE_REMOTE)))
1129 {
1130 bNoLetter = TRUE; // Handling the letter now, don't append it again later
1131 if (!bEditLabel)
1132 pszLabel += wsprintfW(pszPath, L"(%c:) ", szDrive[0]);
1133 }
1134
1135 if (GetDriveLabel(szDrive, pszLabel, MAX_PATH - 7) != S_OK && !bEditLabel)
1136 {
1137 UINT ResId = 0, DrvType = GetCachedDriveType(szDrive);
1138 if (DrvType == DRIVE_REMOVABLE)
1140 else if (DrvType < _countof(iDriveTypeIds))
1141 ResId = iDriveTypeIds[DrvType];
1142
1143 if (ResId)
1144 {
1145 UINT len = LoadStringW(shell32_hInstance, ResId, pszLabel, MAX_PATH - 7);
1146 if (len > MAX_PATH - 7)
1147 pszLabel[MAX_PATH-7] = UNICODE_NULL;
1148 }
1149 }
1150
1151 if (!*pszLabel && !bEditLabel) // No label nor fallback description, use SHGDN_FORPARSING
1152 *pszPath = UNICODE_NULL;
1153 else if (!bNoLetter && !bEditLabel)
1154 wsprintfW(pszPath + wcslen(pszPath), L" (%c:)", szDrive[0]);
1155 }
1156
1157 if (!*pszPath && !bEditLabel) // SHGDN_FORPARSING or failure above (except editing empty label)
1158 {
1160 szDrive[2] = UNICODE_NULL; // Remove backslash
1161 wcscpy(pszPath, szDrive);
1162 }
1163 strRet->uType = STRRET_WSTR;
1164 strRet->pOleStr = pszPath;
1165
1166 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1167 return S_OK;
1168}
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
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:2983
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
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
#define UNICODE_NULL
#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:331
#define IDS_DRIVE_REMOVABLE
Definition: shresdef.h:115
@ 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
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
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 1025 of file CDrivesFolder.cpp.

1028{
1029 LPVOID pObj = NULL;
1031
1032 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
1033 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1034
1035 if (!ppvOut)
1036 return hr;
1037
1038 *ppvOut = NULL;
1039
1040 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
1041 {
1042 if (_ILIsDrive(apidl[0]))
1043 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
1044 else
1045 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1046 }
1047 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
1048 {
1049 hr = IDataObject_Constructor(hwndOwner,
1050 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1051 }
1052 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1053 {
1054 if (_ILIsDrive(apidl[0]))
1055 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1056 else
1057 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1058 }
1059 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
1060 {
1061 CComPtr<IShellFolder> psfChild;
1062 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1064 return hr;
1065
1066 return psfChild->CreateViewObject(NULL, riid, ppvOut);
1067 }
1068 else
1069 hr = E_NOINTERFACE;
1070
1071 if (SUCCEEDED(hr) && !pObj)
1072 hr = E_OUTOFMEMORY;
1073
1074 *ppvOut = pObj;
1075 TRACE("(%p)->hr=0x%08x\n", this, hr);
1076 return hr;
1077}
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 1375 of file CDrivesFolder.cpp.

1376{
1377 return S_OK;
1378}

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1345 of file CDrivesFolder.cpp.

1346{
1347 switch (column < _countof(MyComputerSFHeader) ? MyComputerSFHeader[column].colnameid : ~0UL)
1348 {
1349 case IDS_SHV_COLUMN_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
1350 case IDS_SHV_COLUMN_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
1351 case IDS_SHV_COLUMN_COMMENTS: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
1352 }
1353 return E_INVALIDARG;
1354}
#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 1407 of file CDrivesFolder.cpp.

1408{
1409 switch (uMsg)
1410 {
1411 case SFVM_FSNOTIFY:
1412 if (lParam == SHCNE_DRIVEADD && wParam)
1413 {
1414 g_IsFloppyCache = 0;
1416 if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES)))
1417 return S_FALSE;
1418 }
1419 else if (lParam == SHCNE_DRIVEREMOVED)
1420 {
1421 g_IsFloppyCache = 0;
1422 }
1423 break;
1424 #if ROSPOLICY_DRIVESFOLDER_DEFLARGEICONS
1425 case SFVM_DEFVIEWMODE:
1427 return S_OK;
1428 #endif
1429 }
1430 return E_NOTIMPL;
1431}
UINT g_IsFloppyCache
static INT8 GetDriveNumber(PCUITEMID_CHILD pidl)
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1904
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1325
#define SHCNE_DRIVEADD
Definition: shlobj.h:1905
#define SFVM_FSNOTIFY
Definition: shlobj.h:1314
@ REST_NODRIVES
Definition: shlobj.h:1658
FOLDERVIEWMODE
Definition: shobjidl.idl:677
@ FVM_ICON
Definition: shobjidl.idl:679
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 710 of file CDrivesFolder.cpp.

712{
714
715 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
716 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
717 pchEaten, ppidl, pdwAttributes);
718
719 if (!ppidl)
720 return hr;
721
722 *ppidl = NULL;
723
724 if (!lpszDisplayName)
725 return hr;
726
727 /* handle CLSID paths */
728 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
729 {
730 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
731 pdwAttributes);
732 }
733
734 if (((L'A' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'Z') ||
735 (L'a' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'z')) &&
736 lpszDisplayName[1] == L':' && (lpszDisplayName[2] == L'\\' || !lpszDisplayName[2]))
737 {
738 // "C:\..."
739 WCHAR szRoot[8];
740 PathBuildRootW(szRoot, ((*lpszDisplayName - 1) & 0x1F));
741
742 if (SHIsFileSysBindCtx(pbc, NULL) != S_OK && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
743 {
744 if (::GetDriveType(szRoot) == DRIVE_NO_ROOT_DIR)
746 }
747
748 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateDrive(szRoot));
749 if (!pidlTemp)
750 return E_OUTOFMEMORY;
751
752 if (lpszDisplayName[2] && lpszDisplayName[3])
753 {
754 CComPtr<IShellFolder> pChildFolder;
755 hr = BindToObject(pidlTemp, pbc, IID_PPV_ARG(IShellFolder, &pChildFolder));
757 return hr;
758
759 ULONG chEaten;
760 CComHeapPtr<ITEMIDLIST> pidlChild;
761 hr = pChildFolder->ParseDisplayName(hwndOwner, pbc, &lpszDisplayName[3], &chEaten,
762 &pidlChild, pdwAttributes);
764 return hr;
765
766 hr = SHILCombine(pidlTemp, pidlChild, ppidl);
767 }
768 else
769 {
770 *ppidl = pidlTemp.Detach();
771 if (pdwAttributes && *pdwAttributes)
772 GetAttributesOf(1, (PCUITEMID_CHILD_ARRAY)ppidl, pdwAttributes);
773 hr = S_OK;
774 }
775 }
776
777 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr);
778
779 return hr;
780}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:350
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:375
LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive)
Definition: path.c:351
#define STGM_CREATE
Definition: objbase.h:945
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
Definition: pidl.c:2007
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:281
#define GetDriveType
Definition: winbase.h:3561
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 1196 of file CDrivesFolder.cpp.

1197{
1199 if (SUCCEEDED(hr))
1200 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, DrivePath, DrivePath); // DisplayName changed
1201 else if (hwndOwner)
1202 SHELL_ErrorBox(hwndOwner, hr);
1203 return hr;
1204}
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:1914
#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 1182 of file CDrivesFolder.cpp.

1184{
1185 if (_ILIsDrive(pidl))
1186 {
1187 WCHAR szDrive[8];
1188 HRESULT hr = GetDrivePath(pidl, szDrive) >= 0 ? SetDriveLabel(hwndOwner, szDrive, lpName) : E_FAIL;
1189 if (pPidlOut)
1190 *pPidlOut = SUCCEEDED(hr) ? _ILCreateDrive(szDrive) : NULL;
1191 return hr;
1192 }
1193 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1194}
static HRESULT SetDriveLabel(HWND hwndOwner, PCWSTR DrivePath, PCWSTR Label)
_In_ LPCSTR lpName
Definition: winbase.h:2543

◆ ShouldShow()

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

Implements IFolderFilter.

Definition at line 1397 of file CDrivesFolder.cpp.

1398{
1399 if (const CLSID* pClsid = IsRegItem(pidlItem))
1400 return SHELL32_IsShellFolderNamespaceItemHidden(L"HideMyComputerIcons", *pClsid) ? S_FALSE : S_OK;
1401 return S_OK;
1402}
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: