ReactOS 0.4.17-dev-1133-gc25e4fd
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
308static const CMVERBMAP g_VerbMap[] =
309{
310 { "format", CMDID_FORMAT },
311 { "eject", CMDID_EJECT },
312 { "disconnect", CMDID_DISCONNECT },
313};
314
316 HWND hwnd,
317 IDataObject *pdtobj,
318 UINT uMsg,
321{
322 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND && uMsg != DFM_MAPCOMMANDNAME)
323 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
324
325 PIDLIST_ABSOLUTE pidlFolder;
326 PUITEMID_CHILD *apidl;
327 UINT cidl;
329 HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
331 return hr;
332
333 WCHAR szDrive[8] = {0};
334 if (!_ILGetDrive(apidl[0], szDrive, _countof(szDrive)))
335 {
336 ERR("pidl is not a drive\n");
337 SHFree(pidlFolder);
338 _ILFreeaPidl(apidl, cidl);
339 return E_FAIL;
340 }
341 UINT nDriveType = GetCachedDriveType(szDrive);
342 if (!GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, &dwFlags, NULL, 0))
343 {
344 if (nDriveType >= DRIVE_REMOTE)
346 else
347 dwFlags = 0; // Assume drive with unknown filesystem, allow format
348 }
349
350 if (uMsg == DFM_MERGECONTEXTMENU)
351 {
352 QCMINFO *pqcminfo = (QCMINFO *)lParam;
353
354 UINT idCmdFirst = pqcminfo->idCmdFirst;
355 UINT idCmd = 0;
356 if (!(dwFlags & FILE_READ_ONLY_VOLUME) && nDriveType != DRIVE_REMOTE && cidl == 1)
357 {
358 /* add separator and Format */
359 idCmd = idCmdFirst + CMDID_FORMAT;
360 _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
362 }
363 if (nDriveType == DRIVE_REMOVABLE || nDriveType == DRIVE_CDROM)
364 {
365 /* add separator and Eject */
366 idCmd = idCmdFirst + CMDID_EJECT;
367 _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
369 }
370 if (nDriveType == DRIVE_REMOTE)
371 {
372 /* add separator and Disconnect */
373 idCmd = idCmdFirst + CMDID_DISCONNECT;
374 _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
376 }
377
378 if (idCmd)
379 pqcminfo->idCmdFirst = (idCmd + 2); // Note: This assumes the items above are added in ascending id order.
380 // CORE-18577: We add 2 instead of 1 because the other is for our separator!
381 // Our CDefaultContextMenu::QueryContextMenu incorrectly assumes
382 // all DFM_MERGECONTEXTMENU added items have IDs.
383 hr = S_OK;
384 }
385 else if (uMsg == DFM_INVOKECOMMAND)
386 {
387 WCHAR wszBuf[4] = L"A:\\";
388 wszBuf[0] = (WCHAR)szDrive[0];
389
390 INT nStringID = 0;
391 DWORD dwError = NO_ERROR;
392
394 {
395 ATLASSERT(pdtobj);
397 // Not setting nStringID because SHOpenPropSheet already displayed an error box
398 }
399 else
400 {
401 if (wParam == CMDID_FORMAT)
402 {
403 hr = DoFormatDriveAsync(hwnd, szDrive[0] - 'A');
404 }
405 else if (wParam == CMDID_EJECT)
406 {
407 /* do eject */
408 WCHAR physical[10];
409 wsprintfW(physical, _T("\\\\.\\%c:"), szDrive[0]);
410
411 if (DoEjectDrive(physical, nDriveType, &nStringID))
412 {
414 }
415 else
416 {
417 dwError = GetLastError();
418 }
419 }
420 else if (wParam == CMDID_DISCONNECT)
421 {
422 /* do disconnect */
423 wszBuf[2] = UNICODE_NULL;
424 dwError = WNetCancelConnection2W(wszBuf, 0, FALSE);
425 if (dwError == NO_ERROR)
426 {
428 }
429 else
430 {
431 nStringID = IDS_CANTDISCONNECT;
432 }
433 }
434 else if (hr == S_OK)
435 {
436 hr = E_INVALIDARG; // Don't eat DFM_CMD_* in CDefaultContextMenu::Do*
437 }
438 }
439
440 if (nStringID != 0)
441 {
442 /* show error message */
443 WCHAR szFormat[128], szMessage[128];
444 LoadStringW(shell32_hInstance, nStringID, szFormat, _countof(szFormat));
445 wsprintfW(szMessage, szFormat, dwError);
446 MessageBoxW(hwnd, szMessage, NULL, MB_ICONERROR);
447 }
448 }
449 else if (uMsg == DFM_MAPCOMMANDNAME)
450 {
451 CMINVOKECOMMANDINFOEX ici = { sizeof(ici), CMIC_MASK_UNICODE };
452 ici.lpVerbW = (PWSTR)lParam;
453 if (SUCCEEDED(hr = SHELL_MapContextMenuVerbToCmdId((CMINVOKECOMMANDINFO*)&ici, g_VerbMap)))
454 {
455 *(int*)wParam = hr;
456 hr = S_OK;
457 }
458 }
459
460 SHFree(pidlFolder);
461 _ILFreeaPidl(apidl, cidl);
462
463 return hr;
464}
465
467 HWND hwnd,
468 UINT cidl,
470 IShellFolder *psf,
471 IContextMenu **ppcm)
472{
474 AddClassKeyToArray(L"Drive", keys, keys);
475 AddClassKeyToArray(L"Folder", keys, keys);
476 return CDefFolderMenu_Create2(pidlFolder, hwnd, cidl, apidl, psf, DrivesContextMenuCallback, keys, keys, ppcm);
477}
478
479static HRESULT
481 _In_ PCWSTR pszDrivePath,
482 _Out_writes_z_(cchMax) PWSTR szIconFile,
484 _Out_ int *piIndex,
485 _Out_ UINT *pGilOut)
486{
487 WCHAR wszPath[MAX_PATH];
488 WCHAR wszAutoRunInfPath[MAX_PATH];
489 WCHAR wszValue[MAX_PATH], wszTemp[MAX_PATH];
490
491 if (!SHELL_GetAutoRunInfPath(pszDrivePath, wszAutoRunInfPath))
492 return E_FAIL;
493 wcscpy(wszPath, pszDrivePath);
494
495 // autorun.inf --> wszValue
496 if (GetPrivateProfileStringW(L"autorun", L"icon", NULL, wszValue, _countof(wszValue),
497 wszAutoRunInfPath) && wszValue[0] != 0)
498 {
499 // wszValue --> wszTemp
500 ExpandEnvironmentStringsW(wszValue, wszTemp, _countof(wszTemp));
501
502 *piIndex = PathParseIconLocationW(wszTemp);
503
504 // wszPath + wszTemp --> wszPath
505 if (PathIsRelativeW(wszTemp))
506 PathAppendW(wszPath, wszTemp);
507 else
508 StringCchCopyW(wszPath, _countof(wszPath), wszTemp);
509
510 // wszPath --> szIconFile
511 GetFullPathNameW(wszPath, cchMax, szIconFile, NULL);
512 return S_OK;
513 }
514 return E_FAIL;
515}
516
517static HRESULT
519{
520 WCHAR wszAutoRunInfPath[MAX_PATH];
521 WCHAR wszTemp[MAX_PATH];
522
523 if (!SHELL_GetAutoRunInfPath(wszPath, wszAutoRunInfPath))
524 return E_FAIL;
525
526 if (GetPrivateProfileStringW(L"autorun", L"label", NULL, wszTemp, _countof(wszTemp),
527 wszAutoRunInfPath) && wszTemp[0] != 0)
528 {
529 return StringCchCopyW(szLabel, cchMax, wszTemp);
530 }
531 return E_FAIL;
532}
533
534static inline HRESULT GetRawDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
535{
536 if (GetVolumeInformationW(DrivePath, szLabel, cchMax, NULL, NULL, NULL, NULL, 0))
537 return *szLabel ? S_OK : S_FALSE;
539}
540
541static HRESULT GetDriveLabel(PCWSTR DrivePath, LPWSTR szLabel, UINT cchMax)
542{
543 HRESULT hr = getLabelForDriveFromAutoRun(DrivePath, szLabel, cchMax);
544 return hr == S_OK ? S_OK : GetRawDriveLabel(DrivePath, szLabel, cchMax);
545}
546
548 _In_ INT8 DriveNum,
549 _Out_writes_z_(cchMax) PWSTR szIconFile,
551 _Out_ int *piIndex,
552 _Out_ UINT *pGilOut)
553{
554 WCHAR szKey[200], chDrv = 'A' + DriveNum;
555 wsprintfW(szKey, L"%s\\DriveIcons\\%c\\DefaultIcon", REGSTR_PATH_EXPLORER, chDrv);
556 DWORD cb = cchMax * sizeof(*szIconFile);
558 if (err != ERROR_SUCCESS)
559 {
560 cb = cchMax * sizeof(*szIconFile);
561 wsprintfW(szKey, L"Applications\\Explorer.exe\\Drives\\%c\\DefaultIcon", chDrv);
562 err = RegGetValueW(HKEY_CLASSES_ROOT, szKey, NULL, RRF_RT_REG_SZ, NULL, szIconFile, &cb);
563 }
564 if (err != ERROR_SUCCESS)
565 return false;
566 *piIndex = PathParseIconLocationW(szIconFile);
567 return *szIconFile != UNICODE_NULL;
568}
569
571{
572 CComPtr<IDefaultExtractIconInit> initIcon;
575 return hr;
576
577 WCHAR wTemp[MAX_PATH], szDrive[8];
578 int icon_idx, reg_idx = 0;
579 UINT GilOut = 0;
580 BOOL bFloppy = FALSE;
581 INT8 DriveNum = GetDrivePath(pidl, szDrive);
585
586 switch (DriveType)
587 {
588 case DRIVE_REMOVABLE:
589 bFloppy = IsFloppyDrive(szDrive);
590 reg_idx = bFloppy ? IDI_SHELL_3_14_FLOPPY : IDI_SHELL_REMOVEABLE;
591 break;
592 case DRIVE_FIXED:
593 reg_idx = IDI_SHELL_DRIVE;
594 break;
595 case DRIVE_REMOTE:
596 reg_idx = IDI_SHELL_NETDRIVE;
597 break;
598 case DRIVE_CDROM:
599 reg_idx = IDI_SHELL_CDROM;
600 break;
601 case DRIVE_RAMDISK:
602 reg_idx = IDI_SHELL_RAMDISK;
603 break;
604 }
605
606 hr = getIconLocationForDrive(szDrive, wTemp, _countof(wTemp),
607 &icon_idx, &GilOut);
608 if (SUCCEEDED(hr))
609 {
610 initIcon->SetNormalIcon(wTemp, icon_idx);
611 }
612 else if (DriveType > DRIVE_NO_ROOT_DIR &&
613 GetRegCustomizedDriveIcon(DriveNum, wTemp, _countof(wTemp), &icon_idx, &GilOut))
614 {
615 initIcon->SetNormalIcon(wTemp, icon_idx);
616 }
617 else if (reg_idx && HLM_GetIconW(reg_idx - 1, wTemp, _countof(wTemp), &icon_idx))
618 {
619 initIcon->SetNormalIcon(wTemp, icon_idx);
620 }
621 else if (DriveType == DRIVE_FIXED &&
622 HCR_GetIconW(L"Drive", wTemp, NULL, _countof(wTemp), &icon_idx))
623 {
624 initIcon->SetNormalIcon(wTemp, icon_idx);
625 }
626 else
627 {
628 if (DriveType == DRIVE_REMOVABLE && bFloppy)
629 icon_idx = IDI_SHELL_3_14_FLOPPY;
630 else
631 icon_idx = iDriveIconIds[DriveType];
632 initIcon->SetNormalIcon(swShell32Name, -icon_idx);
633 }
634
635 return initIcon->QueryInterface(riid, ppvOut);
636}
637
639 public CEnumIDListBase
640{
641 public:
642 HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags, IEnumIDList* pRegEnumerator)
643 {
644 /* enumerate the folders */
645 if (dwFlags & SHCONTF_FOLDERS)
646 {
647 WCHAR wszDriveName[] = {'A', ':', '\\', '\0'};
648 DWORD dwDrivemap = GetLogicalDrives() & ~SHRestricted(REST_NODRIVES);
649 for (; wszDriveName[0] <= 'Z'; wszDriveName[0]++)
650 {
651 if (dwDrivemap & 1)
652 AddToEnumList(_ILCreateDrive(wszDriveName));
653 dwDrivemap >>= 1;
654 }
655 }
656
657 /* Enumerate the items of the reg folder */
658 AppendItemsFromEnumerator(pRegEnumerator);
659
660 return S_OK;
661 }
662
664 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
666};
667
668/***********************************************************************
669* IShellFolder [MyComputer] implementation
670*/
671
678};
679
681 SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
682 SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
684 SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CANLINK;
686 SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
687 SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANCOPY;
688
690{
691 pidlRoot = NULL;
693}
694
696{
697 TRACE("-- destroying IShellFolder(%p)\n", this);
699}
700
702{
703 pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
704 if (pidlRoot == NULL)
705 return E_OUTOFMEMORY;
706
707 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
709 pidlRoot,
711
712 return hr;
713}
714
715/**************************************************************************
716* CDrivesFolder::ParseDisplayName
717*/
718HRESULT WINAPI CDrivesFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName,
719 DWORD * pchEaten, PIDLIST_RELATIVE * ppidl, DWORD * pdwAttributes)
720{
722
723 TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this,
724 hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
725 pchEaten, ppidl, pdwAttributes);
726
727 if (!ppidl)
728 return hr;
729
730 *ppidl = NULL;
731
732 if (!lpszDisplayName)
733 return hr;
734
735 /* handle CLSID paths */
736 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
737 {
738 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
739 pdwAttributes);
740 }
741
742 if (((L'A' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'Z') ||
743 (L'a' <= lpszDisplayName[0] && lpszDisplayName[0] <= L'z')) &&
744 lpszDisplayName[1] == L':' && (lpszDisplayName[2] == L'\\' || !lpszDisplayName[2]))
745 {
746 if (!lpszDisplayName[2] && LOBYTE(GetVersion()) < 6)
747 return E_INVALIDARG; // NT5 does not support parsing "c:"
748
749 // "C:\..."
750 WCHAR szRoot[8];
751 PathBuildRootW(szRoot, ((*lpszDisplayName - 1) & 0x1F));
752
753 if (SHIsFileSysBindCtx(pbc, NULL) != S_OK && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
754 {
755 if (::GetDriveType(szRoot) == DRIVE_NO_ROOT_DIR)
757 }
758
759 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateDrive(szRoot));
760 if (!pidlTemp)
761 return E_OUTOFMEMORY;
762
763 if (lpszDisplayName[2] && lpszDisplayName[3])
764 {
765 CComPtr<IShellFolder> pChildFolder;
766 hr = BindToObject(pidlTemp, pbc, IID_PPV_ARG(IShellFolder, &pChildFolder));
768 return hr;
769
770 ULONG chEaten;
771 CComHeapPtr<ITEMIDLIST> pidlChild;
772 hr = pChildFolder->ParseDisplayName(hwndOwner, pbc, &lpszDisplayName[3], &chEaten,
773 &pidlChild, pdwAttributes);
775 return hr;
776
777 hr = SHILCombine(pidlTemp, pidlChild, ppidl);
778 }
779 else
780 {
781 *ppidl = pidlTemp.Detach();
782 if (pdwAttributes && *pdwAttributes)
783 GetAttributesOf(1, (PCUITEMID_CHILD_ARRAY)ppidl, pdwAttributes);
784 hr = S_OK;
785 }
786 }
787
788 TRACE("(%p)->(-- ret=0x%08x)\n", this, hr);
789
790 return hr;
791}
792
793/**************************************************************************
794* CDrivesFolder::EnumObjects
795*/
796HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
797{
798 CComPtr<IEnumIDList> pRegEnumerator;
799 m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
800
801 return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
802}
803
804/**************************************************************************
805* CDrivesFolder::BindToObject
806*/
808{
809 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this,
810 pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut);
811
812 if (!pidl)
813 return E_INVALIDARG;
814
815 if (_ILIsSpecialFolder(pidl))
816 return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
817
818 CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
819
820 PERSIST_FOLDER_TARGET_INFO pfti = {0};
821 pfti.dwAttributes = -1;
822 pfti.csidl = -1;
823 pfti.szTargetParsingName[0] = *pchDrive;
824 pfti.szTargetParsingName[1] = L':';
825 pfti.szTargetParsingName[2] = L'\\';
826
828 &pfti,
829 pidl,
830 &CLSID_ShellFSFolder,
831 riid,
832 ppvOut);
834 return hr;
835
836 return S_OK;
837}
838
839/**************************************************************************
840* CDrivesFolder::BindToStorage
841*/
843{
844 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this,
845 pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
846
847 *ppvOut = NULL;
848 return E_NOTIMPL;
849}
850
851/**************************************************************************
852* CDrivesFolder::CompareIDs
853*/
855{
857 UINT iColumn = LOWORD(lParam);
858
859 if (iColumn >= _countof(MyComputerSFHeader))
860 return E_INVALIDARG;
861
862 if (!pidl1 || !pidl2)
863 {
864 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
865 return E_INVALIDARG;
866 }
867
868 CHAR* pszDrive1 = _ILIsDrive(pidl1) ? _ILGetDataPointer(pidl1)->u.drive.szDriveName : NULL;
869 if (!pszDrive1 && !IsRegItem(pidl1) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
870 return E_INVALIDARG;
871 CHAR* pszDrive2 = _ILIsDrive(pidl2) ? _ILGetDataPointer(pidl2)->u.drive.szDriveName : NULL;
872 if (!pszDrive2 && !IsRegItem(pidl2) && FAILED_UNEXPECTEDLY(E_INVALIDARG))
873 return E_INVALIDARG;
874
875 int result;
876 switch (MyComputerSFHeader[iColumn].colnameid)
877 {
879 {
880 if (!pszDrive1 && !pszDrive2)
881 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
882 else if (pszDrive1 && pszDrive2)
883 result = _stricmp(pszDrive1, pszDrive2);
884 else
885 result = (int)!pszDrive1 - (int)!pszDrive2; // Sort drives first
887 break;
888 }
889
892 {
893 if (!pszDrive1 || !pszDrive2)
894 {
895 hres = MAKE_COMPARE_HRESULT((int)!pszDrive1 - (int)!pszDrive2);
896 break;
897 }
898
899 ULARGE_INTEGER Drive1Available, Drive1Total, Drive2Available, Drive2Total;
900 BOOL bValid1 = FALSE, bValid2 = FALSE;
901
902 if (GetVolumeInformationA(pszDrive1, NULL, 0, NULL, NULL, NULL, NULL, 0))
903 bValid1 = GetDiskFreeSpaceExA(pszDrive1, &Drive1Available, &Drive1Total, NULL);
904 else
905 Drive1Available.QuadPart = Drive1Total.QuadPart = 0;
906
907 if (GetVolumeInformationA(pszDrive2, NULL, 0, NULL, NULL, NULL, NULL, 0))
908 bValid2 = GetDiskFreeSpaceExA(pszDrive2, &Drive2Available, &Drive2Total, NULL);
909 else
910 Drive2Available.QuadPart = Drive2Total.QuadPart = 0;
911
912 LARGE_INTEGER Diff;
913 if (MyComputerSFHeader[iColumn].colnameid == IDS_SHV_COLUMN_DISK_CAPACITY) /* Size */
914 Diff.QuadPart = Drive1Total.QuadPart - Drive2Total.QuadPart;
915 else /* Size available */
916 Diff.QuadPart = Drive1Available.QuadPart - Drive2Available.QuadPart;
917
918 if (bValid1 != bValid2)
919 hres = MAKE_COMPARE_HRESULT((int)!bValid1 - (int)!bValid2);
920 else
922
923 break;
924 }
927 {
928 /* We want to return immediately because SHELL32_CompareDetails also compares children. */
929 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
930 }
932 }
933
934 if (HRESULT_CODE(hres) == 0)
935 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
936
937 return hres;
938}
939
940/**************************************************************************
941* CDrivesFolder::CreateViewObject
942*/
944{
945 CComPtr<IShellView> pShellView;
947
948 TRACE("(%p)->(hwnd=%p,%s,%p)\n", this,
949 hwndOwner, shdebugstr_guid (&riid), ppvOut);
950
951 if (!ppvOut)
952 return hr;
953
954 *ppvOut = NULL;
955
956 if (IsEqualIID(riid, IID_IDropTarget))
957 {
958 WARN("IDropTarget not implemented\n");
959 hr = E_NOTIMPL;
960 }
961 else if (IsEqualIID(riid, IID_IContextMenu))
962 {
963 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this };
964 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
965 }
966 else if (IsEqualIID(riid, IID_IShellView))
967 {
968 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this, NULL, this };
969 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
970 }
971 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
972 return hr;
973}
974
975/**************************************************************************
976* CDrivesFolder::GetAttributesOf
977*/
979{
980 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
981 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
982
983 if (cidl && !apidl)
984 return E_INVALIDARG;
985
986 if (*rgfInOut == 0)
987 *rgfInOut = ~0;
988
989 if(cidl == 0)
990 *rgfInOut &= dwComputerAttributes;
991 else
992 {
993 for (UINT i = 0; i < cidl; ++i)
994 {
995 if (_ILIsDrive(apidl[i]))
996 {
997 *rgfInOut &= dwDriveAttributes;
998
999 if (_ILGetDriveType(apidl[i]) == DRIVE_CDROM)
1000 *rgfInOut &= ~SFGAO_CANRENAME; // CD-ROM drive cannot rename
1001 }
1002 else if (IsRegItem(apidl[i], CLSID_ControlPanel))
1003 {
1004 *rgfInOut &= dwControlPanelAttributes;
1005 }
1006 else if (_ILIsSpecialFolder(*apidl))
1007 {
1008 m_regFolder->GetAttributesOf(1, &apidl[i], rgfInOut);
1009 }
1010 else
1011 {
1012 ERR("Got unknown pidl type!\n");
1013 }
1014 }
1015 }
1016
1017 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1018 *rgfInOut &= ~SFGAO_VALIDATE;
1019
1020 TRACE("-- result=0x%08x\n", *rgfInOut);
1021 return S_OK;
1022}
1023
1024/**************************************************************************
1025* CDrivesFolder::GetUIObjectOf
1026*
1027* PARAMETERS
1028* hwndOwner [in] Parent window for any output
1029* cidl [in] array size
1030* apidl [in] simple pidl array
1031* riid [in] Requested Interface
1032* prgfInOut [ ] reserved
1033* ppvObject [out] Resulting Interface
1034*
1035*/
1037 UINT cidl, PCUITEMID_CHILD_ARRAY apidl,
1038 REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
1039{
1040 LPVOID pObj = NULL;
1042
1043 TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", this,
1044 hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1045
1046 if (!ppvOut)
1047 return hr;
1048
1049 *ppvOut = NULL;
1050
1051 if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
1052 {
1053 if (_ILIsDrive(apidl[0]))
1054 hr = CDrivesContextMenu_CreateInstance(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
1055 else
1056 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1057 }
1058 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
1059 {
1060 hr = IDataObject_Constructor(hwndOwner,
1061 pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1062 }
1063 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1064 {
1065 if (_ILIsDrive(apidl[0]))
1066 hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1067 else
1068 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
1069 }
1070 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
1071 {
1072 CComPtr<IShellFolder> psfChild;
1073 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1075 return hr;
1076
1077 return psfChild->CreateViewObject(NULL, riid, ppvOut);
1078 }
1079 else
1080 hr = E_NOINTERFACE;
1081
1082 if (SUCCEEDED(hr) && !pObj)
1083 hr = E_OUTOFMEMORY;
1084
1085 *ppvOut = pObj;
1086 TRACE("(%p)->hr=0x%08x\n", this, hr);
1087 return hr;
1088}
1089
1090/**************************************************************************
1091* CDrivesFolder::GetDisplayNameOf
1092*/
1094{
1095 WCHAR szDrive[8];
1096
1097 TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
1098 pdump (pidl);
1099
1100 if (!strRet)
1101 return E_INVALIDARG;
1102
1103 if (!_ILIsPidlSimple (pidl))
1104 {
1105 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1106 }
1107 else if (_ILIsSpecialFolder(pidl))
1108 {
1109 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
1110 }
1111 else if (GetDrivePath(pidl, szDrive) < 0)
1112 {
1113 ERR("Wrong pidl type\n");
1114 return E_INVALIDARG;
1115 }
1116
1117 PWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1118 if (!pszPath)
1119 return E_OUTOFMEMORY;
1120 pszPath[0] = UNICODE_NULL;
1121 szDrive[0] &= ~32; // Always uppercase
1122
1123 /* long view "lw_name (C:)" */
1125 if (!(dwFlags & SHGDN_FORPARSING))
1126 {
1127 if (m_DriveDisplayMode < 0)
1128 {
1129 DWORD err, type, data, cb = sizeof(data);
1130 err = SHRegGetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer",
1131 L"ShowDriveLettersFirst", &type, &data, &cb, FALSE, NULL, 0);
1132 m_DriveDisplayMode = (!err && type == REG_DWORD && cb == sizeof(data)) ? (BYTE)data : 0;
1133 }
1134 BOOL bRemoteFirst = m_DriveDisplayMode == 1;
1135 BOOL bNoLetter = m_DriveDisplayMode == 2;
1136 BOOL bAllFirst = m_DriveDisplayMode == 4;
1137 PWSTR pszLabel = pszPath;
1138
1139 if (!bNoLetter && (bAllFirst || (bRemoteFirst && GetCachedDriveType(szDrive) == DRIVE_REMOTE)))
1140 {
1141 bNoLetter = TRUE; // Handling the letter now, don't append it again later
1142 if (!bEditLabel)
1143 pszLabel += wsprintfW(pszPath, L"(%c:) ", szDrive[0]);
1144 }
1145
1146 if (GetDriveLabel(szDrive, pszLabel, MAX_PATH - 7) != S_OK && !bEditLabel)
1147 {
1148 UINT ResId = 0, DrvType = GetCachedDriveType(szDrive);
1149 if (DrvType == DRIVE_REMOVABLE)
1151 else if (DrvType < _countof(iDriveTypeIds))
1152 ResId = iDriveTypeIds[DrvType];
1153
1154 if (ResId)
1155 {
1156 UINT len = LoadStringW(shell32_hInstance, ResId, pszLabel, MAX_PATH - 7);
1157 if (len > MAX_PATH - 7)
1158 pszLabel[MAX_PATH-7] = UNICODE_NULL;
1159 }
1160 }
1161
1162 if (!*pszLabel && !bEditLabel) // No label nor fallback description, use SHGDN_FORPARSING
1163 *pszPath = UNICODE_NULL;
1164 else if (!bNoLetter && !bEditLabel)
1165 wsprintfW(pszPath + wcslen(pszPath), L" (%c:)", szDrive[0]);
1166 }
1167
1168 if (!*pszPath && !bEditLabel) // SHGDN_FORPARSING or failure above (except editing empty label)
1169 {
1171 szDrive[2] = UNICODE_NULL; // Remove backslash
1172 wcscpy(pszPath, szDrive);
1173 }
1174 strRet->uType = STRRET_WSTR;
1175 strRet->pOleStr = pszPath;
1176
1177 TRACE("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1178 return S_OK;
1179}
1180
1181/**************************************************************************
1182* CDrivesFolder::SetNameOf
1183* Changes the name of a file object or subfolder, possibly changing its item
1184* identifier in the process.
1185*
1186* PARAMETERS
1187* hwndOwner [in] Owner window for output
1188* pidl [in] simple pidl of item to change
1189* lpszName [in] the items new display name
1190* dwFlags [in] SHGNO formatting flags
1191* ppidlOut [out] simple pidl returned
1192*/
1194 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
1195{
1196 if (_ILIsDrive(pidl))
1197 {
1198 WCHAR szDrive[8];
1199 HRESULT hr = GetDrivePath(pidl, szDrive) >= 0 ? SetDriveLabel(hwndOwner, szDrive, lpName) : E_FAIL;
1200 if (pPidlOut)
1201 *pPidlOut = SUCCEEDED(hr) ? _ILCreateDrive(szDrive) : NULL;
1202 return hr;
1203 }
1204 return m_regFolder->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
1205}
1206
1208{
1210 if (SUCCEEDED(hr))
1211 SHChangeNotify(SHCNE_RENAMEFOLDER, SHCNF_PATHW, DrivePath, DrivePath); // DisplayName changed
1212 else if (hwndOwner)
1213 SHELL_ErrorBox(hwndOwner, hr);
1214 return hr;
1215}
1216
1218{
1219 if (LOBYTE(GetVersion()) >= 6)
1220 return E_NOTIMPL;
1221 *pguid = CLSID_ShellSearchExt;
1222 return S_OK;
1223}
1224
1226{
1227 *ppenum = NULL;
1228 return E_NOTIMPL;
1229}
1230
1232{
1233 TRACE("(%p)\n", this);
1234 return E_NOTIMPL; // Not required when column 0 is our default.
1235}
1236
1238{
1239 TRACE("(%p)\n", this);
1240
1241 if (!pcsFlags || iColumn >= _countof(MyComputerSFHeader))
1242 return E_INVALIDARG;
1243 *pcsFlags = MyComputerSFHeader[iColumn].colstate;
1244 return S_OK;
1245}
1246
1248{
1249 const CLSID *pCLSID = IsRegItem(pidl);
1250 if (pscid->fmtid == FMTID_ShellDetails)
1251 {
1252 switch (pscid->pid)
1253 {
1254 case PID_DESCRIPTIONID:
1255 {
1256 if (pCLSID)
1259 switch (_ILGetDriveType(pidl))
1260 {
1261 case DRIVE_REMOVABLE: id = _ILGetRemovableTypeId(pidl); break;
1262 case DRIVE_FIXED: id = SHDID_COMPUTER_FIXED; break;
1263 case DRIVE_REMOTE: id = SHDID_COMPUTER_NETDRIVE; break;
1264 case DRIVE_CDROM: id = SHDID_COMPUTER_CDROM; break;
1265 case DRIVE_RAMDISK: id = SHDID_COMPUTER_RAMDISK; break;
1266 }
1267 return SHELL_CreateSHDESCRIPTIONID(pv, id, &CLSID_NULL);
1268 }
1269 }
1270 }
1271 if (pCLSID)
1272 return m_regFolder->GetDetailsEx(pidl, pscid, pv);
1273 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, FALSE);
1274}
1275
1277{
1278 HRESULT hr;
1279
1280 TRACE("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1281
1282 if (!psd || iColumn >= _countof(MyComputerSFHeader))
1283 return E_INVALIDARG;
1284
1285 if (!pidl)
1286 {
1287 psd->fmt = MyComputerSFHeader[iColumn].fmt;
1288 psd->cxChar = MyComputerSFHeader[iColumn].cxChar;
1289 return SHSetStrRet(&psd->str, MyComputerSFHeader[iColumn].colnameid);
1290 }
1291 else if (!_ILIsDrive(pidl))
1292 {
1293 switch (MyComputerSFHeader[iColumn].colnameid)
1294 {
1296 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_NAME, psd);
1298 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_TYPE, psd);
1301 return SHSetStrRetEmpty(&psd->str);
1303 return m_regFolder->GetDetailsOf(pidl, SHFSF_COL_COMMENT, psd);
1305 }
1306 }
1307 else
1308 {
1309 ULARGE_INTEGER ulTotalBytes, ulFreeBytes;
1310 WCHAR szDrive[8];
1311 INT8 DriveNum = GetDrivePath(pidl, szDrive);
1312 UINT DriveType = GetCachedDriveType(DriveNum);
1315
1316 switch (MyComputerSFHeader[iColumn].colnameid)
1317 {
1320 break;
1322 if (DriveType == DRIVE_UNKNOWN)
1323 hr = SHSetStrRetEmpty(&psd->str);
1324 else if (DriveType == DRIVE_REMOVABLE && IsFloppyDrive(szDrive))
1325 hr = SHSetStrRet(&psd->str, IDS_DRIVE_FLOPPY);
1326 else
1327 hr = SHSetStrRet(&psd->str, iDriveTypeIds[DriveType]);
1328 break;
1331 psd->str.cStr[0] = 0x00;
1332 psd->str.uType = STRRET_CSTR;
1333 if (GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, NULL, NULL, 0))
1334 {
1335 GetDiskFreeSpaceExW(szDrive, &ulFreeBytes, &ulTotalBytes, NULL);
1336 if (iColumn == 2)
1337 StrFormatByteSize64A(ulTotalBytes.QuadPart, psd->str.cStr, MAX_PATH);
1338 else
1339 StrFormatByteSize64A(ulFreeBytes.QuadPart, psd->str.cStr, MAX_PATH);
1340 }
1341 hr = S_OK;
1342 break;
1344 hr = SHSetStrRetEmpty(&psd->str); /* FIXME: comments */
1345 break;
1347 }
1348 }
1349
1350 return hr;
1351}
1352
1354{
1355 switch (column < _countof(MyComputerSFHeader) ? MyComputerSFHeader[column].colnameid : ~0UL)
1356 {
1357 case IDS_SHV_COLUMN_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
1358 case IDS_SHV_COLUMN_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
1359 case IDS_SHV_COLUMN_COMMENTS: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
1360 }
1361 return E_INVALIDARG;
1362}
1363
1364/************************************************************************
1365 * CDrivesFolder::GetClassID
1366 */
1368{
1369 TRACE("(%p)\n", this);
1370
1371 if (!lpClassId)
1372 return E_POINTER;
1373
1374 *lpClassId = CLSID_MyComputer;
1375 return S_OK;
1376}
1377
1378/************************************************************************
1379 * CDrivesFolder::Initialize
1380 *
1381 * NOTES: it makes no sense to change the pidl
1382 */
1384{
1385 return S_OK;
1386}
1387
1388/**************************************************************************
1389 * CDrivesFolder::GetCurFolder
1390 */
1392{
1393 TRACE("(%p)->(%p)\n", this, pidl);
1394
1395 if (!pidl)
1396 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1397
1398 *pidl = ILClone(pidlRoot);
1399 return S_OK;
1400}
1401
1402/**************************************************************************
1403 * CDrivesFolder::ShouldShow
1404 */
1406{
1407 if (const CLSID* pClsid = IsRegItem(pidlItem))
1408 return SHELL32_IsShellFolderNamespaceItemHidden(L"HideMyComputerIcons", *pClsid) ? S_FALSE : S_OK;
1409 return S_OK;
1410}
1411
1412/**************************************************************************
1413 * CDrivesFolder::MessageSFVCB (IShellFolderViewCB)
1414 */
1416{
1417 switch (uMsg)
1418 {
1419 case SFVM_FSNOTIFY:
1420 if (lParam == SHCNE_DRIVEADD && wParam)
1421 {
1422 g_IsFloppyCache = 0;
1424 if (drive >= 0 && ((1UL << drive) & SHRestricted(REST_NODRIVES)))
1425 return S_FALSE;
1426 }
1427 else if (lParam == SHCNE_DRIVEREMOVED)
1428 {
1429 g_IsFloppyCache = 0;
1430 }
1431 break;
1432 #if ROSPOLICY_DRIVESFOLDER_DEFLARGEICONS
1433 case SFVM_DEFVIEWMODE:
1435 return S_OK;
1436 #endif
1437 }
1438 return E_NOTIMPL;
1439}
1440
1441/************************************************************************/
1442/* IContextMenuCB interface */
1443
1445{
1446 enum { IDC_PROPERTIES };
1447 /* no data object means no selection */
1448 if (!pdtobj)
1449 {
1450 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1451 {
1452 // "System" properties
1453 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"sysdm.cpl") ? S_OK : E_FAIL;
1454 }
1455 else if (uMsg == DFM_MERGECONTEXTMENU) // TODO: DFM_MERGECONTEXTMENU_BOTTOM
1456 {
1457 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1458 HMENU hpopup = CreatePopupMenu();
1460 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1461 DestroyMenu(hpopup);
1462 return S_OK;
1463 }
1464 }
1465 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1466}
#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:4806
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)
@ CMDID_FORMAT
@ CMDID_DISCONNECT
@ CMDID_EJECT
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)
INT8 GetDrivePath(PCUITEMID_CHILD pidl, PWSTR Path)
static const REQUIREDREGITEM g_RequiredItems[]
static HRESULT getLabelForDriveFromAutoRun(PCWSTR wszPath, LPWSTR szLabel, UINT cchMax)
static const CMVERBMAP g_VerbMap[]
static const DWORD dwDriveAttributes
static const DWORD dwControlPanelAttributes
#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
#define IID_PPV_ARG(Itype, ppType)
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:235
#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:90
#define IDS_SHV_COLUMN_NAME
Definition: resource.h:89
#define IDC_PROPERTIES
Definition: resource.h:35
#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
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
#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:1164
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:418
BOOL WINAPI PathIsRelativeW(const WCHAR *path)
Definition: path.c:1006
int WINAPI PathParseIconLocationW(WCHAR *path)
Definition: path.c:2620
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 GetVersion(void)
Definition: version.c:1458
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:2988
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE thread_proc, void *data, DWORD flags, LPTHREAD_START_ROUTINE callback)
Definition: main.c:1628
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:223
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:336
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:361
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:656
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1874
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
LPWSTR WINAPI PathBuildRootW(LPWSTR lpszPath, int drive)
Definition: path.c:105
LPSTR WINAPI StrFormatByteSize64A(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:997
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
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
unsigned int UINT
Definition: sysinfo.c:13
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 LOBYTE(W)
Definition: jmemdos.c:487
#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
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:432
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
_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:1807
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
Definition: pidl.c:2009
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2280
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2128
DWORD _ILGetDrive(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uSize)
Definition: pidl.c:2054
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2616
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2139
#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
#define SHRegGetBoolUSValue
Definition: shlwapi.h:845
@ CTF_PROCESS_REF
Definition: shlwapi.h:73
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
#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:318
static HRESULT SHELL_CreateSHDESCRIPTIONID(VARIANT *pVar, DWORD Id, const CLSID *pCLSID)
Definition: shell32_main.h:324
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:740
#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:152
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:325
#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:363
#define SHFSF_COL_NAME
Definition: shfldr.h:44
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:381
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:167
#define SHFSF_COL_TYPE
Definition: shfldr.h:46
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:404
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:542
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
#define PID_DESCRIPTIONID
Definition: shlguid.h:175
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:1480
#define SHDID_COMPUTER_FIXED
Definition: shlobj.h:1479
#define SHCNE_DRIVEREMOVED
Definition: shlobj.h:1914
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1334
#define SHDID_COMPUTER_REMOVABLE
Definition: shlobj.h:1478
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1924
#define SHCNE_MEDIAREMOVED
Definition: shlobj.h:1913
#define SHCNE_DRIVEADD
Definition: shlobj.h:1915
#define SHDID_COMPUTER_CDROM
Definition: shlobj.h:1481
#define SHFMT_ID_DEFAULT
Definition: shlobj.h:332
#define SHCNF_PATHW
Definition: shlobj.h:1943
#define DFM_MAPCOMMANDNAME
Definition: shlobj.h:2619
#define SHDID_COMPUTER_OTHER
Definition: shlobj.h:1483
#define MM_ADDSEPARATOR
Definition: shlobj.h:2546
#define SHDID_COMPUTER_DRIVE35
Definition: shlobj.h:1476
struct _SFV_CREATE SFV_CREATE
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2630
#define SHCNF_FLUSHNOWAIT
Definition: shlobj.h:1947
#define SFVM_FSNOTIFY
Definition: shlobj.h:1323
@ REST_NODRIVEAUTORUN
Definition: shlobj.h:1669
@ REST_NODRIVES
Definition: shlobj.h:1668
@ REST_NODRIVETYPEAUTORUN
Definition: shlobj.h:1670
#define SHDID_COMPUTER_RAMDISK
Definition: shlobj.h:1482
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1472
FOLDERVIEWMODE
Definition: shobjidl.idl:722
@ FVM_ICON
Definition: shobjidl.idl:724
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
#define IDS_DISCONNECT
Definition: shresdef.h:242
#define IDS_DRIVE_CDROM
Definition: shresdef.h:110
#define IDS_CANTDISMOUNTVOLUME
Definition: shresdef.h:146
#define IDS_EJECT
Definition: shresdef.h:241
#define IDI_SHELL_NOT_CONNECTED_HDD
Definition: shresdef.h:645
#define IDS_DRIVE_FIXED
Definition: shresdef.h:109
#define IDS_DRIVE_NETWORK
Definition: shresdef.h:111
#define IDS_DRIVE_REMOVABLE
Definition: shresdef.h:113
#define IDI_SHELL_3_14_FLOPPY
Definition: shresdef.h:598
#define IDI_SHELL_NETDRIVE
Definition: shresdef.h:601
#define IDS_CANTLOCKVOLUME
Definition: shresdef.h:145
#define IDS_DRIVE_FLOPPY
Definition: shresdef.h:112
#define IDS_SHV_COLUMN_DISK_AVAILABLE
Definition: shresdef.h:53
#define IDI_SHELL_CDROM
Definition: shresdef.h:603
#define IDI_SHELL_DRIVE
Definition: shresdef.h:600
#define IDS_CANTEJECTMEDIA
Definition: shresdef.h:147
#define IDI_SHELL_RAMDISK
Definition: shresdef.h:604
#define IDS_CANTDISCONNECT
Definition: shresdef.h:149
#define IDI_SHELL_REMOVEABLE
Definition: shresdef.h:599
#define IDS_SHV_COLUMN_DISK_CAPACITY
Definition: shresdef.h:52
#define IDS_FORMATDRIVE
Definition: shresdef.h:227
#define IDS_SHV_COLUMN_COMMENTS
Definition: shresdef.h:65
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:1406
UINT idCmdLast
Definition: shlobj.h:1409
UINT idCmdFirst
Definition: shlobj.h:1408
UINT indexMenu
Definition: shlobj.h:1407
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
union tagPIDLDATA::@697 u
struct tagDriveStruct drive
Definition: pidl.h:234
struct _stub stub
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:726
#define UL
Definition: tui.h:165
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:281
#define DRIVE_NO_ROOT_DIR
Definition: winbase.h:282
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define GetDriveType
Definition: winbase.h:3535
#define DRIVE_REMOTE
Definition: winbase.h:278
_In_ LPCSTR lpName
Definition: winbase.h:2519
#define DRIVE_RAMDISK
Definition: winbase.h:280
#define DRIVE_CDROM
Definition: winbase.h:279
#define DRIVE_FIXED
Definition: winbase.h:277
#define DRIVE_REMOVABLE
Definition: winbase.h:276
#define CreateFile
Definition: winbase.h:3472
_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
DWORD WINAPI WNetCancelConnection2W(LPCWSTR lpName, DWORD dwFlags, BOOL fForce)
Definition: wnet.c:2420
unsigned char BYTE
Definition: xxhash.c:193