2 * Virtual Workplace folder
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2009 Andrew Hill
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
28 CDrivesFolder should create a CRegFolder to represent the virtual items that exist only in
29 the registry. The CRegFolder is aggregated by the CDrivesFolder.
30 The CDrivesFolderEnum class should enumerate only drives on the system. Since the CRegFolder
31 implementation of IShellFolder::EnumObjects enumerates the virtual items, the
32 CDrivesFolderEnum is only responsible for returning the physical items.
34 2. At least on my XP system, the drive pidls returned are of type PT_DRIVE1, not PT_DRIVE
35 3. The parsing name returned for my computer is incorrect. It should be "My Computer"
38 /***********************************************************************
39 * IShellFolder implementation
42 class CDrivesFolderEnum
:
43 public IEnumIDListImpl
48 HRESULT WINAPI
Initialize(HWND hwndOwner
, DWORD dwFlags
);
49 BOOL
CreateMyCompEnumList(DWORD dwFlags
);
51 BEGIN_COM_MAP(CDrivesFolderEnum
)
52 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList
, IEnumIDList
)
56 /***********************************************************************
57 * IShellFolder [MyComputer] implementation
60 static const shvheader MyComputerSFHeader
[] = {
61 {IDS_SHV_COLUMN1
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 15},
62 {IDS_SHV_COLUMN3
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
63 {IDS_SHV_COLUMN6
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
64 {IDS_SHV_COLUMN7
, SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
, LVCFMT_RIGHT
, 10},
67 #define MYCOMPUTERSHELLVIEWCOLUMNS 4
69 CDrivesFolderEnum::CDrivesFolderEnum()
73 CDrivesFolderEnum::~CDrivesFolderEnum()
77 HRESULT WINAPI
CDrivesFolderEnum::Initialize(HWND hwndOwner
, DWORD dwFlags
)
79 if (CreateMyCompEnumList(dwFlags
) == FALSE
)
85 /**************************************************************************
86 * CDrivesFolderEnum::CreateMyCompEnumList()
89 BOOL
CDrivesFolderEnum::CreateMyCompEnumList(DWORD dwFlags
)
92 static const WCHAR MyComputer_NameSpaceW
[] = L
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\Namespace";
94 TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags
);
96 /* enumerate the folders */
97 if (dwFlags
& SHCONTF_FOLDERS
)
99 WCHAR wszDriveName
[] = {'A', ':', '\\', '\0'};
100 DWORD dwDrivemap
= GetLogicalDrives();
104 while (bRet
&& wszDriveName
[0] <= 'Z')
106 if(dwDrivemap
& 0x00000001L
)
107 bRet
= AddToEnumList(_ILCreateDrive(wszDriveName
));
109 dwDrivemap
= dwDrivemap
>> 1;
112 TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n", this);
113 for (i
= 0; i
< 2; i
++)
115 if (bRet
&& ERROR_SUCCESS
== RegOpenKeyExW(i
== 0 ? HKEY_LOCAL_MACHINE
: HKEY_CURRENT_USER
,
116 MyComputer_NameSpaceW
, 0, KEY_READ
, &hKey
))
125 dwSize
= sizeof(wszBuf
) / sizeof(wszBuf
[0]);
126 ErrorCode
= RegEnumKeyExW(hKey
, j
, wszBuf
, &dwSize
, 0, NULL
, NULL
, NULL
);
127 if (ERROR_SUCCESS
== ErrorCode
)
129 if (wszBuf
[0] != L
'{')
131 dwSize
= sizeof(wszBuf
);
132 RegGetValueW(hKey
, wszBuf
, NULL
, RRF_RT_REG_SZ
, NULL
, wszBuf
, &dwSize
);
135 /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */
136 pidl
= _ILCreateGuidFromStrW(wszBuf
);
138 bRet
= AddToEnumList(pidl
);
140 ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf
);
143 else if (ERROR_NO_MORE_ITEMS
== ErrorCode
)
155 CDrivesFolder::CDrivesFolder()
161 CDrivesFolder::~CDrivesFolder()
163 TRACE ("-- destroying IShellFolder(%p)\n", this);
167 HRESULT WINAPI
CDrivesFolder::FinalConstruct()
170 WCHAR szName
[MAX_PATH
];
171 WCHAR wszMyCompKey
[256];
174 pidlRoot
= _ILCreateMyComputer(); /* my qualified pidl */
175 if (pidlRoot
== NULL
)
176 return E_OUTOFMEMORY
;
178 i
= swprintf(wszMyCompKey
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\");
179 StringFromGUID2(CLSID_MyComputer
, wszMyCompKey
+ i
, sizeof(wszMyCompKey
) / sizeof(wszMyCompKey
[0]) - i
);
180 dwSize
= sizeof(szName
);
181 if (RegGetValueW(HKEY_CURRENT_USER
, wszMyCompKey
,
182 NULL
, RRF_RT_REG_SZ
, NULL
, szName
, &dwSize
) == ERROR_SUCCESS
)
184 sName
= (LPWSTR
)SHAlloc((wcslen(szName
) + 1) * sizeof(WCHAR
));
186 wcscpy(sName
, szName
);
187 TRACE("sName %s\n", debugstr_w(sName
));
192 /**************************************************************************
193 * CDrivesFolder::ParseDisplayName
195 HRESULT WINAPI
CDrivesFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
196 DWORD
* pchEaten
, PIDLIST_RELATIVE
* ppidl
, DWORD
* pdwAttributes
)
198 HRESULT hr
= E_INVALIDARG
;
199 LPCWSTR szNext
= NULL
;
200 WCHAR szElement
[MAX_PATH
];
201 LPITEMIDLIST pidlTemp
= NULL
;
204 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
205 hwndOwner
, pbc
, lpszDisplayName
, debugstr_w (lpszDisplayName
),
206 pchEaten
, ppidl
, pdwAttributes
);
210 *pchEaten
= 0; /* strange but like the original */
212 /* handle CLSID paths */
213 if (lpszDisplayName
[0] == ':' && lpszDisplayName
[1] == ':')
215 szNext
= GetNextElementW (lpszDisplayName
, szElement
, MAX_PATH
);
216 TRACE ("-- element: %s\n", debugstr_w (szElement
));
217 CLSIDFromString (szElement
+ 2, &clsid
);
218 pidlTemp
= _ILCreateGuid (PT_GUID
, clsid
);
220 /* do we have an absolute path name ? */
221 else if (PathGetDriveNumberW (lpszDisplayName
) >= 0 &&
222 lpszDisplayName
[2] == (WCHAR
) '\\')
224 szNext
= GetNextElementW (lpszDisplayName
, szElement
, MAX_PATH
);
225 /* make drive letter uppercase to enable PIDL comparison */
226 szElement
[0] = toupper(szElement
[0]);
227 pidlTemp
= _ILCreateDrive (szElement
);
230 if (szNext
&& *szNext
)
232 hr
= SHELL32_ParseNextElement (this, hwndOwner
, pbc
, &pidlTemp
,
233 (LPOLESTR
) szNext
, pchEaten
, pdwAttributes
);
237 if (pdwAttributes
&& *pdwAttributes
)
238 SHELL32_GetItemAttributes (this,
239 pidlTemp
, pdwAttributes
);
245 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr
);
250 /**************************************************************************
251 * CDrivesFolder::EnumObjects
253 HRESULT WINAPI
CDrivesFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
255 CComObject
<CDrivesFolderEnum
> *theEnumerator
;
256 CComPtr
<IEnumIDList
> result
;
259 TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner
, dwFlags
, ppEnumIDList
);
261 if (ppEnumIDList
== NULL
)
264 *ppEnumIDList
= NULL
;
265 ATLTRY(theEnumerator
= new CComObject
<CDrivesFolderEnum
>);
267 if (theEnumerator
== NULL
)
268 return E_OUTOFMEMORY
;
270 hResult
= theEnumerator
->QueryInterface(IID_IEnumIDList
, (void **)&result
);
273 delete theEnumerator
;
277 hResult
= theEnumerator
->Initialize(hwndOwner
, dwFlags
);
280 *ppEnumIDList
= result
.Detach();
282 TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList
);
287 /**************************************************************************
288 * CDrivesFolder::BindToObject
290 HRESULT WINAPI
CDrivesFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
292 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
293 pidl
, pbcReserved
, shdebugstr_guid(&riid
), ppvOut
);
295 return SHELL32_BindToChild(pidlRoot
, NULL
, pidl
, riid
, ppvOut
);
298 /**************************************************************************
299 * CDrivesFolder::BindToStorage
301 HRESULT WINAPI
CDrivesFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
303 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
304 pidl
, pbcReserved
, shdebugstr_guid (&riid
), ppvOut
);
310 /**************************************************************************
311 * CDrivesFolder::CompareIDs
314 HRESULT WINAPI
CDrivesFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
318 TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", this, lParam
, pidl1
, pidl2
);
319 nReturn
= SHELL32_CompareIDs (this, lParam
, pidl1
, pidl2
);
320 TRACE("-- %i\n", nReturn
);
324 /**************************************************************************
325 * CDrivesFolder::CreateViewObject
327 HRESULT WINAPI
CDrivesFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
* ppvOut
)
329 CComPtr
<IShellView
> pShellView
;
330 HRESULT hr
= E_INVALIDARG
;
332 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
333 hwndOwner
, shdebugstr_guid (&riid
), ppvOut
);
340 if (IsEqualIID(riid
, IID_IDropTarget
))
342 WARN("IDropTarget not implemented\n");
345 else if (IsEqualIID(riid
, IID_IContextMenu
))
347 WARN("IContextMenu not implemented\n");
350 else if (IsEqualIID(riid
, IID_IShellView
))
352 hr
= IShellView_Constructor ((IShellFolder
*)this, &pShellView
);
355 hr
= pShellView
->QueryInterface(riid
, ppvOut
);
358 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut
);
362 /**************************************************************************
363 * CDrivesFolder::GetAttributesOf
365 HRESULT WINAPI
CDrivesFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
* rgfInOut
)
367 static const DWORD dwComputerAttributes
=
368 SFGAO_CANRENAME
| SFGAO_CANDELETE
| SFGAO_HASPROPSHEET
| SFGAO_DROPTARGET
|
369 SFGAO_FILESYSANCESTOR
| SFGAO_FOLDER
| SFGAO_HASSUBFOLDER
| SFGAO_CANLINK
;
370 static const DWORD dwControlPanelAttributes
=
371 SFGAO_HASSUBFOLDER
| SFGAO_FOLDER
| SFGAO_CANLINK
;
372 static const DWORD dwDriveAttributes
=
373 SFGAO_HASSUBFOLDER
| SFGAO_FILESYSTEM
| SFGAO_FOLDER
| SFGAO_FILESYSANCESTOR
|
374 SFGAO_DROPTARGET
| SFGAO_HASPROPSHEET
| SFGAO_CANRENAME
| SFGAO_CANLINK
;
376 TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
377 this, cidl
, apidl
, rgfInOut
, rgfInOut
? *rgfInOut
: 0);
385 /* FIXME: always add SFGAO_CANLINK */
387 *rgfInOut
&= dwComputerAttributes
;
390 for (UINT i
= 0; i
< cidl
; ++i
)
392 if (_ILIsDrive(apidl
[i
]))
393 *rgfInOut
&= dwDriveAttributes
;
394 else if (_ILIsControlPanel(apidl
[i
]))
395 *rgfInOut
&= dwControlPanelAttributes
;
399 SHELL32_GetItemAttributes(this, apidl
[i
], rgfInOut
);
404 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
405 *rgfInOut
&= ~SFGAO_VALIDATE
;
407 TRACE ("-- result=0x%08x\n", *rgfInOut
);
411 /**************************************************************************
412 * CDrivesFolder::GetUIObjectOf
415 * hwndOwner [in] Parent window for any output
416 * cidl [in] array size
417 * apidl [in] simple pidl array
418 * riid [in] Requested Interface
419 * prgfInOut [ ] reserved
420 * ppvObject [out] Resulting Interface
423 HRESULT WINAPI
CDrivesFolder::GetUIObjectOf(HWND hwndOwner
,
424 UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
425 REFIID riid
, UINT
*prgfInOut
, LPVOID
*ppvOut
)
428 IUnknown
*pObj
= NULL
;
429 HRESULT hr
= E_INVALIDARG
;
431 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
432 hwndOwner
, cidl
, apidl
, shdebugstr_guid (&riid
), prgfInOut
, ppvOut
);
439 if (IsEqualIID (riid
, IID_IContextMenu
) && (cidl
>= 1))
441 hr
= CDefFolderMenu_Create2(pidlRoot
, hwndOwner
, cidl
, apidl
, (IShellFolder
*)this, NULL
, 0, NULL
, (IContextMenu
**)&pObj
);
443 else if (IsEqualIID (riid
, IID_IDataObject
) && (cidl
>= 1))
445 hr
= IDataObject_Constructor (hwndOwner
,
446 pidlRoot
, apidl
, cidl
, (IDataObject
**)&pObj
);
448 else if (IsEqualIID (riid
, IID_IExtractIconA
) && (cidl
== 1))
450 pidl
= ILCombine (pidlRoot
, apidl
[0]);
451 pObj
= IExtractIconA_Constructor (pidl
);
455 else if (IsEqualIID (riid
, IID_IExtractIconW
) && (cidl
== 1))
457 pidl
= ILCombine (pidlRoot
, apidl
[0]);
458 pObj
= IExtractIconW_Constructor (pidl
);
462 else if (IsEqualIID (riid
, IID_IDropTarget
) && (cidl
>= 1))
464 IDropTarget
* pDt
= NULL
;
465 hr
= this->QueryInterface(IID_PPV_ARG(IDropTarget
, &pDt
));
468 else if ((IsEqualIID(riid
, IID_IShellLinkW
) ||
469 IsEqualIID(riid
, IID_IShellLinkA
)) && (cidl
== 1))
471 pidl
= ILCombine (pidlRoot
, apidl
[0]);
472 hr
= IShellLink_ConstructFromFile(NULL
, riid
, pidl
, (LPVOID
*) &pObj
);
478 if (SUCCEEDED(hr
) && !pObj
)
482 TRACE ("(%p)->hr=0x%08x\n", this, hr
);
486 /**************************************************************************
487 * CDrivesFolder::GetDisplayNameOf
489 HRESULT WINAPI
CDrivesFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
494 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl
, dwFlags
, strRet
);
500 pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
502 return E_OUTOFMEMORY
;
508 /* parsing name like ::{...} */
511 SHELL32_GUIDToStringW(CLSID_MyComputer
, &pszPath
[2]);
513 else if (_ILIsPidlSimple(pidl
))
515 /* take names of special folders only if its only this folder */
516 if (_ILIsSpecialFolder(pidl
))
520 clsid
= _ILGetGUIDPointer (pidl
);
523 if (GET_SHGDN_FOR (dwFlags
) & SHGDN_FORPARSING
)
525 static const WCHAR clsidW
[] = L
"CLSID\\";
526 static const WCHAR shellfolderW
[] = L
"\\shellfolder";
527 static const WCHAR wantsForParsingW
[] = L
"WantsForParsing";
528 BOOL bWantsForParsing
= FALSE
;
529 WCHAR szRegPath
[100];
533 * We can only get a filesystem path from a shellfolder
534 * if the value WantsFORPARSING exists in
535 * CLSID\\{...}\\shellfolder
536 * exception: the MyComputer folder has this keys not
537 * but like any filesystem backed
538 * folder it needs these behaviour
540 * Get the "WantsFORPARSING" flag from the registry
543 wcscpy(szRegPath
, clsidW
);
544 SHELL32_GUIDToStringW(*clsid
, &szRegPath
[6]);
545 wcscat(szRegPath
, shellfolderW
);
546 r
= SHGetValueW(HKEY_CLASSES_ROOT
, szRegPath
,
547 wantsForParsingW
, NULL
, NULL
, NULL
);
548 if (r
== ERROR_SUCCESS
)
549 bWantsForParsing
= TRUE
;
551 if ((GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
) &&
555 * We need the filesystem path to the destination folder
556 * Only the folder itself can know it
558 hr
= SHELL32_GetDisplayNameOfChild (this, pidl
,
559 dwFlags
, pszPath
, MAX_PATH
);
565 /* parsing name like ::{...} */
569 p
+= SHELL32_GUIDToStringW(CLSID_MyComputer
, p
);
576 SHELL32_GUIDToStringW(*clsid
, p
);
581 /* user friendly name */
583 if (_ILIsMyComputer(pidl
) && sName
)
584 wcscpy(pszPath
, sName
);
586 HCR_GetClassNameW (*clsid
, pszPath
, MAX_PATH
);
588 TRACE("pszPath %s\n", debugstr_w(pszPath
));
593 /* append my own path */
594 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
);
597 else if (_ILIsDrive(pidl
))
600 _ILSimpleGetTextW(pidl
, pszPath
, MAX_PATH
); /* append my own path */
601 /* long view "lw_name (C:)" */
602 if (!(dwFlags
& SHGDN_FORPARSING
))
604 WCHAR wszDrive
[18] = {0};
605 DWORD dwVolumeSerialNumber
, dwMaximumComponentLength
, dwFileSystemFlags
;
606 static const WCHAR wszOpenBracket
[] = {' ', '(', 0};
607 static const WCHAR wszCloseBracket
[] = {')', 0};
609 lstrcpynW(wszDrive
, pszPath
, 4);
611 GetVolumeInformationW(wszDrive
, pszPath
,
613 &dwVolumeSerialNumber
,
614 &dwMaximumComponentLength
, &dwFileSystemFlags
, NULL
, 0);
615 pszPath
[MAX_PATH
-1] = L
'\0';
616 if (!wcslen(pszPath
))
618 UINT DriveType
, ResourceId
;
619 DriveType
= GetDriveTypeW(wszDrive
);
623 ResourceId
= IDS_DRIVE_FIXED
;
626 ResourceId
= IDS_DRIVE_NETWORK
;
629 ResourceId
= IDS_DRIVE_CDROM
;
636 dwFileSystemFlags
= LoadStringW(shell32_hInstance
, ResourceId
, pszPath
, MAX_PATH
);
637 if (dwFileSystemFlags
> MAX_PATH
- 7)
638 pszPath
[MAX_PATH
-7] = L
'\0';
641 wcscat (pszPath
, wszOpenBracket
);
643 wcscat (pszPath
, wszDrive
);
644 wcscat (pszPath
, wszCloseBracket
);
649 /* Neither a shell namespace extension nor a drive letter. */
650 ERR("Wrong pidl type\n");
651 CoTaskMemFree(pszPath
);
657 /* Complex pidl. Let the child folder do the work */
658 hr
= SHELL32_GetDisplayNameOfChild(this, pidl
, dwFlags
, pszPath
, MAX_PATH
);
663 strRet
->uType
= STRRET_WSTR
;
664 strRet
->pOleStr
= pszPath
;
667 CoTaskMemFree(pszPath
);
669 TRACE("-- (%p)->(%s)\n", this, strRet
->uType
== STRRET_CSTR
? strRet
->cStr
: debugstr_w(strRet
->pOleStr
));
673 /**************************************************************************
674 * CDrivesFolder::SetNameOf
675 * Changes the name of a file object or subfolder, possibly changing its item
676 * identifier in the process.
679 * hwndOwner [in] Owner window for output
680 * pidl [in] simple pidl of item to change
681 * lpszName [in] the items new display name
682 * dwFlags [in] SHGNO formatting flags
683 * ppidlOut [out] simple pidl returned
685 HRESULT WINAPI
CDrivesFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
,
686 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
693 TRACE("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this,
694 hwndOwner
, pidl
, debugstr_w (lpName
), dwFlags
, pPidlOut
);
696 if (_ILIsDrive(pidl
))
698 if (_ILSimpleGetTextW(pidl
, szName
, _countof(szName
)))
699 SetVolumeLabelW(szName
, lpName
);
701 *pPidlOut
= _ILCreateDrive(szName
);
706 if (pPidlOut
!= NULL
)
707 *pPidlOut
= _ILCreateMyComputer();
709 length
= (wcslen(lpName
) + 1) * sizeof(WCHAR
);
710 sName
= (LPWSTR
)SHAlloc(length
);
713 return E_OUTOFMEMORY
;
715 if (RegOpenKeyExW(HKEY_CURRENT_USER
,
716 L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
719 &hKey
) != ERROR_SUCCESS
)
721 WARN("Error: failed to open registry key\n");
725 RegSetValueExW(hKey
, NULL
, 0, REG_SZ
, (const LPBYTE
)lpName
, length
);
729 wcscpy(sName
, lpName
);
732 TRACE("result %s\n", debugstr_w(sName
));
736 HRESULT WINAPI
CDrivesFolder::GetDefaultSearchGUID(GUID
* pguid
)
738 FIXME ("(%p)\n", this);
742 HRESULT WINAPI
CDrivesFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
744 FIXME ("(%p)\n", this);
748 HRESULT WINAPI
CDrivesFolder::GetDefaultColumn (DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
750 TRACE ("(%p)\n", this);
759 HRESULT WINAPI
CDrivesFolder::GetDefaultColumnState(UINT iColumn
, DWORD
* pcsFlags
)
761 TRACE ("(%p)\n", this);
763 if (!pcsFlags
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
765 *pcsFlags
= MyComputerSFHeader
[iColumn
].pcsFlags
;
769 HRESULT WINAPI
CDrivesFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
* pscid
, VARIANT
* pv
)
771 FIXME ("(%p)\n", this);
775 /* FIXME: drive size >4GB is rolling over */
776 HRESULT WINAPI
CDrivesFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
780 TRACE ("(%p)->(%p %i %p)\n", this, pidl
, iColumn
, psd
);
782 if (!psd
|| iColumn
>= MYCOMPUTERSHELLVIEWCOLUMNS
)
787 psd
->fmt
= MyComputerSFHeader
[iColumn
].fmt
;
788 psd
->cxChar
= MyComputerSFHeader
[iColumn
].cxChar
;
789 psd
->str
.uType
= STRRET_CSTR
;
790 LoadStringA(shell32_hInstance
, MyComputerSFHeader
[iColumn
].colnameid
,
791 psd
->str
.cStr
, MAX_PATH
);
796 char szPath
[MAX_PATH
];
797 ULARGE_INTEGER ulBytes
;
799 psd
->str
.cStr
[0] = 0x00;
800 psd
->str
.uType
= STRRET_CSTR
;
804 hr
= GetDisplayNameOf(pidl
,
805 SHGDN_NORMAL
| SHGDN_INFOLDER
, &psd
->str
);
808 _ILGetFileType(pidl
, psd
->str
.cStr
, MAX_PATH
);
810 case 2: /* total size */
811 if (_ILIsDrive(pidl
))
813 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
814 GetDiskFreeSpaceExA (szPath
, NULL
, &ulBytes
, NULL
);
815 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
818 case 3: /* free size */
819 if (_ILIsDrive(pidl
))
821 _ILSimpleGetText (pidl
, szPath
, MAX_PATH
);
822 GetDiskFreeSpaceExA (szPath
, &ulBytes
, NULL
, NULL
);
823 StrFormatByteSizeA (ulBytes
.LowPart
, psd
->str
.cStr
, MAX_PATH
);
833 HRESULT WINAPI
CDrivesFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
* pscid
)
835 FIXME("(%p)\n", this);
839 /************************************************************************
840 * CDrivesFolder::GetClassID
842 HRESULT WINAPI
CDrivesFolder::GetClassID(CLSID
*lpClassId
)
844 TRACE ("(%p)\n", this);
849 *lpClassId
= CLSID_MyComputer
;
853 /************************************************************************
854 * CDrivesFolder::Initialize
856 * NOTES: it makes no sense to change the pidl
858 HRESULT WINAPI
CDrivesFolder::Initialize(LPCITEMIDLIST pidl
)
860 TRACE ("(%p)->(%p)\n", this, pidl
);
863 SHFree((LPVOID
)pidlRoot
);
865 pidlRoot
= ILClone(pidl
);
869 /**************************************************************************
870 * CDrivesFolder::GetCurFolder
872 HRESULT WINAPI
CDrivesFolder::GetCurFolder(LPITEMIDLIST
*pidl
)
874 TRACE("(%p)->(%p)\n", this, pidl
);
879 *pidl
= ILClone(pidlRoot
);