ReactOS 0.4.15-dev-7157-gb7dcc10
CDrivesFolder Class Reference

#include <CDrivesFolder.h>

Inheritance diagram for CDrivesFolder:
Collaboration diagram for CDrivesFolder:

Public Member Functions

 CDrivesFolder ()
 
 ~CDrivesFolder ()
 
HRESULT WINAPI FinalConstruct ()
 
virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 
virtual HRESULT WINAPI EnumObjects (HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
 
virtual HRESULT WINAPI BindToObject (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
 
virtual HRESULT WINAPI BindToStorage (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
 
virtual HRESULT WINAPI CompareIDs (LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
 
virtual HRESULT WINAPI CreateViewObject (HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
 
virtual HRESULT WINAPI GetAttributesOf (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
 
virtual HRESULT WINAPI GetUIObjectOf (HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
 
virtual HRESULT WINAPI GetDisplayNameOf (PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
 
virtual HRESULT WINAPI SetNameOf (HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
 
virtual HRESULT WINAPI GetDefaultSearchGUID (GUID *pguid)
 
virtual HRESULT WINAPI EnumSearches (IEnumExtraSearch **ppenum)
 
virtual HRESULT WINAPI GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
 
virtual HRESULT WINAPI GetDefaultColumnState (UINT iColumn, DWORD *pcsFlags)
 
virtual HRESULT WINAPI GetDetailsEx (PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
 
virtual HRESULT WINAPI GetDetailsOf (PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
 
virtual HRESULT WINAPI MapColumnToSCID (UINT column, SHCOLUMNID *pscid)
 
virtual HRESULT WINAPI GetClassID (CLSID *lpClassId)
 
virtual HRESULT WINAPI Initialize (PCIDLIST_ABSOLUTE pidl)
 
virtual HRESULT WINAPI GetCurFolder (PIDLIST_ABSOLUTE *pidl)
 
virtual HRESULT WINAPI CallBack (IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
- 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 595 of file CDrivesFolder.cpp.

596{
597 pidlRoot = NULL;
598}
LPITEMIDLIST pidlRoot
Definition: CDrivesFolder.h:35
#define NULL
Definition: types.h:112

◆ ~CDrivesFolder()

CDrivesFolder::~CDrivesFolder ( )

Definition at line 600 of file CDrivesFolder.cpp.

601{
602 TRACE ("-- destroying IShellFolder(%p)\n", this);
604}
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 
)
virtual

Definition at line 708 of file CDrivesFolder.cpp.

709{
710 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
711 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
712
713 if (!pidl)
714 return E_INVALIDARG;
715
716 if (_ILIsSpecialFolder(pidl))
717 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
718
719 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
720
721 PERSIST_FOLDER_TARGET_INFO pfti = {0};
722 pfti.dwAttributes = -1;
723 pfti.csidl = -1;
724 pfti.szTargetParsingName[0] = *pchDrive;
725 pfti.szTargetParsingName[1] = L':';
726 pfti.szTargetParsingName[2] = L'\\';
727
729 &pfti,
730 pidl,
731 &CLSID_ShellFSFolder,
732 riid,
733 ppvOut);
735 return hr;
736
737 return S_OK;
738}
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:2202
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:160
HRESULT hr
Definition: shlfolder.c:183
char CHAR
Definition: xmlstorage.h:175

Referenced by GetUIObjectOf().

◆ BindToStorage()

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

Definition at line 743 of file CDrivesFolder.cpp.

744{
745 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
746 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
747
748 *ppvOut = NULL;
749 return E_NOTIMPL;
750}
#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 
)
virtual

Implements IContextMenuCB.

Definition at line 1271 of file CDrivesFolder.cpp.

1272{
1273 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
1274 return S_OK;
1275
1276 /* no data object means no selection */
1277 if (!pdtobj)
1278 {
1279 if (uMsg == DFM_INVOKECOMMAND && wParam == 1) // #1
1280 {
1281 // "System" properties
1282 ShellExecuteW(hwndOwner,
1283 NULL,
1284 L"rundll32.exe",
1285 L"shell32.dll,Control_RunDLL sysdm.cpl",
1286 NULL,
1288 }
1289 else if (uMsg == DFM_MERGECONTEXTMENU)
1290 {
1291 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1292 HMENU hpopup = CreatePopupMenu();
1293 _InsertMenuItemW(hpopup, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED); // #0
1295 Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu++, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1296 DestroyMenu(hpopup);
1297 }
1298
1299 return S_OK;
1300 }
1301
1303 return S_OK;
1304
1305 return Shell_DefaultContextMenuCallBack(this, pdtobj);
1306}
#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:463
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:2379
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:2446
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2530
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:769
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 
)
virtual

Implements IShellFolder.

Definition at line 756 of file CDrivesFolder.cpp.

757{
759
760 if (!pidl1 || !pidl2)
761 {
762 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
763 return E_INVALIDARG;
764 }
765
766 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
767 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
768
769 UINT iColumn = LOWORD(lParam);
770 if (!_ILIsDrive(pidl1) || !_ILIsDrive(pidl2) || iColumn >= _countof(MyComputerSFHeader))
771 return E_INVALIDARG;
772
773 CHAR* pszDrive1 = _ILGetDataPointer(pidl1)->u.drive.szDriveName;
774 CHAR* pszDrive2 = _ILGetDataPointer(pidl2)->u.drive.szDriveName;
775
776 int result;
777 switch (MyComputerSFHeader[iColumn].colnameid)
778 {
780 {
781 result = stricmp(pszDrive1, pszDrive2);
783 break;
784 }
786 {
787 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
788 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
789 }
792 {
793 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
794
795 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
796 GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
797 else
798 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
799
800 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
801 GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
802 else
803 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
804
805 LARGE_INTEGER Diff;
806 if (lParam == 3) /* Size */
807 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
808 else /* Size available */
809 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
810
812 break;
813 }
816 break;
818 }
819
820 if (HRESULT_CODE(hres) == 0)
821 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
822
823 return hres;
824}
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:1979
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:573
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:216
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:239
#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 
)
virtual

Definition at line 829 of file CDrivesFolder.cpp.

830{
831 CComPtr<IShellView> pShellView;
833
834 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
835 hwndOwner, shdebugstr_guid (&riid), ppvOut);
836
837 if (!ppvOut)
838 return hr;
839
840 *ppvOut = NULL;
841
842 if (IsEqualIID(riid, IID_IDropTarget))
843 {
844 WARN("IDropTarget not implemented\n");
845 hr = E_NOTIMPL;
846 }
847 else if (IsEqualIID(riid, IID_IContextMenu))
848 {
849 HKEY hKeys[16];
850 UINT cKeys = 0;
851 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
852
853 DEFCONTEXTMENU dcm;
854 dcm.hwnd = hwndOwner;
855 dcm.pcmcb = this;
856 dcm.pidlFolder = pidlRoot;
857 dcm.psf = this;
858 dcm.cidl = 0;
859 dcm.apidl = NULL;
860 dcm.cKeys = cKeys;
861 dcm.aKeys = hKeys;
863 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
864 }
865 else if (IsEqualIID(riid, IID_IShellView))
866 {
867 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
868 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
869 }
870 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
871 return hr;
872}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4027
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
void AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:269
struct _SFV_CREATE SFV_CREATE
IContextMenuCB * pcmcb
Definition: shlobj.h:2468
IShellFolder * psf
Definition: shlobj.h:2470
IUnknown * punkAssociationInfo
Definition: shlobj.h:2473
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2472
const HKEY * aKeys
Definition: shlobj.h:2475
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2469

◆ EnumObjects()

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

Definition at line 697 of file CDrivesFolder.cpp.

698{
699 CComPtr<IEnumIDList> pRegEnumerator;
700 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
701
702 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
703}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define IID_PPV_ARG(Itype, ppType)

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1118 of file CDrivesFolder.cpp.

1119{
1120 FIXME ("(%p)\n", this);
1121 return E_NOTIMPL;
1122}

◆ FinalConstruct()

HRESULT WINAPI CDrivesFolder::FinalConstruct ( )

Definition at line 606 of file CDrivesFolder.cpp.

607{
608 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
609 if (pidlRoot == NULL)
610 return E_OUTOFMEMORY;
611
612 HRESULT hr = CRegFolder_CreateInstance(&CLSID_MyComputer,
613 pidlRoot,
614 L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
615 L"MyComputer",
617
618 return hr;
619}
HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:792
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1628

◆ GetAttributesOf()

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

Definition at line 877 of file CDrivesFolder.cpp.

878{
879 TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
880 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
881
882 if (cidl && !apidl)
883 return E_INVALIDARG;
884
885 if (*rgfInOut == 0)
886 *rgfInOut = ~0;
887
888 /* FIXME: always add SFGAO_CANLINK */
889 if(cidl == 0)
890 *rgfInOut &= dwComputerAttributes;
891 else
892 {
893 for (UINT i = 0; i < cidl; ++i)
894 {
895 if (_ILIsDrive(apidl[i]))
896 {
897 *rgfInOut &= dwDriveAttributes;
898
899 if (_ILGetDriveType(apidl[i]) == DRIVE_CDROM)
900 *rgfInOut &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
901 }
902 else if (_ILIsControlPanel(apidl[i]))
903 *rgfInOut &= dwControlPanelAttributes;
904 else if (_ILIsSpecialFolder(*apidl))
905 m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
906 else
907 ERR("Got unknown pidl type!\n");
908 }
909 }
910
911 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
912 *rgfInOut &= ~SFGAO_VALIDATE;
913
914 TRACE ("-- result=0x%08x\n", *rgfInOut);
915 return S_OK;
916}
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:1935

◆ GetClassID()

HRESULT WINAPI CDrivesFolder::GetClassID ( CLSID lpClassId)
virtual

Implements IPersist.

Definition at line 1233 of file CDrivesFolder.cpp.

1234{
1235 TRACE ("(%p)\n", this);
1236
1237 if (!lpClassId)
1238 return E_POINTER;
1239
1240 *lpClassId = CLSID_MyComputer;
1241 return S_OK;
1242}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurFolder()

HRESULT WINAPI CDrivesFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
virtual

Implements IPersistFolder2.

Definition at line 1257 of file CDrivesFolder.cpp.

1258{
1259 TRACE("(%p)->(%p)\n", this, pidl);
1260
1261 if (!pidl)
1262 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1263
1264 *pidl = ILClone(pidlRoot);
1265 return S_OK;
1266}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 1124 of file CDrivesFolder.cpp.

1125{
1126 TRACE ("(%p)\n", this);
1127
1128 if (pSort)
1129 *pSort = 0;
1130 if (pDisplay)
1131 *pDisplay = 0;
1132 return S_OK;
1133}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1135 of file CDrivesFolder.cpp.

1136{
1137 TRACE ("(%p)\n", this);
1138
1139 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1140 return E_INVALIDARG;
1141 *pcsFlags = MyComputerSFHeader[iColumn].pcsFlags;
1142 return S_OK;
1143}

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDrivesFolder::GetDefaultSearchGUID ( GUID pguid)
virtual

Implements IShellFolder2.

Definition at line 1112 of file CDrivesFolder.cpp.

1113{
1114 FIXME ("(%p)\n", this);
1115 return E_NOTIMPL;
1116}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1145 of file CDrivesFolder.cpp.

1146{
1147 FIXME ("(%p)\n", this);
1148 return E_NOTIMPL;
1149}

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1151 of file CDrivesFolder.cpp.

1152{
1153 HRESULT hr;
1154
1155 TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1156
1157 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1158 return E_INVALIDARG;
1159
1160 if (!pidl)
1161 {
1162 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1163 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1164 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1165 }
1166 else if (!_ILIsDrive(pidl))
1167 {
1168 switch (MyComputerSFHeader[iColumn].colnameid)
1169 {
1172 return m_regFolder->GetDetailsOf(pidl, iColumn, psd);
1175 return SHSetStrRet(&psd->str, ""); /* blank col */
1177 return m_regFolder->GetDetailsOf(pidl, 2, psd); /* 2 = comments */
1179 }
1180 }
1181 else
1182 {
1183 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1184 CHAR* pszDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
1185 UINT DriveType = GetDriveTypeA(pszDrive);
1188
1189 switch (MyComputerSFHeader[iColumn].colnameid)
1190 {
1193 break;
1195 if (DriveType == DRIVE_REMOVABLE && !IsDriveFloppyA(pszDrive))
1196 hr = SHSetStrRet(&psd->str, IDS_DRIVE_REMOVABLE);
1197 else
1198 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1199 break;
1202 psd->str.cStr[0] = 0x00;
1203 psd->str.uType = STRRET_CSTR;
1204 if (GetVolumeInformationA(pszDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1205 {
1206 GetDiskFreeSpaceExA(pszDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1207 if (iColumn == 2)
1208 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1209 else
1210 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1211 }
1212 hr = S_OK;
1213 break;
1215 hr = SHSetStrRet(&psd->str, ""); /* FIXME: comments */
1216 break;
1218 }
1219 }
1220
1221 return hr;
1222}
static int iDriveTypeIds[7]
UINT DriveType
virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
#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:2488
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 
)
virtual

Definition at line 987 of file CDrivesFolder.cpp.

988{
989 LPWSTR pszPath;
990 HRESULT hr = S_OK;
991
992 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
993 pdump (pidl);
994
995 if (!strRet)
996 return E_INVALIDARG;
997
998 if (!_ILIsPidlSimple (pidl))
999 {
1000 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1001 }
1002 else if (_ILIsSpecialFolder(pidl))
1003 {
1004 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1005 }
1006 else if (!_ILIsDrive(pidl))
1007 {
1008 ERR("Wrong pidl type\n");
1009 return E_INVALIDARG;
1010 }
1011
1012 pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1013 if (!pszPath)
1014 return E_OUTOFMEMORY;
1015
1016 pszPath[0] = 0;
1017
1018 _ILSimpleGetTextW(pidl, pszPath, MAX_PATH); /* append my own path */
1019 /* long view "lw_name (C:)" */
1020 if (!(dwFlags & SHGDN_FORPARSING))
1021 {
1022 WCHAR wszDrive[18] = {0};
1023
1024 lstrcpynW(wszDrive, pszPath, 4);
1025 pszPath[0] = L'\0';
1026
1027 if (!SUCCEEDED(getLabelForDrive(wszDrive, pszPath)))
1028 {
1029 DWORD dwVolumeSerialNumber, dwMaximumComponentLength, dwFileSystemFlags;
1030
1031 GetVolumeInformationW(wszDrive, pszPath,
1032 MAX_PATH - 7,
1033 &dwVolumeSerialNumber,
1034 &dwMaximumComponentLength, &dwFileSystemFlags, NULL, 0);
1035 pszPath[MAX_PATH-1] = L'\0';
1036
1037 if (!wcslen(pszPath))
1038 {
1040 DriveType = GetDriveTypeW(wszDrive);
1041
1042 switch (DriveType)
1043 {
1044 case DRIVE_FIXED:
1046 break;
1047 case DRIVE_REMOTE:
1049 break;
1050 case DRIVE_CDROM:
1052 break;
1053 default:
1054 ResourceId = 0;
1055 }
1056
1057 if (ResourceId)
1058 {
1059 dwFileSystemFlags = LoadStringW(shell32_hInstance, ResourceId, pszPath, MAX_PATH);
1060 if (dwFileSystemFlags > MAX_PATH - 7)
1061 pszPath[MAX_PATH-7] = L'\0';
1062 }
1063 }
1064 }
1065 wcscat (pszPath, L" (");
1066 wszDrive[2] = L'\0';
1067 wcscat (pszPath, wszDrive);
1068 wcscat (pszPath, L")");
1069 }
1070
1071 if (SUCCEEDED(hr))
1072 {
1073 strRet->uType = STRRET_WSTR;
1074 strRet->pOleStr = pszPath;
1075 }
1076 else
1077 CoTaskMemFree(pszPath);
1078
1079 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1080 return hr;
1081}
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:2122
_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:198
#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 
)
virtual

Definition at line 930 of file CDrivesFolder.cpp.

933{
934 LPVOID pObj = NULL;
936
937 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
938 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
939
940 if (!ppvOut)
941 return hr;
942
943 *ppvOut = NULL;
944
945 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
946 {
947 if (_ILIsDrive(apidl[0]))
948 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
949 else
950 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
951 }
952 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
953 {
954 hr = IDataObject_Constructor (hwndOwner,
955 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
956 }
957 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
958 {
959 if (_ILIsDrive(apidl[0]))
960 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
961 else
962 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
963 }
964 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
965 {
966 CComPtr<IShellFolder> psfChild;
967 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
969 return hr;
970
971 return psfChild->CreateViewObject(NULL, riid, ppvOut);
972 }
973 else
975
976 if (SUCCEEDED(hr) && !pObj)
978
979 *ppvOut = pObj;
980 TRACE ("(%p)->hr=0x%08x\n", this, hr);
981 return hr;
982}
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)
virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
const GUID IID_IDataObject
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ Initialize()

HRESULT WINAPI CDrivesFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
virtual

Implements IPersistFolder.

Definition at line 1249 of file CDrivesFolder.cpp.

1250{
1251 return S_OK;
1252}

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1224 of file CDrivesFolder.cpp.

1225{
1226 FIXME("(%p)\n", this);
1227 return E_NOTIMPL;
1228}

◆ ParseDisplayName()

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

Definition at line 624 of file CDrivesFolder.cpp.

626{
628 LPCWSTR szNext = NULL;
629 LPITEMIDLIST pidlTemp = NULL;
630 INT nDriveNumber;
631
632 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
633 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
634 pchEaten, ppidl, pdwAttributes);
635
636 *ppidl = 0;
637 if (pchEaten)
638 *pchEaten = 0; /* strange but like the original */
639
640 /* handle CLSID paths */
641 if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
642 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes);
643
644 nDriveNumber = PathGetDriveNumberW(lpszDisplayName);
645 if (nDriveNumber < 0)
646 return E_INVALIDARG;
647
648 /* check if this drive actually exists */
649 if ((::GetLogicalDrives() & (1 << nDriveNumber)) == 0)
650 {
652 }
653
654 pidlTemp = _ILCreateDrive(lpszDisplayName);
655 if (!pidlTemp)
656 return E_OUTOFMEMORY;
657
658 if (lpszDisplayName[2] == L'\\')
659 {
660 szNext = &lpszDisplayName[3];
661 }
662
663 if (szNext && *szNext)
664 {
665 hr = SHELL32_ParseNextElement (this, hwndOwner, pbc, &pidlTemp,
666 (LPOLESTR) szNext, pchEaten, pdwAttributes);
667 }
668 else
669 {
670 hr = S_OK;
671 if (pdwAttributes && *pdwAttributes)
672 {
673 if (_ILIsDrive(pidlTemp))
674 {
675 *pdwAttributes &= dwDriveAttributes;
676
677 if (_ILGetDriveType(pidlTemp) == DRIVE_CDROM)
678 *pdwAttributes &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
679 }
680 else if (_ILIsSpecialFolder(pidlTemp))
681 m_regFolder->GetAttributesOf(1, &pidlTemp, pdwAttributes);
682 else
683 ERR("Got an unknown pidl here!\n");
684 }
685 }
686
687 *ppidl = pidlTemp;
688
689 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
690
691 return hr;
692}
int WINAPI PathGetDriveNumberW(const WCHAR *path)
Definition: path.c:553
static LPOLESTR
Definition: stg_prop.c:27
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
Definition: pidl.c:1823
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:71
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
int32_t INT
Definition: typedefs.h:58
DWORD WINAPI GetLogicalDrives(void)
Definition: disk.c:110
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define ERROR_INVALID_DRIVE
Definition: winerror.h:118
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 1095 of file CDrivesFolder.cpp.

1097{
1098 WCHAR szName[30];
1099
1100 if (_ILIsDrive(pidl))
1101 {
1104 if (pPidlOut)
1105 *pPidlOut = _ILCreateDrive(szName);
1106 return S_OK;
1107 }
1108
1109 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1110}
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: