ReactOS 0.4.16-dev-1948-gd260c1d
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 678 of file CDrivesFolder.cpp.

679{
680 pidlRoot = NULL;
682}
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 684 of file CDrivesFolder.cpp.

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

794{
795 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
796 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
797
798 if (!pidl)
799 return E_INVALIDARG;
800
801 if (_ILIsSpecialFolder(pidl))
802 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
803
804 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
805
806 PERSIST_FOLDER_TARGET_INFO pfti = {0};
807 pfti.dwAttributes = -1;
808 pfti.csidl = -1;
809 pfti.szTargetParsingName[0] = *pchDrive;
810 pfti.szTargetParsingName[1] = L':';
811 pfti.szTargetParsingName[2] = L'\\';
812
814 &pfti,
815 pidl,
816 &CLSID_ShellFSFolder,
817 riid,
818 ppvOut);
820 return hr;
821
822 return S_OK;
823}
CComPtr< IShellFolder2 > m_regFolder
Definition: CDrivesFolder.h:38
#define E_INVALIDARG
Definition: ddrawi.h:101
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:438
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#define L(x)
Definition: resources.c:13
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2272
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2120
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
HRESULT hr
Definition: shlfolder.c:183
struct tagDriveStruct drive
Definition: pidl.h:234
union tagPIDLDATA::@617 u
char CHAR
Definition: xmlstorage.h:175

Referenced by GetUIObjectOf(), and ParseDisplayName().

◆ BindToStorage()

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

Definition at line 828 of file CDrivesFolder.cpp.

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

1434{
1435 enum { IDC_PROPERTIES };
1436 /* no data object means no selection */
1437 if (!pdtobj)
1438 {
1439 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1440 {
1441 // "System" properties
1442 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"sysdm.cpl") ? S_OK : E_FAIL;
1443 }
1444 else if (uMsg == DFM_MERGECONTEXTMENU) // TODO: DFM_MERGECONTEXTMENU_BOTTOM
1445 {
1446 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1447 HMENU hpopup = CreatePopupMenu();
1449 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1450 DestroyMenu(hpopup);
1451 return S_OK;
1452 }
1453 }
1454 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1455}
#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:214
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:2534
HMENU hmenu
Definition: shlobj.h:1395
UINT idCmdLast
Definition: shlobj.h:1398
UINT idCmdFirst
Definition: shlobj.h:1397
UINT indexMenu
Definition: shlobj.h:1396
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 840 of file CDrivesFolder.cpp.

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

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

783{
784 CComPtr<IEnumIDList> pRegEnumerator;
785 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
786
787 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
788}
_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 1209 of file CDrivesFolder.cpp.

1210{
1211 FIXME("(%p)\n", this);
1212 return E_NOTIMPL;
1213}

◆ FinalConstruct()

HRESULT WINAPI CDrivesFolder::FinalConstruct ( )

Definition at line 690 of file CDrivesFolder.cpp.

691{
692 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
693 if (pidlRoot == NULL)
694 return E_OUTOFMEMORY;
695
696 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
698 pidlRoot,
700
701 return hr;
702}
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:1799

◆ GetAttributesOf()

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

Definition at line 964 of file CDrivesFolder.cpp.

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

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CDrivesFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1356 of file CDrivesFolder.cpp.

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

◆ GetCurFolder()

HRESULT WINAPI CDrivesFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1380 of file CDrivesFolder.cpp.

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

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

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1226 of file CDrivesFolder.cpp.

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

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 1203 of file CDrivesFolder.cpp.

1204{
1205 FIXME("(%p)\n", this);
1206 return E_NOTIMPL;
1207}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1236 of file CDrivesFolder.cpp.

1237{
1238 const CLSID *pCLSID = IsRegItem(pidl);
1239 if (pscid->fmtid == FMTID_ShellDetails)
1240 {
1241 switch (pscid->pid)
1242 {
1243 case PID_DESCRIPTIONID:
1244 {
1245 if (pCLSID)
1248 switch (_ILGetDriveType(pidl))
1249 {
1250 case DRIVE_REMOVABLE: id = _ILGetRemovableTypeId(pidl); break;
1251 case DRIVE_FIXED: id = SHDID_COMPUTER_FIXED; break;
1252 case DRIVE_REMOTE: id = SHDID_COMPUTER_NETDRIVE; break;
1253 case DRIVE_CDROM: id = SHDID_COMPUTER_CDROM; break;
1254 case DRIVE_RAMDISK: id = SHDID_COMPUTER_RAMDISK; break;
1255 }
1256 return SHELL_CreateSHDESCRIPTIONID(pv, id, &CLSID_NULL);
1257 }
1258 }
1259 }
1260 if (pCLSID)
1261 return m_regFolder->GetDetailsEx(pidl, pscid, pv);
1262 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, FALSE);
1263}
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:293
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:1469
#define SHDID_COMPUTER_FIXED
Definition: shlobj.h:1468
#define SHDID_COMPUTER_CDROM
Definition: shlobj.h:1470
#define SHDID_COMPUTER_OTHER
Definition: shlobj.h:1472
#define SHDID_COMPUTER_RAMDISK
Definition: shlobj.h:1471
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1461
#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 1265 of file CDrivesFolder.cpp.

1266{
1267 HRESULT hr;
1268
1269 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1270
1271 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1272 return E_INVALIDARG;
1273
1274 if (!pidl)
1275 {
1276 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1277 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1278 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1279 }
1280 else if (!_ILIsDrive(pidl))
1281 {
1282 switch (MyComputerSFHeader[iColumn].colnameid)
1283 {
1285 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_NAME, psd);
1287 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_TYPE, psd);
1290 return SHSetStrRetEmpty(&psd->str);
1292 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_COMMENT, psd);
1294 }
1295 }
1296 else
1297 {
1298 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1299 WCHAR szDrive[8];
1300 INT8 DriveNum = GetDrivePath(pidl, szDrive);
1301 UINT DriveType = GetCachedDriveType(DriveNum);
1304
1305 switch (MyComputerSFHeader[iColumn].colnameid)
1306 {
1309 break;
1311 if (DriveType == DRIVE_UNKNOWN)
1312 hr = SHSetStrRetEmpty(&psd->str);
1313 else if (DriveType == DRIVE_REMOVABLE && IsFloppyDrive(szDrive))
1314 hr = SHSetStrRet(&psd->str, IDS_DRIVE_FLOPPY);
1315 else
1316 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1317 break;
1320 psd->str.cStr[0] = 0x00;
1321 psd->str.uType = STRRET_CSTR;
1322 if (GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1323 {
1324 GetDiskFreeSpaceExW(szDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1325 if (iColumn == 2)
1326 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1327 else
1328 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1329 }
1330 hr = S_OK;
1331 break;
1333 hr = SHSetStrRetEmpty(&psd->str); /* FIXME: comments */
1334 break;
1336 }
1337 }
1338
1339 return hr;
1340}
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
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:2502
#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
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ GetDisplayNameOf()

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

Definition at line 1079 of file CDrivesFolder.cpp.

1080{
1081 WCHAR szDrive[8];
1082
1083 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1084 pdump (pidl);
1085
1086 if (!strRet)
1087 return E_INVALIDARG;
1088
1089 if (!_ILIsPidlSimple (pidl))
1090 {
1091 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1092 }
1093 else if (_ILIsSpecialFolder(pidl))
1094 {
1095 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1096 }
1097 else if (GetDrivePath(pidl, szDrive) < 0)
1098 {
1099 ERR("Wrong pidl type\n");
1100 return E_INVALIDARG;
1101 }
1102
1103 PWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1104 if (!pszPath)
1105 return E_OUTOFMEMORY;
1106 pszPath[0] = UNICODE_NULL;
1107 szDrive[0] &= ~32; // Always uppercase
1108
1109 /* long view "lw_name (C:)" */
1111 if (!(dwFlags & SHGDN_FORPARSING))
1112 {
1113 if (m_DriveDisplayMode < 0)
1114 {
1115 DWORD err, type, data, cb = sizeof(data);
1116 err = SHRegGetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1117 L"ShowDriveLettersFirst", &type, &data, &cb, FALSE, NULL, 0);
1118 m_DriveDisplayMode = (!err && type == REG_DWORD && cb == sizeof(data)) ? (BYTE)data : 0;
1119 }
1120 BOOL bRemoteFirst = m_DriveDisplayMode == 1;
1121 BOOL bNoLetter = m_DriveDisplayMode == 2;
1122 BOOL bAllFirst = m_DriveDisplayMode == 4;
1123 PWSTR pszLabel = pszPath;
1124
1125 if (!bNoLetter && (bAllFirst || (bRemoteFirst && GetCachedDriveType(szDrive) == DRIVE_REMOTE)))
1126 {
1127 bNoLetter = TRUE; // Handling the letter now, don't append it again later
1128 if (!bEditLabel)
1129 pszLabel += wsprintfW(pszPath, L"(%c:) ", szDrive[0]);
1130 }
1131
1132 if (GetDriveLabel(szDrive, pszLabel, MAX_PATH - 7) != S_OK && !bEditLabel)
1133 {
1134 UINT ResId = 0, DrvType = GetCachedDriveType(szDrive);
1135 if (DrvType == DRIVE_REMOVABLE)
1137 else if (DrvType < _countof(iDriveTypeIds))
1138 ResId = iDriveTypeIds[DrvType];
1139
1140 if (ResId)
1141 {
1142 UINT len = LoadStringW(shell32_hInstance, ResId, pszLabel, MAX_PATH - 7);
1143 if (len > MAX_PATH - 7)
1144 pszLabel[MAX_PATH-7] = UNICODE_NULL;
1145 }
1146 }
1147
1148 if (!*pszLabel && !bEditLabel) // No label nor fallback description, use SHGDN_FORPARSING
1149 *pszPath = UNICODE_NULL;
1150 else if (!bNoLetter && !bEditLabel)
1151 wsprintfW(pszPath + wcslen(pszPath), L" (%c:)", szDrive[0]);
1152 }
1153
1154 if (!*pszPath && !bEditLabel) // SHGDN_FORPARSING or failure above (except editing empty label)
1155 {
1157 szDrive[2] = UNICODE_NULL; // Remove backslash
1158 wcscpy(pszPath, szDrive);
1159 }
1160 strRet->uType = STRRET_WSTR;
1161 strRet->pOleStr = pszPath;
1162
1163 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1164 return S_OK;
1165}
static HRESULT GetDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
#define shell32_hInstance
wcscpy
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
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
INT WINAPI DECLSPEC_HOTPATCH LoadStringW(HINSTANCE instance, UINT resource_id, LPWSTR buffer, INT buflen)
Definition: string.c:1220
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLsizei len
Definition: glext.h:6722
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define debugstr_w
Definition: kernel32.h:32
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define UNICODE_NULL
#define err(...)
#define REG_DWORD
Definition: sdbapi.c:615
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
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193

Referenced by GetDetailsOf().

◆ GetEnumFlags()

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

Implements IFolderFilter.

Definition at line 86 of file CDrivesFolder.h.

86{ return E_NOTIMPL; }

◆ GetUIObjectOf()

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

Definition at line 1022 of file CDrivesFolder.cpp.

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

1373{
1374 return S_OK;
1375}

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1342 of file CDrivesFolder.cpp.

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

1405{
1406 switch (uMsg)
1407 {
1408 case SFVM_FSNOTIFY:
1409 if (lParam == SHCNE_DRIVEADD && wParam)
1410 {
1411 g_IsFloppyCache = 0;
1413 if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES)))
1414 return S_FALSE;
1415 }
1416 else if (lParam == SHCNE_DRIVEREMOVED)
1417 {
1418 g_IsFloppyCache = 0;
1419 }
1420 break;
1421 #if ROSPOLICY_DRIVESFOLDER_DEFLARGEICONS
1422 case SFVM_DEFVIEWMODE:
1424 return S_OK;
1425 #endif
1426 }
1427 return E_NOTIMPL;
1428}
UINT g_IsFloppyCache
static INT8 GetDriveNumber(PCUITEMID_CHILD pidl)
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1902
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1323
#define SHCNE_DRIVEADD
Definition: shlobj.h:1903
#define SFVM_FSNOTIFY
Definition: shlobj.h:1312
@ REST_NODRIVES
Definition: shlobj.h:1656
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 707 of file CDrivesFolder.cpp.

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

1194{
1196 if (SUCCEEDED(hr))
1197 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, DrivePath, DrivePath); // DisplayName changed
1198 else if (hwndOwner)
1199 SHELL_ErrorBox(hwndOwner, hr);
1200 return hr;
1201}
PWCHAR Label
Definition: format.c:70
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL WINAPI SetVolumeLabelW(IN LPCWSTR lpRootPathName, IN LPCWSTR lpVolumeName OPTIONAL)
Definition: volume.c:503
#define HResultFromWin32
Definition: loader.cpp:14
#define SHELL_ErrorBox
Definition: shellutils.h:126
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1912
#define SHCNF_PATHW
Definition: shlobj.h:1931
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 1179 of file CDrivesFolder.cpp.

1181{
1182 if (_ILIsDrive(pidl))
1183 {
1184 WCHAR szDrive[8];
1185 HRESULT hr = GetDrivePath(pidl, szDrive) >= 0 ? SetDriveLabel(hwndOwner, szDrive, lpName) : E_FAIL;
1186 if (pPidlOut)
1187 *pPidlOut = SUCCEEDED(hr) ? _ILCreateDrive(szDrive) : NULL;
1188 return hr;
1189 }
1190 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1191}
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 1394 of file CDrivesFolder.cpp.

1395{
1396 if (const CLSID* pClsid = IsRegItem(pidlItem))
1397 return SHELL32_IsShellFolderNamespaceItemHidden(L"HideMyComputerIcons", *pClsid) ? S_FALSE : S_OK;
1398 return S_OK;
1399}
BOOL SHELL32_IsShellFolderNamespaceItemHidden(LPCWSTR SubKey, REFCLSID Clsid)

Member Data Documentation

◆ m_DriveDisplayMode

INT8 CDrivesFolder::m_DriveDisplayMode
private

Definition at line 39 of file CDrivesFolder.h.

Referenced by CDrivesFolder(), and GetDisplayNameOf().

◆ m_regFolder

◆ pidlRoot

LPITEMIDLIST CDrivesFolder::pidlRoot
private

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