ReactOS 0.4.15-dev-7942-gd23573b
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
 
- 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)
 

Private Attributes

LPITEMIDLIST pidlRoot
 
CComPtr< IShellFolder2m_regFolder
 

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
 
- 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)
 
- 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 628 of file CDrivesFolder.cpp.

629{
630 pidlRoot = NULL;
631}
LPITEMIDLIST pidlRoot
Definition: CDrivesFolder.h:35
#define NULL
Definition: types.h:112

◆ ~CDrivesFolder()

CDrivesFolder::~CDrivesFolder ( )

Definition at line 633 of file CDrivesFolder.cpp.

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

Member Function Documentation

◆ BindToObject()

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

Definition at line 744 of file CDrivesFolder.cpp.

745{
746 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
747 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
748
749 if (!pidl)
750 return E_INVALIDARG;
751
752 if (_ILIsSpecialFolder(pidl))
753 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
754
755 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
756
757 PERSIST_FOLDER_TARGET_INFO pfti = {0};
758 pfti.dwAttributes = -1;
759 pfti.csidl = -1;
760 pfti.szTargetParsingName[0] = *pchDrive;
761 pfti.szTargetParsingName[1] = L':';
762 pfti.szTargetParsingName[2] = L'\\';
763
765 &pfti,
766 pidl,
767 &CLSID_ShellFSFolder,
768 riid,
769 ppvOut);
771 return hr;
772
773 return S_OK;
774}
CComPtr< IShellFolder2 > m_regFolder
Definition: CDrivesFolder.h:36
#define E_INVALIDARG
Definition: ddrawi.h:101
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:428
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define L(x)
Definition: ntvdm.h:50
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2231
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:168
HRESULT hr
Definition: shlfolder.c:183
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 779 of file CDrivesFolder.cpp.

780{
781 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
782 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
783
784 *ppvOut = NULL;
785 return E_NOTIMPL;
786}
#define FIXME(fmt,...)
Definition: debug.h:111
#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 1307 of file CDrivesFolder.cpp.

1308{
1309 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
1310 return S_OK;
1311
1312 /* no data object means no selection */
1313 if (!pdtobj)
1314 {
1315 if (uMsg == DFM_INVOKECOMMAND && wParam == 1) // #1
1316 {
1317 // "System" properties
1318 ShellExecuteW(hwndOwner,
1319 NULL,
1320 L"rundll32.exe",
1321 L"shell32.dll,Control_RunDLL sysdm.cpl",
1322 NULL,
1324 }
1325 else if (uMsg == DFM_MERGECONTEXTMENU)
1326 {
1327 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1328 HMENU hpopup = CreatePopupMenu();
1329 _InsertMenuItemW(hpopup, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED); // #0
1331 Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu++, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1332 DestroyMenu(hpopup);
1333 }
1334
1335 return S_OK;
1336 }
1337
1339 return S_OK;
1340
1341 return Shell_DefaultContextMenuCallBack(this, pdtobj);
1342}
#define IDS_PROPERTIES
Definition: resource.h:102
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define TRUE
Definition: types.h:120
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:497
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2402
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:2513
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
HMENU hmenu
Definition: shlobj.h:1381
UINT idCmdLast
Definition: shlobj.h:1384
UINT idCmdFirst
Definition: shlobj.h:1383
UINT indexMenu
Definition: shlobj.h:1382
#define SW_SHOWNORMAL
Definition: winuser.h:770
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFT_SEPARATOR
Definition: winuser.h:744
#define MFS_ENABLED
Definition: winuser.h:750
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:746
#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 792 of file CDrivesFolder.cpp.

793{
795
796 if (!pidl1 || !pidl2)
797 {
798 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
799 return E_INVALIDARG;
800 }
801
802 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
803 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
804
805 UINT iColumn = LOWORD(lParam);
806 if (!_ILIsDrive(pidl1) || !_ILIsDrive(pidl2) || iColumn >= _countof(MyComputerSFHeader))
807 return E_INVALIDARG;
808
809 CHAR* pszDrive1 = _ILGetDataPointer(pidl1)->u.drive.szDriveName;
810 CHAR* pszDrive2 = _ILGetDataPointer(pidl2)->u.drive.szDriveName;
811
812 int result;
813 switch (MyComputerSFHeader[iColumn].colnameid)
814 {
816 {
817 result = stricmp(pszDrive1, pszDrive2);
819 break;
820 }
822 {
823 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
824 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
825 }
828 {
829 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
830
831 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
832 GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
833 else
834 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
835
836 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
837 GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
838 else
839 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
840
841 LARGE_INTEGER Diff;
842 if (lParam == 3) /* Size */
843 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
844 else /* Size available */
845 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
846
848 break;
849 }
852 break;
854 }
855
856 if (HRESULT_CODE(hres) == 0)
857 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
858
859 return hres;
860}
static const shvheader MyComputerSFHeader[]
#define ERR(fmt,...)
Definition: debug.h:110
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:75
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:74
#define stricmp(_String1, _String2)
Definition: compat.h:24
BOOL WINAPI GetDiskFreeSpaceExA(IN LPCSTR lpDirectoryName OPTIONAL, OUT PULARGE_INTEGER lpFreeBytesAvailableToCaller, OUT PULARGE_INTEGER lpTotalNumberOfBytes, OUT PULARGE_INTEGER lpTotalNumberOfFreeBytes)
Definition: disk.c:313
BOOL WINAPI GetVolumeInformationA(IN LPCSTR lpRootPathName, IN LPSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
Definition: volume.c:32
GLuint64EXT * result
Definition: glext.h:11304
HRESULT hres
Definition: protocol.c:465
unsigned int UINT
Definition: ndis.h:50
#define DEFAULT_UNREACHABLE
#define LOWORD(l)
Definition: pedump.c:82
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2008
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:579
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:224
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:247
#define IDS_SHV_COLUMN_DISK_AVAILABLE
Definition: shresdef.h:57
#define IDS_SHV_COLUMN_DISK_CAPACITY
Definition: shresdef.h:56
#define IDS_SHV_COLUMN_COMMENTS
Definition: shresdef.h:69
#define _countof(array)
Definition: sndvol32.h:68
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
LONGLONG QuadPart
Definition: typedefs.h:114
#define HRESULT_CODE(hr)
Definition: winerror.h:76

◆ CreateViewObject()

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

Definition at line 865 of file CDrivesFolder.cpp.

866{
867 CComPtr<IShellView> pShellView;
869
870 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
871 hwndOwner, shdebugstr_guid (&riid), ppvOut);
872
873 if (!ppvOut)
874 return hr;
875
876 *ppvOut = NULL;
877
878 if (IsEqualIID(riid, IID_IDropTarget))
879 {
880 WARN("IDropTarget not implemented\n");
881 hr = E_NOTIMPL;
882 }
883 else if (IsEqualIID(riid, IID_IContextMenu))
884 {
885 HKEY hKeys[16];
886 UINT cKeys = 0;
887 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
888
889 DEFCONTEXTMENU dcm;
890 dcm.hwnd = hwndOwner;
891 dcm.pcmcb = this;
892 dcm.pidlFolder = pidlRoot;
893 dcm.psf = this;
894 dcm.cidl = 0;
895 dcm.apidl = NULL;
896 dcm.cKeys = cKeys;
897 dcm.aKeys = hKeys;
899 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
900 }
901 else if (IsEqualIID(riid, IID_IShellView))
902 {
903 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
904 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
905 }
906 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
907 return hr;
908}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3857
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
#define WARN(fmt,...)
Definition: debug.h:112
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
struct _SFV_CREATE SFV_CREATE
IContextMenuCB * pcmcb
Definition: shlobj.h:2535
IShellFolder * psf
Definition: shlobj.h:2537
IUnknown * punkAssociationInfo
Definition: shlobj.h:2540
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2539
const HKEY * aKeys
Definition: shlobj.h:2542
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2536

◆ EnumObjects()

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

Definition at line 733 of file CDrivesFolder.cpp.

734{
735 CComPtr<IEnumIDList> pRegEnumerator;
736 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
737
738 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
739}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define IID_PPV_ARG(Itype, ppType)

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1154 of file CDrivesFolder.cpp.

1155{
1156 FIXME("(%p)\n", this);
1157 return E_NOTIMPL;
1158}

◆ FinalConstruct()

HRESULT WINAPI CDrivesFolder::FinalConstruct ( )

Definition at line 639 of file CDrivesFolder.cpp.

640{
641 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
642 if (pidlRoot == NULL)
643 return E_OUTOFMEMORY;
644
645 HRESULT hr = CRegFolder_CreateInstance(&CLSID_MyComputer,
646 pidlRoot,
647 L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
648 L"MyComputer",
650
651 return hr;
652}
HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:866
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1657

◆ GetAttributesOf()

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

Definition at line 913 of file CDrivesFolder.cpp.

914{
915 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
916 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
917
918 if (cidl && !apidl)
919 return E_INVALIDARG;
920
921 if (*rgfInOut == 0)
922 *rgfInOut = ~0;
923
924 /* FIXME: always add SFGAO_CANLINK */
925 if(cidl == 0)
926 *rgfInOut &= dwComputerAttributes;
927 else
928 {
929 for (UINT i = 0; i < cidl; ++i)
930 {
931 if (_ILIsDrive(apidl[i]))
932 {
933 *rgfInOut &= dwDriveAttributes;
934
935 if (_ILGetDriveType(apidl[i]) == DRIVE_CDROM)
936 *rgfInOut &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
937 }
938 else if (_ILIsControlPanel(apidl[i]))
939 *rgfInOut &= dwControlPanelAttributes;
940 else if (_ILIsSpecialFolder(*apidl))
941 m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
942 else
943 ERR("Got unknown pidl type!\n");
944 }
945 }
946
947 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
948 *rgfInOut &= ~SFGAO_VALIDATE;
949
950 TRACE("-- result=0x%08x\n", *rgfInOut);
951 return S_OK;
952}
BOOL _ILGetDriveType(LPCITEMIDLIST pidl)
static const DWORD dwComputerAttributes
static const DWORD dwDriveAttributes
static const DWORD dwControlPanelAttributes
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define DRIVE_CDROM
Definition: machpc98.h:119
BOOL _ILIsControlPanel(LPCITEMIDLIST pidl)
Definition: pidl.c:1964

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CDrivesFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1269 of file CDrivesFolder.cpp.

1270{
1271 TRACE("(%p)\n", this);
1272
1273 if (!lpClassId)
1274 return E_POINTER;
1275
1276 *lpClassId = CLSID_MyComputer;
1277 return S_OK;
1278}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurFolder()

HRESULT WINAPI CDrivesFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1293 of file CDrivesFolder.cpp.

1294{
1295 TRACE("(%p)->(%p)\n", this, pidl);
1296
1297 if (!pidl)
1298 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1299
1300 *pidl = ILClone(pidlRoot);
1301 return S_OK;
1302}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 1160 of file CDrivesFolder.cpp.

1161{
1162 TRACE("(%p)\n", this);
1163
1164 if (pSort)
1165 *pSort = 0;
1166 if (pDisplay)
1167 *pDisplay = 0;
1168 return S_OK;
1169}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1171 of file CDrivesFolder.cpp.

1172{
1173 TRACE("(%p)\n", this);
1174
1175 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1176 return E_INVALIDARG;
1177 *pcsFlags = MyComputerSFHeader[iColumn].pcsFlags;
1178 return S_OK;
1179}

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 1148 of file CDrivesFolder.cpp.

1149{
1150 FIXME("(%p)\n", this);
1151 return E_NOTIMPL;
1152}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1181 of file CDrivesFolder.cpp.

1182{
1183 FIXME("(%p)\n", this);
1184 return E_NOTIMPL;
1185}

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1187 of file CDrivesFolder.cpp.

1188{
1189 HRESULT hr;
1190
1191 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1192
1193 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1194 return E_INVALIDARG;
1195
1196 if (!pidl)
1197 {
1198 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1199 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1200 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1201 }
1202 else if (!_ILIsDrive(pidl))
1203 {
1204 switch (MyComputerSFHeader[iColumn].colnameid)
1205 {
1208 return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
1211 return SHSetStrRet(&psd->str, ""); /* blank col */
1213 return m_regFolder->GetDetailsOf(pidl, 2, psd); /* 2 = comments */
1215 }
1216 }
1217 else
1218 {
1219 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1220 CHAR* pszDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
1221 UINT DriveType = GetDriveTypeA(pszDrive);
1224
1225 switch (MyComputerSFHeader[iColumn].colnameid)
1226 {
1229 break;
1231 if (DriveType == DRIVE_REMOVABLE && !IsDriveFloppyA(pszDrive))
1232 hr = SHSetStrRet(&psd->str, IDS_DRIVE_REMOVABLE);
1233 else
1234 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1235 break;
1238 psd->str.cStr[0] = 0x00;
1239 psd->str.uType = STRRET_CSTR;
1240 if (GetVolumeInformationA(pszDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1241 {
1242 GetDiskFreeSpaceExA(pszDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1243 if (iColumn == 2)
1244 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1245 else
1246 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1247 }
1248 hr = S_OK;
1249 break;
1251 hr = SHSetStrRet(&psd->str, ""); /* FIXME: comments */
1252 break;
1254 }
1255 }
1256
1257 return hr;
1258}
static int iDriveTypeIds[7]
UINT DriveType
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
#define MAX_PATH
Definition: compat.h:34
UINT WINAPI GetDriveTypeA(IN LPCSTR lpRootPathName)
Definition: disk.c:468
LPSTR WINAPI StrFormatByteSize64A(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:2496
BOOL IsDriveFloppyA(LPCSTR pszDriveRoot)
Definition: drvdefext.cpp:386
#define IDS_DRIVE_REMOVABLE
Definition: shresdef.h:117
@ 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_RAMDISK
Definition: winbase.h:255
#define DRIVE_FIXED
Definition: winbase.h:252
#define DRIVE_REMOVABLE
Definition: winbase.h:251

◆ GetDisplayNameOf()

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

Definition at line 1023 of file CDrivesFolder.cpp.

1024{
1025 LPWSTR pszPath;
1026 HRESULT hr = S_OK;
1027
1028 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1029 pdump (pidl);
1030
1031 if (!strRet)
1032 return E_INVALIDARG;
1033
1034 if (!_ILIsPidlSimple (pidl))
1035 {
1036 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1037 }
1038 else if (_ILIsSpecialFolder(pidl))
1039 {
1040 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1041 }
1042 else if (!_ILIsDrive(pidl))
1043 {
1044 ERR("Wrong pidl type\n");
1045 return E_INVALIDARG;
1046 }
1047
1048 pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1049 if (!pszPath)
1050 return E_OUTOFMEMORY;
1051
1052 pszPath[0] = 0;
1053
1054 _ILSimpleGetTextW(pidl, pszPath, MAX_PATH); /* append my own path */
1055 /* long view "lw_name (C:)" */
1056 if (!(dwFlags & SHGDN_FORPARSING))
1057 {
1058 WCHAR wszDrive[18] = {0};
1059
1060 lstrcpynW(wszDrive, pszPath, 4);
1061 pszPath[0] = L'\0';
1062
1063 if (!SUCCEEDED(getLabelForDrive(wszDrive, pszPath)))
1064 {
1065 DWORD dwVolumeSerialNumber, dwMaximumComponentLength, dwFileSystemFlags;
1066
1067 GetVolumeInformationW(wszDrive, pszPath,
1068 MAX_PATH - 7,
1069 &dwVolumeSerialNumber,
1070 &dwMaximumComponentLength, &dwFileSystemFlags, NULL, 0);
1071 pszPath[MAX_PATH-1] = L'\0';
1072
1073 if (!wcslen(pszPath))
1074 {
1076 DriveType = GetDriveTypeW(wszDrive);
1077
1078 switch (DriveType)
1079 {
1080 case DRIVE_FIXED:
1082 break;
1083 case DRIVE_REMOTE:
1085 break;
1086 case DRIVE_CDROM:
1088 break;
1089 default:
1090 ResourceId = 0;
1091 }
1092
1093 if (ResourceId)
1094 {
1095 dwFileSystemFlags = LoadStringW(shell32_hInstance, ResourceId, pszPath, MAX_PATH);
1096 if (dwFileSystemFlags > MAX_PATH - 7)
1097 pszPath[MAX_PATH-7] = L'\0';
1098 }
1099 }
1100 }
1101 wcscat(pszPath, L" (");
1102 wszDrive[2] = L'\0';
1103 wcscat(pszPath, wszDrive);
1104 wcscat(pszPath, L")");
1105 }
1106
1107 if (SUCCEEDED(hr))
1108 {
1109 strRet->uType = STRRET_WSTR;
1110 strRet->pOleStr = pszPath;
1111 }
1112 else
1113 CoTaskMemFree(pszPath);
1114
1115 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1116 return hr;
1117}
static HRESULT getLabelForDrive(LPWSTR wszPath, LPWSTR wszLabel)
INT ResourceId
#define shell32_hInstance
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:311
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define lstrcpynW
Definition: compat.h:738
UINT WINAPI GetDriveTypeW(IN LPCWSTR lpRootPathName)
Definition: disk.c:497
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
unsigned long DWORD
Definition: ntddk_ex.h:95
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_w
Definition: kernel32.h:32
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2151
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
#define IDS_DRIVE_CDROM
Definition: shresdef.h:114
#define IDS_DRIVE_FIXED
Definition: shresdef.h:113
#define IDS_DRIVE_NETWORK
Definition: shresdef.h:115
@ STRRET_WSTR
Definition: shtypes.idl:85
LPWSTR pOleStr
Definition: shtypes.idl:96
#define DRIVE_REMOTE
Definition: winbase.h:253
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by GetDetailsOf().

◆ GetUIObjectOf()

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

Definition at line 966 of file CDrivesFolder.cpp.

969{
970 LPVOID pObj = NULL;
972
973 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
974 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
975
976 if (!ppvOut)
977 return hr;
978
979 *ppvOut = NULL;
980
981 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
982 {
983 if (_ILIsDrive(apidl[0]))
984 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
985 else
986 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
987 }
988 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
989 {
990 hr = IDataObject_Constructor(hwndOwner,
991 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
992 }
993 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
994 {
995 if (_ILIsDrive(apidl[0]))
996 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
997 else
998 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
999 }
1000 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
1001 {
1002 CComPtr<IShellFolder> psfChild;
1003 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1005 return hr;
1006
1007 return psfChild->CreateViewObject(NULL, riid, ppvOut);
1008 }
1009 else
1010 hr = E_NOINTERFACE;
1011
1012 if (SUCCEEDED(hr) && !pObj)
1013 hr = E_OUTOFMEMORY;
1014
1015 *ppvOut = pObj;
1016 TRACE("(%p)->hr=0x%08x\n", this, hr);
1017 return hr;
1018}
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
const GUID IID_IDataObject
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ Initialize()

HRESULT WINAPI CDrivesFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1285 of file CDrivesFolder.cpp.

1286{
1287 return S_OK;
1288}

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1260 of file CDrivesFolder.cpp.

1261{
1262 FIXME("(%p)\n", this);
1263 return E_NOTIMPL;
1264}

◆ ParseDisplayName()

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

Definition at line 657 of file CDrivesFolder.cpp.

659{
661
662 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
663 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
664 pchEaten, ppidl, pdwAttributes);
665
666 if (!ppidl)
667 return hr;
668
669 *ppidl = NULL;
670
671 if (!lpszDisplayName)
672 return hr;
673
674 /* handle CLSID paths */
675 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
676 {
677 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
678 pdwAttributes);
679 }
680
681 if (lpszDisplayName[0] &&
682 ((L'A' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'Z') ||
683 (L'a' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'z')) &&
684 lpszDisplayName[1] == L':' && lpszDisplayName[2] == L'\\')
685 {
686 // "C:\..."
687 WCHAR szRoot[8];
688 PathBuildRootW(szRoot, ((*lpszDisplayName - 1) & 0x1F));
689
690 if (SHIsFileSysBindCtx(pbc, NULL) != S_OK && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
691 {
692 if (::GetDriveType(szRoot) == DRIVE_NO_ROOT_DIR)
694 }
695
696 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateDrive(szRoot));
697 if (!pidlTemp)
698 return E_OUTOFMEMORY;
699
700 if (lpszDisplayName[3])
701 {
702 CComPtr<IShellFolder> pChildFolder;
703 hr = BindToObject(pidlTemp, pbc, IID_PPV_ARG(IShellFolder, &pChildFolder));
705 return hr;
706
707 ULONG chEaten;
708 CComHeapPtr<ITEMIDLIST> pidlChild;
709 hr = pChildFolder->ParseDisplayName(hwndOwner, pbc, &lpszDisplayName[3], &chEaten,
710 &pidlChild, pdwAttributes);
712 return hr;
713
714 hr = SHILCombine(pidlTemp, pidlChild, ppidl);
715 }
716 else
717 {
718 *ppidl = pidlTemp.Detach();
719 if (pdwAttributes && *pdwAttributes)
720 GetAttributesOf(1, (PCUITEMID_CHILD_ARRAY)ppidl, pdwAttributes);
721 hr = S_OK;
722 }
723 }
724
725 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr);
726
727 return hr;
728}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:114
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:139
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:1852
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:257
#define GetDriveType
Definition: winbase.h:3812
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 1131 of file CDrivesFolder.cpp.

1133{
1134 WCHAR szName[30];
1135
1136 if (_ILIsDrive(pidl))
1137 {
1140 if (pPidlOut)
1141 *pPidlOut = _ILCreateDrive(szName);
1142 return S_OK;
1143 }
1144
1145 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1146}
BOOL WINAPI SetVolumeLabelW(IN LPCWSTR lpRootPathName, IN LPCWSTR lpVolumeName OPTIONAL)
Definition: volume.c:503
static const WCHAR szName[]
Definition: powrprof.c:45
_In_ LPCSTR lpName
Definition: winbase.h:2789

Member Data Documentation

◆ m_regFolder

◆ pidlRoot

LPITEMIDLIST CDrivesFolder::pidlRoot
private

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