ReactOS 0.4.17-dev-218-g5635d24
CDrivesFolder.cpp
Go to the documentation of this file.
1/*
2 * Virtual Workplace folder
3 *
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2009 Andrew Hill
7 * Copyright 2017-2024 Katayama Hirofumi MZ
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#include <precomp.h>
25#include <process.h>
26
28
29/*
30CDrivesFolder should create a CRegFolder to represent the virtual items that exist only in
31the registry. The CRegFolder is aggregated by the CDrivesFolder.
32The CDrivesFolderEnum class should enumerate only drives on the system. Since the CRegFolder
33implementation of IShellFolder::EnumObjects enumerates the virtual items, the
34CDrivesFolderEnum is only responsible for returning the physical items.
35
362. At least on my XP system, the drive pidls returned are of type PT_DRIVE1, not PT_DRIVE
373. The parsing name returned for my computer is incorrect. It should be "My Computer"
38*/
39
40static int iDriveIconIds[7] = { IDI_SHELL_NOT_CONNECTED_HDD, /* DRIVE_UNKNOWN */
41 IDI_SHELL_NOT_CONNECTED_HDD, /* DRIVE_NO_ROOT_DIR*/
42 IDI_SHELL_REMOVEABLE, /* DRIVE_REMOVABLE*/
43 IDI_SHELL_DRIVE, /* DRIVE_FIXED*/
44 IDI_SHELL_NETDRIVE, /* DRIVE_REMOTE*/
45 IDI_SHELL_CDROM, /* DRIVE_CDROM*/
46 IDI_SHELL_RAMDISK /* DRIVE_RAMDISK*/
47 };
48
49static int iDriveTypeIds[7] = { IDS_DRIVE_FIXED, /* DRIVE_UNKNOWN */
50 IDS_DRIVE_FIXED, /* DRIVE_NO_ROOT_DIR*/
51 IDS_DRIVE_REMOVABLE, /* DRIVE_REMOVABLE*/
52 IDS_DRIVE_FIXED, /* DRIVE_FIXED*/
53 IDS_DRIVE_NETWORK, /* DRIVE_REMOTE*/
54 IDS_DRIVE_CDROM, /* DRIVE_CDROM*/
55 IDS_DRIVE_FIXED /* FIXME */ /* DRIVE_RAMDISK*/
56 };
57
59{
60 { CLSID_ControlPanel, NULL, REGITEMORDER_MYCOMPUTER_CONTROLS },
61};
63{
66 CLSID_MyComputer,
67 L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
68 L"MyComputer",
69};
70
71static const CLSID* IsRegItem(PCUITEMID_CHILD pidl)
72{
73 if (pidl && pidl->mkid.cb == 2 + 2 + sizeof(CLSID))
74 {
75 if (pidl->mkid.abID[0] == PT_SHELLEXT || pidl->mkid.abID[0] == PT_GUID) // FIXME: Remove PT_GUID when CRegFolder is fixed
76 return (const CLSID*)(&pidl->mkid.abID[2]);
77 }
78 return NULL;
79}
80
82{
83 const CLSID *pClass = IsRegItem(pidl);
84 return pClass && *pClass == clsid;
85}
86
88{
89 if (!_ILIsDrive(pidl))
90 return -1;
91 BYTE letter = ((PIDLDATA*)pidl->mkid.abID)->u.drive.szDriveName[0];
92 BYTE number = (letter | 32) - 'a';
93 return number < 26 ? number : -1;
94}
95
96static INT8 GetDriveNumber(PCWSTR DrivePath)
97{
98 WORD number = (DrivePath[0] | 32) - 'a';
99 return number < 26 ? number : -1;
100}
101
103
105{
106 if (DrvNum < 0 || DrvNum >= 26)
107 return DRIVE_UNKNOWN;
108 if (g_IsFloppyCache & (1 << DrvNum))
109 return DRIVE_REMOVABLE;
110 WCHAR DrvPath[] = { LOWORD('A' + DrvNum), ':', '\\', '\0' };
111 return ::GetDriveTypeW(DrvPath);
112}
113
114static inline UINT GetCachedDriveType(PCWSTR DrivePath)
115{
116 return GetCachedDriveType(GetDriveNumber(DrivePath));
117}
118
119static bool IsFloppyDrive(PCWSTR DrivePath)
120{
121 extern BOOL IsDriveFloppyW(LPCWSTR pszDriveRoot);
122 INT8 DrvNum = GetDriveNumber(DrivePath);
123 if (DrvNum < 0)
124 return false;
125 if (g_IsFloppyCache & (1 << DrvNum))
126 return true;
127 UINT Type = GetCachedDriveType(DrvNum);
128 if (Type == DRIVE_REMOVABLE && IsDriveFloppyW(DrivePath))
129 {
130 g_IsFloppyCache |= (1 << DrvNum);
131 return true;
132 }
133 return false;
134}
135
137{
138 INT8 number = GetDriveNumber(pidl);
139 if (number < 0)
140 return number;
141 Path[0] = 'A' + number;
142 Path[1] = ':';
143 Path[2] = '\\';
144 Path[3] = '\0';
145 return number;
146}
147
149{
150 WCHAR buf[8];
151 if (GetDrivePath(pidl, buf) >= 0 && IsFloppyDrive(buf))
152 return SHDID_COMPUTER_DRIVE35; // TODO: 3.5-inch vs 5.25-inch
154}
155
157{
158 WCHAR szDrive[8];
159 if (!_ILGetDrive(pidl, szDrive, _countof(szDrive)))
160 {
161 ERR("pidl %p is not a drive\n", pidl);
162 return DRIVE_UNKNOWN;
163 }
164 return GetCachedDriveType(GetDriveNumber(szDrive));
165}
166
167static UINT SHELL_GetAutoRunInfPath(PCWSTR DrvPath, PWSTR AriPath, BOOL ForInvoke = FALSE)
168{
169 INT8 DrvNum = GetDriveNumber(DrvPath);
170 if (DrvNum < 0 || DrvPath[1] != ':' || (DrvPath[2] && (DrvPath[2] != '\\' || DrvPath[3])))
171 return 0;
172 if (!ForInvoke && IsFloppyDrive(DrvPath))
173 return 0; // Don't read label nor icon from floppy
175 return 0;
176 return wsprintfW(AriPath, L"%c:\\autorun.inf", DrvPath[0]);
177}
178
179#if 0 // TODO: Call this when the shell is notified about insert disc events
180bool SHELL_CanInvokeAutoRunOnDrive(PCWSTR DrvPath)
181{
182 INT8 DrvNum = GetDriveNumber(DrvPath);
183 if (DrvNum < 0 || (SHRestricted(REST_NODRIVEAUTORUN) & (1 << DrvNum)))
184 return false;
185 return !(SHRestricted(REST_NODRIVETYPEAUTORUN) & (1 << GetCachedDriveType(DrvNum)));
186}
187#endif
188
194{
196 wsprintfW(path, L"%s\\%s", REGSTR_PATH_EXPLORER, SubKey);
198 // Check the value in both HKEY_CURRENT_USER and HKEY_LOCAL_MACHINE
200}
201
202/***********************************************************************
203* IShellFolder implementation
204*/
205
206#define RETRY_COUNT 3
207#define RETRY_SLEEP 250
209{
210 DWORD dwError, dwBytesReturned;
211 DWORD dwCode = (bLock ? FSCTL_LOCK_VOLUME : FSCTL_UNLOCK_VOLUME);
212 for (DWORD i = 0; i < RETRY_COUNT; ++i)
213 {
214 if (DeviceIoControl(hDrive, dwCode, NULL, 0, NULL, 0, &dwBytesReturned, NULL))
215 return TRUE;
216
217 dwError = GetLastError();
218 if (dwError == ERROR_INVALID_FUNCTION)
219 break; /* don't sleep if function is not implemented */
220
222 }
223 SetLastError(dwError);
224 return FALSE;
225}
226
227// NOTE: See also https://support.microsoft.com/en-us/help/165721/how-to-ejecting-removable-media-in-windows-nt-windows-2000-windows-xp
228static BOOL DoEjectDrive(const WCHAR *physical, UINT nDriveType, INT *pnStringID)
229{
230 /* GENERIC_WRITE isn't needed for umount */
231 DWORD dwAccessMode = GENERIC_READ;
232 DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
233
234 HANDLE hDrive = CreateFile(physical, dwAccessMode, dwShareMode, 0, OPEN_EXISTING, 0, NULL);
235 if (hDrive == INVALID_HANDLE_VALUE)
236 return FALSE;
237
238 BOOL bResult, bNeedUnlock = FALSE;
239 DWORD dwBytesReturned, dwError = NO_ERROR;
240 PREVENT_MEDIA_REMOVAL removal;
241 do
242 {
243 bResult = TryToLockOrUnlockDrive(hDrive, TRUE);
244 if (!bResult)
245 {
246 dwError = GetLastError();
247 *pnStringID = IDS_CANTLOCKVOLUME; /* Unable to lock volume */
248 break;
249 }
250 bResult = DeviceIoControl(hDrive, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
251 if (!bResult)
252 {
253 dwError = GetLastError();
254 *pnStringID = IDS_CANTDISMOUNTVOLUME; /* Unable to dismount volume */
255 bNeedUnlock = TRUE;
256 break;
257 }
258 removal.PreventMediaRemoval = FALSE;
259 bResult = DeviceIoControl(hDrive, IOCTL_STORAGE_MEDIA_REMOVAL, &removal, sizeof(removal), NULL,
260 0, &dwBytesReturned, NULL);
261 if (!bResult)
262 {
263 *pnStringID = IDS_CANTEJECTMEDIA; /* Unable to eject media */
264 dwError = GetLastError();
265 bNeedUnlock = TRUE;
266 break;
267 }
268 bResult = DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
269 if (!bResult)
270 {
271 *pnStringID = IDS_CANTEJECTMEDIA; /* Unable to eject media */
272 dwError = GetLastError();
273 bNeedUnlock = TRUE;
274 break;
275 }
276 } while (0);
277
278 if (bNeedUnlock)
279 {
281 }
282
283 CloseHandle(hDrive);
284
285 SetLastError(dwError);
286 return bResult;
287}
288
290{
291 UINT nDrive = PtrToUlong(args);
292 WCHAR szPath[] = { LOWORD(L'A' + nDrive), L'\0' }; // Arbitrary, just needs to include nDrive
295 if (FAILED(hr))
296 return hr;
298 return stub.DestroyWindow();
299}
300
302{
304 return succ ? S_OK : E_FAIL;
305}
306
308 HWND hwnd,
309 IDataObject *pdtobj,
310 UINT uMsg,
313{
314 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
315 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
316
317 PIDLIST_ABSOLUTE pidlFolder;
318 PUITEMID_CHILD *apidl;
319 UINT cidl;
321 HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
323 return hr;
324
325 WCHAR szDrive[8] = {0};
326 if (!_ILGetDrive(apidl[0], szDrive, _countof(szDrive)))
327 {
328 ERR("pidl is not a drive\n");
329 SHFree(pidlFolder);
330 _ILFreeaPidl(apidl, cidl);
331 return E_FAIL;
332 }
333 UINT nDriveType = GetCachedDriveType(szDrive);
334 if (!GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, &dwFlags, NULL, 0))
335 {
336 if (nDriveType >= DRIVE_REMOTE)
338 else
339 dwFlags = 0; // Assume drive with unknown filesystem, allow format
340 }
341
342// custom command IDs
343#if 0 // Disabled until our menu building system is fixed
344#define CMDID_FORMAT 0
345#define CMDID_EJECT 1
346#define CMDID_DISCONNECT 2
347#else
348/* FIXME: These IDs should start from 0, however there is difference
349 * between ours and Windows' menu building systems, which should be fixed. */
350#define CMDID_FORMAT 1
351#define CMDID_EJECT 2
352#define CMDID_DISCONNECT 3
353#endif
354
355 if (uMsg == DFM_MERGECONTEXTMENU)
356 {
357 QCMINFO *pqcminfo = (QCMINFO *)lParam;
358
359 UINT idCmdFirst = pqcminfo->idCmdFirst;
360 UINT idCmd = 0;
361 if (!(dwFlags & FILE_READ_ONLY_VOLUME) && nDriveType != DRIVE_REMOTE && cidl == 1)
362 {
363 /* add separator and Format */
364 idCmd = idCmdFirst + CMDID_FORMAT;
365 _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
367 }
368 if (nDriveType == DRIVE_REMOVABLE || nDriveType == DRIVE_CDROM)
369 {
370 /* add separator and Eject */
371 idCmd = idCmdFirst + CMDID_EJECT;
372 _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
374 }
375 if (nDriveType == DRIVE_REMOTE)
376 {
377 /* add separator and Disconnect */
378 idCmd = idCmdFirst + CMDID_DISCONNECT;
379 _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
381 }
382
383 if (idCmd)
384#if 0 // see FIXME above
385 pqcminfo->idCmdFirst = ++idCmd;
386#else
387 pqcminfo->idCmdFirst = (idCmd + 2);
388#endif
389 hr = S_OK;
390 }
391 else if (uMsg == DFM_INVOKECOMMAND)
392 {
393 WCHAR wszBuf[4] = L"A:\\";
394 wszBuf[0] = (WCHAR)szDrive[0];
395
396 INT nStringID = 0;
397 DWORD dwError = NO_ERROR;
398
400 {
401 ATLASSERT(pdtobj);
403 // Not setting nStringID because SHOpenPropSheet already displayed an error box
404 }
405 else
406 {
407 if (wParam == CMDID_FORMAT)
408 {
409 hr = DoFormatDriveAsync(hwnd, szDrive[0] - 'A');
410 }
411 else if (wParam == CMDID_EJECT)
412 {
413 /* do eject */
414 WCHAR physical[10];
415 wsprintfW(physical, _T("\\\\.\\%c:"), szDrive[0]);
416
417 if (DoEjectDrive(physical, nDriveType, &nStringID))
418 {
420 }
421 else
422 {
423 dwError = GetLastError();
424 }
425 }
426 else if (wParam == CMDID_DISCONNECT)
427 {
428 /* do disconnect */
429 wszBuf[2] = UNICODE_NULL;
430 dwError = WNetCancelConnection2W(wszBuf, 0, FALSE);
431 if (dwError == NO_ERROR)
432 {
434 }
435 else
436 {
437 nStringID = IDS_CANTDISCONNECT;
438 }
439 }
440 }
441
442 if (nStringID != 0)
443 {
444 /* show error message */
445 WCHAR szFormat[128], szMessage[128];
446 LoadStringW(shell32_hInstance, nStringID, szFormat, _countof(szFormat));
447 wsprintfW(szMessage, szFormat, dwError);
448 MessageBoxW(hwnd, szMessage, NULL, MB_ICONERROR);
449 }
450 }
451
452 SHFree(pidlFolder);
453 _ILFreeaPidl(apidl, cidl);
454
455 return hr;
456}
457
459 HWND hwnd,
460 UINT cidl,
462 IShellFolder *psf,
463 IContextMenu **ppcm)
464{
466 AddClassKeyToArray(L"Drive", keys, keys);
467 AddClassKeyToArray(L"Folder", keys, keys);
468 return CDefFolderMenu_Create2(pidlFolder, hwnd, cidl, apidl, psf, DrivesContextMenuCallback, keys, keys, ppcm);
469}
470
471static HRESULT
473 _In_ PCWSTR pszDrivePath,
474 _Out_writes_z_(cchMax) PWSTR szIconFile,
476 _Out_ int *piIndex,
477 _Out_ UINT *pGilOut)
478{
479 WCHAR wszPath[MAX_PATH];
480 WCHAR wszAutoRunInfPath[MAX_PATH];
481 WCHAR wszValue[MAX_PATH], wszTemp[MAX_PATH];
482
483 if (!SHELL_GetAutoRunInfPath(pszDrivePath, wszAutoRunInfPath))
484 return E_FAIL;
485 wcscpy(wszPath, pszDrivePath);
486
487 // autorun.inf --> wszValue
488 if (GetPrivateProfileStringW(L"autorun", L"icon", NULL, wszValue, _countof(wszValue),
489 wszAutoRunInfPath) && wszValue[0] != 0)
490 {
491 // wszValue --> wszTemp
492 ExpandEnvironmentStringsW(wszValue, wszTemp, _countof(wszTemp));
493
494 *piIndex = PathParseIconLocationW(wszTemp);
495
496 // wszPath + wszTemp --> wszPath
497 if (PathIsRelativeW(wszTemp))
498 PathAppendW(wszPath, wszTemp);
499 else
500 StringCchCopyW(wszPath, _countof(wszPath), wszTemp);
501
502 // wszPath --> szIconFile
503 GetFullPathNameW(wszPath, cchMax, szIconFile, NULL);
504 return S_OK;
505 }
506 return E_FAIL;
507}
508
509static HRESULT
511{
512 WCHAR wszAutoRunInfPath[MAX_PATH];
513 WCHAR wszTemp[MAX_PATH];
514
515 if (!SHELL_GetAutoRunInfPath(wszPath, wszAutoRunInfPath))
516 return E_FAIL;
517
518 if (GetPrivateProfileStringW(L"autorun", L"label", NULL, wszTemp, _countof(wszTemp),
519 wszAutoRunInfPath) && wszTemp[0] != 0)
520 {
521 return StringCchCopyW(szLabel, cchMax, wszTemp);
522 }
523 return E_FAIL;
524}
525
526static inline HRESULT GetRawDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
527{
528 if (GetVolumeInformationW(DrivePath, szLabel, cchMax, NULL, NULL, NULL, NULL, 0))
529 return *szLabel ? S_OK : S_FALSE;
531}
532
533static HRESULT GetDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
534{
535 HRESULT hr = getLabelForDriveFromAutoRun(DrivePath, szLabel, cchMax);
536 return hr == S_OK ? S_OK : GetRawDriveLabel(DrivePath, szLabel, cchMax);
537}
538
540 _In_ INT8 DriveNum,
541 _Out_writes_z_(cchMax) PWSTR szIconFile,
543 _Out_ int *piIndex,
544 _Out_ UINT *pGilOut)
545{
546 WCHAR szKey[200], chDrv = 'A' + DriveNum;
547 wsprintfW(szKey, L"%s\\DriveIcons\\%c\\DefaultIcon", REGSTR_PATH_EXPLORER, chDrv);
548 DWORD cb = cchMax * sizeof(*szIconFile);
550 if (err != ERROR_SUCCESS)
551 {
552 cb = cchMax * sizeof(*szIconFile);
553 wsprintfW(szKey, L"Applications\\Explorer.exe\\Drives\\%c\\DefaultIcon", chDrv);
554 err = RegGetValueW(HKEY_CLASSES_ROOT, szKey, NULL, RRF_RT_REG_SZ, NULL, szIconFile, &cb);
555 }
556 if (err != ERROR_SUCCESS)
557 return false;
558 *piIndex = PathParseIconLocationW(szIconFile);
559 return *szIconFile != UNICODE_NULL;
560}
561
563{
564 CComPtr<IDefaultExtractIconInit> initIcon;
567 return hr;
568
569 WCHAR wTemp[MAX_PATH], szDrive[8];
570 int icon_idx, reg_idx = 0;
571 UINT GilOut = 0;
572 BOOL bFloppy = FALSE;
573 INT8 DriveNum = GetDrivePath(pidl, szDrive);
577
578 switch (DriveType)
579 {
580 case DRIVE_REMOVABLE:
581 bFloppy = IsFloppyDrive(szDrive);
582 reg_idx = bFloppy ? IDI_SHELL_3_14_FLOPPY : IDI_SHELL_REMOVEABLE;
583 break;
584 case DRIVE_FIXED:
585 reg_idx = IDI_SHELL_DRIVE;
586 break;
587 case DRIVE_REMOTE:
588 reg_idx = IDI_SHELL_NETDRIVE;
589 break;
590 case DRIVE_CDROM:
591 reg_idx = IDI_SHELL_CDROM;
592 break;
593 case DRIVE_RAMDISK:
594 reg_idx = IDI_SHELL_RAMDISK;
595 break;
596 }
597
598 hr = getIconLocationForDrive(szDrive, wTemp, _countof(wTemp),
599 &icon_idx, &GilOut);
600 if (SUCCEEDED(hr))
601 {
602 initIcon->SetNormalIcon(wTemp, icon_idx);
603 }
604 else if (DriveType > DRIVE_NO_ROOT_DIR &&
605 GetRegCustomizedDriveIcon(DriveNum, wTemp, _countof(wTemp), &icon_idx, &GilOut))
606 {
607 initIcon->SetNormalIcon(wTemp, icon_idx);
608 }
609 else if (reg_idx && HLM_GetIconW(reg_idx - 1, wTemp, _countof(wTemp), &icon_idx))
610 {
611 initIcon->SetNormalIcon(wTemp, icon_idx);
612 }
613 else if (DriveType == DRIVE_FIXED &&
614 HCR_GetIconW(L"Drive", wTemp, NULL, _countof(wTemp), &icon_idx))
615 {
616 initIcon->SetNormalIcon(wTemp, icon_idx);
617 }
618 else
619 {
620 if (DriveType == DRIVE_REMOVABLE && bFloppy)
621 icon_idx = IDI_SHELL_3_14_FLOPPY;
622 else
623 icon_idx = iDriveIconIds[DriveType];
624 initIcon->SetNormalIcon(swShell32Name, -icon_idx);
625 }
626
627 return initIcon->QueryInterface(riid, ppvOut);
628}
629
631 public CEnumIDListBase
632{
633 public:
634 HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags, IEnumIDList* pRegEnumerator)
635 {
636 /* enumerate the folders */
637 if (dwFlags & SHCONTF_FOLDERS)
638 {
639 WCHAR wszDriveName[] = {'A', ':', '\\', '\0'};
640 DWORD dwDrivemap = GetLogicalDrives() & ~SHRestricted(REST_NODRIVES);
641 for (; wszDriveName[0] <= 'Z'; wszDriveName[0]++)
642 {
643 if (dwDrivemap & 1)
644 AddToEnumList(_ILCreateDrive(wszDriveName));
645 dwDrivemap >>= 1;
646 }
647 }
648
649 /* Enumerate the items of the reg folder */
650 AppendItemsFromEnumerator(pRegEnumerator);
651
652 return S_OK;
653 }
654
656 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
658};
659
660/***********************************************************************
661* IShellFolder [MyComputer] implementation
662*/
663
670};
671
673 SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
674 SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
676 SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CANLINK;
678 SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
679 SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANCOPY;
680
682{
683 pidlRoot = NULL;
685}
686
688{
689 TRACE("-- destroying IShellFolder(%p)\n", this);
691}
692
694{
695 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
696 if (pidlRoot == NULL)
697 return E_OUTOFMEMORY;
698
699 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
701 pidlRoot,
703
704 return hr;
705}
706
707/**************************************************************************
708* CDrivesFolder::ParseDisplayName
709*/
711 DWORD * pchEaten, PIDLIST_RELATIVE * ppidl, DWORD * pdwAttributes)
712{
714
715 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
716 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
717 pchEaten, ppidl, pdwAttributes);
718
719 if (!ppidl)
720 return hr;
721
722 *ppidl = NULL;
723
724 if (!lpszDisplayName)
725 return hr;
726
727 /* handle CLSID paths */
728 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
729 {
730 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
731 pdwAttributes);
732 }
733
734 if (((L'A' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'Z') ||
735 (L'a' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'z')) &&
736 lpszDisplayName[1] == L':' && (lpszDisplayName[2] == L'\\' || !lpszDisplayName[2]))
737 {
738 // "C:\..."
739 WCHAR szRoot[8];
740 PathBuildRootW(szRoot, ((*lpszDisplayName - 1) & 0x1F));
741
742 if (SHIsFileSysBindCtx(pbc, NULL) != S_OK && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
743 {
744 if (::GetDriveType(szRoot) == DRIVE_NO_ROOT_DIR)
746 }
747
748 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateDrive(szRoot));
749 if (!pidlTemp)
750 return E_OUTOFMEMORY;
751
752 if (lpszDisplayName[2] && lpszDisplayName[3])
753 {
754 CComPtr<IShellFolder> pChildFolder;
755 hr = BindToObject(pidlTemp, pbc, IID_PPV_ARG(IShellFolder, &pChildFolder));
757 return hr;
758
759 ULONG chEaten;
760 CComHeapPtr<ITEMIDLIST> pidlChild;
761 hr = pChildFolder->ParseDisplayName(hwndOwner, pbc, &lpszDisplayName[3], &chEaten,
762 &pidlChild, pdwAttributes);
764 return hr;
765
766 hr = SHILCombine(pidlTemp, pidlChild, ppidl);
767 }
768 else
769 {
770 *ppidl = pidlTemp.Detach();
771 if (pdwAttributes && *pdwAttributes)
772 GetAttributesOf(1, (PCUITEMID_CHILD_ARRAY)ppidl, pdwAttributes);
773 hr = S_OK;
774 }
775 }
776
777 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr);
778
779 return hr;
780}
781
782/**************************************************************************
783* CDrivesFolder::EnumObjects
784*/
785HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
786{
787 CComPtr<IEnumIDList> pRegEnumerator;
788 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
789
790 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
791}
792
793/**************************************************************************
794* CDrivesFolder::BindToObject
795*/
797{
798 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
799 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
800
801 if (!pidl)
802 return E_INVALIDARG;
803
804 if (_ILIsSpecialFolder(pidl))
805 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
806
807 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
808
809 PERSIST_FOLDER_TARGET_INFO pfti = {0};
810 pfti.dwAttributes = -1;
811 pfti.csidl = -1;
812 pfti.szTargetParsingName[0] = *pchDrive;
813 pfti.szTargetParsingName[1] = L':';
814 pfti.szTargetParsingName[2] = L'\\';
815
817 &pfti,
818 pidl,
819 &CLSID_ShellFSFolder,
820 riid,
821 ppvOut);
823 return hr;
824
825 return S_OK;
826}
827
828/**************************************************************************
829* CDrivesFolder::BindToStorage
830*/
832{
833 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
834 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
835
836 *ppvOut = NULL;
837 return E_NOTIMPL;
838}
839
840/**************************************************************************
841* CDrivesFolder::CompareIDs
842*/
844{
846 UINT iColumn = LOWORD(lParam);
847
848 if (iColumn >= _countof(MyComputerSFHeader))
849 return E_INVALIDARG;
850
851 if (!pidl1 || !pidl2)
852 {
853 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
854 return E_INVALIDARG;
855 }
856
857 CHAR* pszDrive1 = _ILIsDrive(pidl1) ? _ILGetDataPointer(pidl1)->u.drive.szDriveName : NULL;
858 if (!pszDrive1 && !IsRegItem(pidl1) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
859 return E_INVALIDARG;
860 CHAR* pszDrive2 = _ILIsDrive(pidl2) ? _ILGetDataPointer(pidl2)->u.drive.szDriveName : NULL;
861 if (!pszDrive2 && !IsRegItem(pidl2) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
862 return E_INVALIDARG;
863
864 int result;
865 switch (MyComputerSFHeader[iColumn].colnameid)
866 {
868 {
869 if (!pszDrive1 && !pszDrive2)
870 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
871 else if (pszDrive1 && pszDrive2)
872 result = _stricmp(pszDrive1, pszDrive2);
873 else
874 result = (int)!pszDrive1 - (int)!pszDrive2; // Sort drives first
876 break;
877 }
878
881 {
882 if (!pszDrive1 || !pszDrive2)
883 {
884 hres = MAKE_COMPARE_HRESULT((int)!pszDrive1 - (int)!pszDrive2);
885 break;
886 }
887
888 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
889 BOOL bValid1 = FALSE, bValid2 = FALSE;
890
891 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
892 bValid1 = GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
893 else
894 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
895
896 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
897 bValid2 = GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
898 else
899 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
900
901 LARGE_INTEGER Diff;
902 if (MyComputerSFHeader[iColumn].colnameid == IDS_SHV_COLUMN_DISK_CAPACITY) /* Size */
903 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
904 else /* Size available */
905 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
906
907 if (bValid1 != bValid2)
908 hres = MAKE_COMPARE_HRESULT((int)!bValid1 - (int)!bValid2);
909 else
911
912 break;
913 }
916 {
917 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
918 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
919 }
921 }
922
923 if (HRESULT_CODE(hres) == 0)
924 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
925
926 return hres;
927}
928
929/**************************************************************************
930* CDrivesFolder::CreateViewObject
931*/
933{
934 CComPtr<IShellView> pShellView;
936
937 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
938 hwndOwner, shdebugstr_guid (&riid), ppvOut);
939
940 if (!ppvOut)
941 return hr;
942
943 *ppvOut = NULL;
944
945 if (IsEqualIID(riid, IID_IDropTarget))
946 {
947 WARN("IDropTarget not implemented\n");
948 hr = E_NOTIMPL;
949 }
950 else if (IsEqualIID(riid, IID_IContextMenu))
951 {
952 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this };
953 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
954 }
955 else if (IsEqualIID(riid, IID_IShellView))
956 {
957 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this, NULL, this };
958 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
959 }
960 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
961 return hr;
962}
963
964/**************************************************************************
965* CDrivesFolder::GetAttributesOf
966*/
968{
969 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
970 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
971
972 if (cidl && !apidl)
973 return E_INVALIDARG;
974
975 if (*rgfInOut == 0)
976 *rgfInOut = ~0;
977
978 if(cidl == 0)
979 *rgfInOut &= dwComputerAttributes;
980 else
981 {
982 for (UINT i = 0; i < cidl; ++i)
983 {
984 if (_ILIsDrive(apidl[i]))
985 {
986 *rgfInOut &= dwDriveAttributes;
987
988 if (_ILGetDriveType(apidl[i]) == DRIVE_CDROM)
989 *rgfInOut &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
990 }
991 else if (IsRegItem(apidl[i], CLSID_ControlPanel))
992 {
993 *rgfInOut &= dwControlPanelAttributes;
994 }
995 else if (_ILIsSpecialFolder(*apidl))
996 {
997 m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
998 }
999 else
1000 {
1001 ERR("Got unknown pidl type!\n");
1002 }
1003 }
1004 }
1005
1006 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1007 *rgfInOut &= ~SFGAO_VALIDATE;
1008
1009 TRACE("-- result=0x%08x\n", *rgfInOut);
1010 return S_OK;
1011}
1012
1013/**************************************************************************
1014* CDrivesFolder::GetUIObjectOf
1015*
1016* PARAMETERS
1017* hwndOwner [in] Parent window for any output
1018* cidl [in] array size
1019* apidl [in] simple pidl array
1020* riid [in] Requested Interface
1021* prgfInOut [ ] reserved
1022* ppvObject [out] Resulting Interface
1023*
1024*/
1026 UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
1027 REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
1028{
1029 LPVOID pObj = NULL;
1031
1032 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
1033 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1034
1035 if (!ppvOut)
1036 return hr;
1037
1038 *ppvOut = NULL;
1039
1040 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
1041 {
1042 if (_ILIsDrive(apidl[0]))
1043 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
1044 else
1045 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1046 }
1047 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
1048 {
1049 hr = IDataObject_Constructor(hwndOwner,
1050 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1051 }
1052 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1053 {
1054 if (_ILIsDrive(apidl[0]))
1055 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1056 else
1057 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1058 }
1059 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
1060 {
1061 CComPtr<IShellFolder> psfChild;
1062 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1064 return hr;
1065
1066 return psfChild->CreateViewObject(NULL, riid, ppvOut);
1067 }
1068 else
1069 hr = E_NOINTERFACE;
1070
1071 if (SUCCEEDED(hr) && !pObj)
1072 hr = E_OUTOFMEMORY;
1073
1074 *ppvOut = pObj;
1075 TRACE("(%p)->hr=0x%08x\n", this, hr);
1076 return hr;
1077}
1078
1079/**************************************************************************
1080* CDrivesFolder::GetDisplayNameOf
1081*/
1083{
1084 WCHAR szDrive[8];
1085
1086 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1087 pdump (pidl);
1088
1089 if (!strRet)
1090 return E_INVALIDARG;
1091
1092 if (!_ILIsPidlSimple (pidl))
1093 {
1094 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1095 }
1096 else if (_ILIsSpecialFolder(pidl))
1097 {
1098 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1099 }
1100 else if (GetDrivePath(pidl, szDrive) < 0)
1101 {
1102 ERR("Wrong pidl type\n");
1103 return E_INVALIDARG;
1104 }
1105
1106 PWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1107 if (!pszPath)
1108 return E_OUTOFMEMORY;
1109 pszPath[0] = UNICODE_NULL;
1110 szDrive[0] &= ~32; // Always uppercase
1111
1112 /* long view "lw_name (C:)" */
1114 if (!(dwFlags & SHGDN_FORPARSING))
1115 {
1116 if (m_DriveDisplayMode < 0)
1117 {
1118 DWORD err, type, data, cb = sizeof(data);
1119 err = SHRegGetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1120 L"ShowDriveLettersFirst", &type, &data, &cb, FALSE, NULL, 0);
1121 m_DriveDisplayMode = (!err && type == REG_DWORD && cb == sizeof(data)) ? (BYTE)data : 0;
1122 }
1123 BOOL bRemoteFirst = m_DriveDisplayMode == 1;
1124 BOOL bNoLetter = m_DriveDisplayMode == 2;
1125 BOOL bAllFirst = m_DriveDisplayMode == 4;
1126 PWSTR pszLabel = pszPath;
1127
1128 if (!bNoLetter && (bAllFirst || (bRemoteFirst && GetCachedDriveType(szDrive) == DRIVE_REMOTE)))
1129 {
1130 bNoLetter = TRUE; // Handling the letter now, don't append it again later
1131 if (!bEditLabel)
1132 pszLabel += wsprintfW(pszPath, L"(%c:) ", szDrive[0]);
1133 }
1134
1135 if (GetDriveLabel(szDrive, pszLabel, MAX_PATH - 7) != S_OK && !bEditLabel)
1136 {
1137 UINT ResId = 0, DrvType = GetCachedDriveType(szDrive);
1138 if (DrvType == DRIVE_REMOVABLE)
1140 else if (DrvType < _countof(iDriveTypeIds))
1141 ResId = iDriveTypeIds[DrvType];
1142
1143 if (ResId)
1144 {
1145 UINT len = LoadStringW(shell32_hInstance, ResId, pszLabel, MAX_PATH - 7);
1146 if (len > MAX_PATH - 7)
1147 pszLabel[MAX_PATH-7] = UNICODE_NULL;
1148 }
1149 }
1150
1151 if (!*pszLabel && !bEditLabel) // No label nor fallback description, use SHGDN_FORPARSING
1152 *pszPath = UNICODE_NULL;
1153 else if (!bNoLetter && !bEditLabel)
1154 wsprintfW(pszPath + wcslen(pszPath), L" (%c:)", szDrive[0]);
1155 }
1156
1157 if (!*pszPath && !bEditLabel) // SHGDN_FORPARSING or failure above (except editing empty label)
1158 {
1160 szDrive[2] = UNICODE_NULL; // Remove backslash
1161 wcscpy(pszPath, szDrive);
1162 }
1163 strRet->uType = STRRET_WSTR;
1164 strRet->pOleStr = pszPath;
1165
1166 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1167 return S_OK;
1168}
1169
1170/**************************************************************************
1171* CDrivesFolder::SetNameOf
1172* Changes the name of a file object or subfolder, possibly changing its item
1173* identifier in the process.
1174*
1175* PARAMETERS
1176* hwndOwner [in] Owner window for output
1177* pidl [in] simple pidl of item to change
1178* lpszName [in] the items new display name
1179* dwFlags [in] SHGNO formatting flags
1180* ppidlOut [out] simple pidl returned
1181*/
1183 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
1184{
1185 if (_ILIsDrive(pidl))
1186 {
1187 WCHAR szDrive[8];
1188 HRESULT hr = GetDrivePath(pidl, szDrive) >= 0 ? SetDriveLabel(hwndOwner, szDrive, lpName) : E_FAIL;
1189 if (pPidlOut)
1190 *pPidlOut = SUCCEEDED(hr) ? _ILCreateDrive(szDrive) : NULL;
1191 return hr;
1192 }
1193 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1194}
1195
1197{
1199 if (SUCCEEDED(hr))
1200 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, DrivePath, DrivePath); // DisplayName changed
1201 else if (hwndOwner)
1202 SHELL_ErrorBox(hwndOwner, hr);
1203 return hr;
1204}
1205
1207{
1208 FIXME("(%p)\n", this);
1209 return E_NOTIMPL;
1210}
1211
1213{
1214 FIXME("(%p)\n", this);
1215 return E_NOTIMPL;
1216}
1217
1219{
1220 TRACE("(%p)\n", this);
1221
1222 if (pSort)
1223 *pSort = 0;
1224 if (pDisplay)
1225 *pDisplay = 0;
1226 return S_OK;
1227}
1228
1230{
1231 TRACE("(%p)\n", this);
1232
1233 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1234 return E_INVALIDARG;
1235 *pcsFlags = MyComputerSFHeader[iColumn].colstate;
1236 return S_OK;
1237}
1238
1240{
1241 const CLSID *pCLSID = IsRegItem(pidl);
1242 if (pscid->fmtid == FMTID_ShellDetails)
1243 {
1244 switch (pscid->pid)
1245 {
1246 case PID_DESCRIPTIONID:
1247 {
1248 if (pCLSID)
1251 switch (_ILGetDriveType(pidl))
1252 {
1253 case DRIVE_REMOVABLE: id = _ILGetRemovableTypeId(pidl); break;
1254 case DRIVE_FIXED: id = SHDID_COMPUTER_FIXED; break;
1255 case DRIVE_REMOTE: id = SHDID_COMPUTER_NETDRIVE; break;
1256 case DRIVE_CDROM: id = SHDID_COMPUTER_CDROM; break;
1257 case DRIVE_RAMDISK: id = SHDID_COMPUTER_RAMDISK; break;
1258 }
1259 return SHELL_CreateSHDESCRIPTIONID(pv, id, &CLSID_NULL);
1260 }
1261 }
1262 }
1263 if (pCLSID)
1264 return m_regFolder->GetDetailsEx(pidl, pscid, pv);
1265 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, FALSE);
1266}
1267
1269{
1270 HRESULT hr;
1271
1272 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1273
1274 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1275 return E_INVALIDARG;
1276
1277 if (!pidl)
1278 {
1279 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1280 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1281 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1282 }
1283 else if (!_ILIsDrive(pidl))
1284 {
1285 switch (MyComputerSFHeader[iColumn].colnameid)
1286 {
1288 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_NAME, psd);
1290 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_TYPE, psd);
1293 return SHSetStrRetEmpty(&psd->str);
1295 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_COMMENT, psd);
1297 }
1298 }
1299 else
1300 {
1301 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1302 WCHAR szDrive[8];
1303 INT8 DriveNum = GetDrivePath(pidl, szDrive);
1304 UINT DriveType = GetCachedDriveType(DriveNum);
1307
1308 switch (MyComputerSFHeader[iColumn].colnameid)
1309 {
1312 break;
1314 if (DriveType == DRIVE_UNKNOWN)
1315 hr = SHSetStrRetEmpty(&psd->str);
1316 else if (DriveType == DRIVE_REMOVABLE && IsFloppyDrive(szDrive))
1317 hr = SHSetStrRet(&psd->str, IDS_DRIVE_FLOPPY);
1318 else
1319 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1320 break;
1323 psd->str.cStr[0] = 0x00;
1324 psd->str.uType = STRRET_CSTR;
1325 if (GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1326 {
1327 GetDiskFreeSpaceExW(szDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1328 if (iColumn == 2)
1329 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1330 else
1331 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1332 }
1333 hr = S_OK;
1334 break;
1336 hr = SHSetStrRetEmpty(&psd->str); /* FIXME: comments */
1337 break;
1339 }
1340 }
1341
1342 return hr;
1343}
1344
1346{
1347 switch (column < _countof(MyComputerSFHeader) ? MyComputerSFHeader[column].colnameid : ~0UL)
1348 {
1349 case IDS_SHV_COLUMN_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
1350 case IDS_SHV_COLUMN_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
1351 case IDS_SHV_COLUMN_COMMENTS: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
1352 }
1353 return E_INVALIDARG;
1354}
1355
1356/************************************************************************
1357 * CDrivesFolder::GetClassID
1358 */
1360{
1361 TRACE("(%p)\n", this);
1362
1363 if (!lpClassId)
1364 return E_POINTER;
1365
1366 *lpClassId = CLSID_MyComputer;
1367 return S_OK;
1368}
1369
1370/************************************************************************
1371 * CDrivesFolder::Initialize
1372 *
1373 * NOTES: it makes no sense to change the pidl
1374 */
1376{
1377 return S_OK;
1378}
1379
1380/**************************************************************************
1381 * CDrivesFolder::GetCurFolder
1382 */
1384{
1385 TRACE("(%p)->(%p)\n", this, pidl);
1386
1387 if (!pidl)
1388 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1389
1390 *pidl = ILClone(pidlRoot);
1391 return S_OK;
1392}
1393
1394/**************************************************************************
1395 * CDrivesFolder::ShouldShow
1396 */
1398{
1399 if (const CLSID* pClsid = IsRegItem(pidlItem))
1400 return SHELL32_IsShellFolderNamespaceItemHidden(L"HideMyComputerIcons", *pClsid) ? S_FALSE : S_OK;
1401 return S_OK;
1402}
1403
1404/**************************************************************************
1405 * CDrivesFolder::MessageSFVCB (IShellFolderViewCB)
1406 */
1408{
1409 switch (uMsg)
1410 {
1411 case SFVM_FSNOTIFY:
1412 if (lParam == SHCNE_DRIVEADD && wParam)
1413 {
1414 g_IsFloppyCache = 0;
1416 if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES)))
1417 return S_FALSE;
1418 }
1419 else if (lParam == SHCNE_DRIVEREMOVED)
1420 {
1421 g_IsFloppyCache = 0;
1422 }
1423 break;
1424 #if ROSPOLICY_DRIVESFOLDER_DEFLARGEICONS
1425 case SFVM_DEFVIEWMODE:
1427 return S_OK;
1428 #endif
1429 }
1430 return E_NOTIMPL;
1431}
1432
1433/************************************************************************/
1434/* IContextMenuCB interface */
1435
1437{
1438 enum { IDC_PROPERTIES };
1439 /* no data object means no selection */
1440 if (!pdtobj)
1441 {
1442 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1443 {
1444 // "System" properties
1445 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"sysdm.cpl") ? S_OK : E_FAIL;
1446 }
1447 else if (uMsg == DFM_MERGECONTEXTMENU) // TODO: DFM_MERGECONTEXTMENU_BOTTOM
1448 {
1449 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1450 HMENU hpopup = CreatePopupMenu();
1452 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1453 DestroyMenu(hpopup);
1454 return S_OK;
1455 }
1456 }
1457 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1458}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
static const REGFOLDERINFO g_RegFolderInfo
static const CLSID * IsRegItem(LPCITEMIDLIST pidl)
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4824
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
BOOL SHELL32_IsShellFolderNamespaceItemHidden(LPCWSTR SubKey, REFCLSID Clsid)
Returns true if the item should be hidden in DefView but not in the Explorer folder tree.
static HRESULT DoFormatDriveAsync(HWND hwnd, UINT nDrive)
UINT _ILGetDriveType(LPCITEMIDLIST pidl)
static bool IsFloppyDrive(PCWSTR DrivePath)
static UINT _ILGetRemovableTypeId(LPCITEMIDLIST pidl)
#define RETRY_COUNT
HRESULT CDrivesContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
#define CMDID_FORMAT
static const CLSID * IsRegItem(PCUITEMID_CHILD pidl)
static BOOL TryToLockOrUnlockDrive(HANDLE hDrive, BOOL bLock)
static HRESULT getIconLocationForDrive(_In_ PCWSTR pszDrivePath, _Out_writes_z_(cchMax) PWSTR szIconFile, _In_ UINT cchMax, _Out_ int *piIndex, _Out_ UINT *pGilOut)
HRESULT CALLBACK DrivesContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
static BOOL DoEjectDrive(const WCHAR *physical, UINT nDriveType, INT *pnStringID)
static const DWORD dwComputerAttributes
BOOL SHELL32_IsShellFolderNamespaceItemHidden(LPCWSTR SubKey, REFCLSID Clsid)
Returns true if the item should be hidden in DefView but not in the Explorer folder tree.
static UINT GetCachedDriveType(INT8 DrvNum)
static const REGFOLDERINFO g_RegFolderInfo
static HRESULT GetRawDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
static int iDriveIconIds[7]
static const shvheader MyComputerSFHeader[]
static int iDriveTypeIds[7]
UINT g_IsFloppyCache
static INT8 GetDriveNumber(PCUITEMID_CHILD pidl)
#define CMDID_EJECT
INT8 GetDrivePath(PCUITEMID_CHILD pidl, PWSTR Path)
static const REQUIREDREGITEM g_RequiredItems[]
static HRESULT getLabelForDriveFromAutoRun(PCWSTR wszPath, LPWSTR szLabel, UINT cchMax)
static const DWORD dwDriveAttributes
static const DWORD dwControlPanelAttributes
#define CMDID_DISCONNECT
#define RETRY_SLEEP
static HRESULT GetDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
static UINT SHELL_GetAutoRunInfPath(PCWSTR DrvPath, PWSTR AriPath, BOOL ForInvoke=FALSE)
static DWORD CALLBACK DoFormatDriveThread(LPVOID args)
HRESULT CDrivesExtractIcon_CreateInstance(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
static bool GetRegCustomizedDriveIcon(_In_ INT8 DriveNum, _Out_writes_z_(cchMax) PWSTR szIconFile, _In_ UINT cchMax, _Out_ int *piIndex, _Out_ UINT *pGilOut)
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT CRegFolder_CreateInstance(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:995
UINT DriveType
PRTL_UNICODE_STRING_BUFFER Path
#define shell32_hInstance
UINT cchMax
Type
Definition: Type.h:7
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define IDS_PROPERTIES
Definition: resource.h:108
PWCHAR Label
Definition: format.c:69
signed char INT8
Definition: basetsd.h:183
#define STDMETHODIMP
Definition: basetyps.h:43
#define _stricmp
Definition: cat.c:22
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags, IEnumIDList *pRegEnumerator)
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
STDMETHOD() GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
STDMETHOD() Initialize(PCIDLIST_ABSOLUTE pidl) override
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
STDMETHOD() CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
STDMETHOD() ShouldShow(IShellFolder *psf, PCIDLIST_ABSOLUTE pidlFolder, PCUITEMID_CHILD pidlItem) override
STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
CComPtr< IShellFolder2 > m_regFolder
Definition: CDrivesFolder.h:38
static HRESULT SetDriveLabel(HWND hwndOwner, PCWSTR DrivePath, PCWSTR Label)
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
LPITEMIDLIST pidlRoot
Definition: CDrivesFolder.h:37
INT8 m_DriveDisplayMode
Definition: CDrivesFolder.h:39
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
HRESULT WINAPI FinalConstruct()
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
STDMETHOD() GetClassID(CLSID *lpClassId) override
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
BOOL AddToEnumList(LPITEMIDLIST pidl)
HRESULT AppendItemsFromEnumerator(IEnumIDList *pEnum)
@ TYPE_FORMATDRIVE
Definition: precomp.h:228
#define CHARS_IN_GUID
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:438
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: deviceio.c:136
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDS_SHV_COLUMN_TYPE
Definition: resource.h:89
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:88
#define IDC_PROPERTIES
Definition: resource.h:32
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define FILE_SHARE_READ
Definition: compat.h:136
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:492
BOOL WINAPI GetDiskFreeSpaceExW(IN LPCWSTR lpDirectoryName OPTIONAL, OUT PULARGE_INTEGER lpFreeBytesAvailableToCaller, OUT PULARGE_INTEGER lpTotalNumberOfBytes, OUT PULARGE_INTEGER lpTotalNumberOfFreeBytes)
Definition: disk.c:342
BOOL WINAPI GetDiskFreeSpaceExA(IN LPCSTR lpDirectoryName OPTIONAL, OUT PULARGE_INTEGER lpFreeBytesAvailableToCaller, OUT PULARGE_INTEGER lpTotalNumberOfBytes, OUT PULARGE_INTEGER lpTotalNumberOfFreeBytes)
Definition: disk.c:313
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
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
BOOL WINAPI SetVolumeLabelW(IN LPCWSTR lpRootPathName, IN LPCWSTR lpVolumeName OPTIONAL)
Definition: volume.c:503
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
Definition: path.c:1106
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
const UINT * keys
Definition: locale.c:416
BOOL WINAPI PathIsRelativeW(const WCHAR *path)
Definition: path.c:1030
int WINAPI PathParseIconLocationW(WCHAR *path)
Definition: path.c:2644
LONG WINAPI SHRegGetUSValueW(const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len, BOOL ignore_hkcu, void *default_data, DWORD default_data_len)
Definition: registry.c:4077
DWORD WINAPI DECLSPEC_HOTPATCH GetLogicalDrives(void)
Definition: volume.c:513
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
BOOL IsDriveFloppyW(LPCWSTR pszDriveRoot)
Definition: drvdefext.cpp:320
DWORD WINAPI SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options)
Definition: drive.cpp:762
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:216
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:350
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:375
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:624
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive)
Definition: path.c:351
LPSTR WINAPI StrFormatByteSize64A(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:2632
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
Definition: thread.c:356
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:31
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define L(x)
Definition: resources.c:13
#define UlongToPtr(u)
Definition: config.h:106
#define PtrToUlong(u)
Definition: config.h:107
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: fontext.cpp:109
#define FILE_READ_ONLY_VOLUME
Definition: from_kernel.h:246
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
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
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT SHELL32_ShowFilesystemItemPropertiesDialogAsync(IDataObject *pDO)
Definition: item_prop.cpp:157
#define debugstr_w
Definition: kernel32.h:32
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
#define PT_COMPUTER_REGITEM
Definition: lnktool.cpp:39
#define HResultFromWin32
Definition: loader.cpp:14
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
LPCWSTR szPath
Definition: env.c:37
static unsigned int number
Definition: dsound.c:1479
HRESULT hres
Definition: protocol.c:465
static BSTR *static LPOLESTR
Definition: varformat.c:44
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
const CLSID * clsid
Definition: msctf.cpp:50
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _Out_writes_z_(s)
Definition: no_sal2.h:180
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FSCTL_LOCK_VOLUME
Definition: nt_native.h:832
#define FSCTL_UNLOCK_VOLUME
Definition: nt_native.h:833
#define FSCTL_DISMOUNT_VOLUME
Definition: nt_native.h:834
#define DEFAULT_UNREACHABLE
#define UNICODE_NULL
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_NAME
Definition: ntquery.h:56
#define STGM_CREATE
Definition: objbase.h:945
interface IBindCtx * LPBC
Definition: objfwd.h:18
const FMTID FMTID_SummaryInformation
const GUID IID_IDataObject
#define PathAppendW
Definition: pathcch.h:310
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1805
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
Definition: pidl.c:2007
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2278
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2126
DWORD _ILGetDrive(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uSize)
Definition: pidl.c:2052
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2614
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2137
#define PT_GUID
Definition: pidl.h:87
#define PT_SHELLEXT
Definition: pidl.h:91
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define LVCFMT_RIGHT
Definition: commctrl.h:2604
#define CLSID_NULL
Definition: guiddef.h:99
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define IOCTL_STORAGE_EJECT_MEDIA
Definition: ntddstor.h:107
#define IOCTL_STORAGE_MEDIA_REMOVAL
Definition: ntddstor.h:104
@ CTF_PROCESS_REF
Definition: shlwapi.h:73
#define SHRegGetBoolUSValue
Definition: shlwapi.h:845
#define err(...)
#define REGSTR_PATH_EXPLORER
Definition: regstr.h:33
#define REG_DWORD
Definition: sdbapi.c:615
wcscpy
#define LoadStringW
Definition: utils.h:64
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:314
static HRESULT SHELL_CreateSHDESCRIPTIONID(VARIANT *pVar, DWORD Id, const CLSID *pCLSID)
Definition: shell32_main.h:312
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
#define SHELL_ErrorBox
Definition: shellutils.h:126
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:133
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
#define SHFSF_COL_COMMENT
Definition: shfldr.h:49
static HRESULT MakeSCID(SHCOLUMNID &scid, REFCLSID fmtid, UINT pid)
Definition: shfldr.h:99
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331
#define SHFSF_COL_NAME
Definition: shfldr.h:44
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:349
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:162
#define SHFSF_COL_TYPE
Definition: shfldr.h:46
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:372
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:510
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
#define PID_DESCRIPTIONID
Definition: shlguid.h:171
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define SHDID_COMPUTER_NETDRIVE
Definition: shlobj.h:1471
#define SHDID_COMPUTER_FIXED
Definition: shlobj.h:1470
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1904
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1325
#define SHDID_COMPUTER_REMOVABLE
Definition: shlobj.h:1469
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1914
#define SHCNE_MEDIAREMOVED
Definition: shlobj.h:1903
#define SHCNE_DRIVEADD
Definition: shlobj.h:1905
#define SHDID_COMPUTER_CDROM
Definition: shlobj.h:1472
#define SHFMT_ID_DEFAULT
Definition: shlobj.h:332
#define SHCNF_PATHW
Definition: shlobj.h:1933
#define SHDID_COMPUTER_OTHER
Definition: shlobj.h:1474
#define MM_ADDSEPARATOR
Definition: shlobj.h:2536
#define SHDID_COMPUTER_DRIVE35
Definition: shlobj.h:1467
struct _SFV_CREATE SFV_CREATE
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2620
#define SHCNF_FLUSHNOWAIT
Definition: shlobj.h:1937
#define SFVM_FSNOTIFY
Definition: shlobj.h:1314
@ REST_NODRIVEAUTORUN
Definition: shlobj.h:1659
@ REST_NODRIVES
Definition: shlobj.h:1658
@ REST_NODRIVETYPEAUTORUN
Definition: shlobj.h:1660
#define SHDID_COMPUTER_RAMDISK
Definition: shlobj.h:1473
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1463
FOLDERVIEWMODE
Definition: shobjidl.idl:677
@ FVM_ICON
Definition: shobjidl.idl:679
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
#define IDS_DISCONNECT
Definition: shresdef.h:244
#define IDS_DRIVE_CDROM
Definition: shresdef.h:112
#define IDS_CANTDISMOUNTVOLUME
Definition: shresdef.h:148
#define IDS_EJECT
Definition: shresdef.h:243
#define IDI_SHELL_NOT_CONNECTED_HDD
Definition: shresdef.h:647
#define IDS_DRIVE_FIXED
Definition: shresdef.h:111
#define IDS_DRIVE_NETWORK
Definition: shresdef.h:113
#define IDS_DRIVE_REMOVABLE
Definition: shresdef.h:115
#define IDI_SHELL_3_14_FLOPPY
Definition: shresdef.h:600
#define IDI_SHELL_NETDRIVE
Definition: shresdef.h:603
#define IDS_CANTLOCKVOLUME
Definition: shresdef.h:147
#define IDS_DRIVE_FLOPPY
Definition: shresdef.h:114
#define IDS_SHV_COLUMN_DISK_AVAILABLE
Definition: shresdef.h:55
#define IDI_SHELL_CDROM
Definition: shresdef.h:605
#define IDI_SHELL_DRIVE
Definition: shresdef.h:602
#define IDS_CANTEJECTMEDIA
Definition: shresdef.h:149
#define IDI_SHELL_RAMDISK
Definition: shresdef.h:606
#define IDS_CANTDISCONNECT
Definition: shresdef.h:151
#define IDI_SHELL_REMOVEABLE
Definition: shresdef.h:601
#define IDS_SHV_COLUMN_DISK_CAPACITY
Definition: shresdef.h:54
#define IDS_FORMATDRIVE
Definition: shresdef.h:229
#define IDS_SHV_COLUMN_COMMENTS
Definition: shresdef.h:67
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
@ STRRET_CSTR
Definition: shtypes.idl:87
@ STRRET_WSTR
Definition: shtypes.idl:85
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRRET str
Definition: shtypes.idl:108
BOOLEAN PreventMediaRemoval
Definition: ntddstor.h:343
HMENU hmenu
Definition: shlobj.h:1397
UINT idCmdLast
Definition: shlobj.h:1400
UINT idCmdFirst
Definition: shlobj.h:1399
UINT indexMenu
Definition: shlobj.h:1398
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
Definition: stubgen.c:11
Definition: match.c:390
Definition: name.c:39
WORD colstate
Definition: shfldr.h:32
struct tagDriveStruct drive
Definition: pidl.h:234
union tagPIDLDATA::@586 u
struct _stub stub
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:726
#define UL
Definition: tui.h:164
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
LONGLONG QuadPart
Definition: typedefs.h:114
#define _T(x)
Definition: vfdio.h:22
#define DRIVE_UNKNOWN
Definition: winbase.h:280
#define DRIVE_NO_ROOT_DIR
Definition: winbase.h:281
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define GetDriveType
Definition: winbase.h:3561
#define DRIVE_REMOTE
Definition: winbase.h:277
_In_ LPCSTR lpName
Definition: winbase.h:2543
#define DRIVE_RAMDISK
Definition: winbase.h:279
#define DRIVE_CDROM
Definition: winbase.h:278
#define DRIVE_FIXED
Definition: winbase.h:276
#define DRIVE_REMOVABLE
Definition: winbase.h:275
#define CreateFile
Definition: winbase.h:3498
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228
#define E_POINTER
Definition: winerror.h:3480
#define HRESULT_CODE(hr)
Definition: winerror.h:188
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define RRF_RT_REG_SZ
Definition: winreg.h:58
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
#define MFT_SEPARATOR
Definition: winuser.h:755
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_ICONERROR
Definition: winuser.h:798
#define MFS_ENABLED
Definition: winuser.h:761
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:757
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
DWORD WINAPI WNetCancelConnection2W(LPCWSTR lpName, DWORD dwFlags, BOOL fForce)
Definition: wnet.c:2420
#define IID_PPV_ARG(Itype, ppType)
unsigned char BYTE
Definition: xxhash.c:193