static BOOL CreateMyCompEnumList(IEnumIDListImpl *list, DWORD dwFlags) { BOOL ret = TRUE; TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags); /* enumerate the folders */ if (dwFlags & SHCONTF_FOLDERS) { WCHAR wszDriveName[] = {'A', ':', '\\', '\0'}; DWORD dwDrivemap = get_drive_map(); HKEY hkey; UINT i; while (ret && wszDriveName[0]<='Z') { if(dwDrivemap & 0x00000001L) ret = AddToEnumList(list, _ILCreateDrive(wszDriveName)); wszDriveName[0]++; dwDrivemap = dwDrivemap >> 1; } TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n",list); for (i=0; i<2; i++) { if (ret && !RegOpenKeyExW(i == 0 ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, MyComputer_NameSpaceW, 0, KEY_READ, &hkey)) { WCHAR iid[50]; int i=0; while (ret) { DWORD size; LONG r; size = sizeof(iid) / sizeof(iid[0]); r = RegEnumKeyExW(hkey, i, iid, &size, 0, NULL, NULL, NULL); if (ERROR_SUCCESS == r) { /* FIXME: shell extensions, shouldn't the type be * PT_SHELLEXT? */ ret = AddToEnumList(list, _ILCreateGuidFromStrW(iid)); i++; } else if (ERROR_NO_MORE_ITEMS == r) break; else ret = FALSE; } RegCloseKey(hkey); } } }
static BOOL CreateDesktopEnumList(IEnumIDListImpl *list, DWORD dwFlags) { BOOL ret = TRUE; WCHAR szPath[MAX_PATH]; TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags); /* enumerate the root folders */ if (dwFlags & SHCONTF_FOLDERS) { HKEY hkey; UINT i; /* create the pidl for This item */ ret = AddToEnumList(list, _ILCreateMyComputer()); for (i=0; i<2; i++) { if (ret && !RegOpenKeyExW(i == 0 ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, Desktop_NameSpaceW, 0, KEY_READ, &hkey)) { WCHAR iid[50]; int i=0; while (ret) { DWORD size; LONG r; size = sizeof (iid) / sizeof (iid[0]); r = RegEnumKeyExW(hkey, i, iid, &size, 0, NULL, NULL, NULL); if (ERROR_SUCCESS == r) { ret = AddToEnumList(list, _ILCreateGuidFromStrW(iid)); i++; } else if (ERROR_NO_MORE_ITEMS == r) break; else ret = FALSE; } RegCloseKey(hkey); } } } /* enumerate the elements in %windir%\desktop */ SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); ret = ret && CreateFolderEnumList(list, szPath, dwFlags); return ret; }
HRESULT SH_ParseGuidDisplayName(IShellFolder2 * pFolder, HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { LPITEMIDLIST pidl; if (!lpszDisplayName || !ppidl) return E_INVALIDARG; *ppidl = 0; if (pchEaten) *pchEaten = 0; UINT cch = wcslen(lpszDisplayName); if (cch < 39 || lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':') return E_FAIL; pidl = _ILCreateGuidFromStrW(lpszDisplayName + 2); if (pidl == NULL) return E_FAIL; if (cch < 41) { *ppidl = pidl; if (pdwAttributes && *pdwAttributes) { SHELL32_GetGuidItemAttributes(pFolder, *ppidl, pdwAttributes); } } else { HRESULT hr = SHELL32_ParseNextElement(pFolder, hwndOwner, pbc, &pidl, lpszDisplayName + 41, pchEaten, pdwAttributes); if (SUCCEEDED(hr)) { *ppidl = pidl; } return hr; } return S_OK; }
/************************************************************************** * CDesktopFolder::ParseDisplayName * * NOTES * "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds * to MyComputer */ HRESULT WINAPI CDesktopFolder::ParseDisplayName( HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { LPCWSTR szNext = NULL; LPITEMIDLIST pidlTemp = NULL; PARSEDURLW urldata; HRESULT hr = S_OK; TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), pchEaten, ppidl, pdwAttributes); if (!ppidl) return E_INVALIDARG; *ppidl = NULL; if (!lpszDisplayName) return E_INVALIDARG; if (pchEaten) *pchEaten = 0; /* strange but like the original */ urldata.cbSize = sizeof(urldata); if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':') { return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes); } else if (PathGetDriveNumberW (lpszDisplayName) >= 0) { /* it's a filesystem path with a drive. Let MyComputer/UnixDosFolder parse it */ pidlTemp = _ILCreateMyComputer (); szNext = lpszDisplayName; } else if (PathIsUNCW(lpszDisplayName)) { pidlTemp = _ILCreateNetwork(); szNext = lpszDisplayName; } else if( (pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName)) ) { *ppidl = pidlTemp; return S_OK; } else if (SUCCEEDED(ParseURLW(lpszDisplayName, &urldata))) { if (urldata.nScheme == URL_SCHEME_SHELL) /* handle shell: urls */ { TRACE ("-- shell url: %s\n", debugstr_w(urldata.pszSuffix)); pidlTemp = _ILCreateGuidFromStrW(urldata.pszSuffix + 2); } else return IEParseDisplayNameWithBCW(CP_ACP, lpszDisplayName, pbc, ppidl); } else { if (*lpszDisplayName) { /* it's a filesystem path on the desktop. Let a FSFolder parse it */ hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes); if (SUCCEEDED(hr)) return hr; return m_SharedDesktopFSFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes); } else pidlTemp = _ILCreateMyComputer(); szNext = NULL; } if (SUCCEEDED(hr) && pidlTemp) { if (szNext && *szNext) { hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); } else { if (pdwAttributes && *pdwAttributes) { GetAttributesOf(1, &pidlTemp, pdwAttributes); } } } if (SUCCEEDED(hr)) *ppidl = pidlTemp; else *ppidl = NULL; TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr); return hr; }
HRESULT WINAPI CDesktopFolderEnum::Initialize(CDesktopFolder *desktopFolder, HWND hwndOwner, DWORD dwFlags) { BOOL ret = TRUE; WCHAR szPath[MAX_PATH]; static const WCHAR MyDocumentsClassString[] = L"{450D8FBA-AD25-11D0-98A8-0800361B1103}"; static const WCHAR Desktop_NameSpaceW[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\Namespace"; TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags); /* enumerate the root folders */ if (dwFlags & SHCONTF_FOLDERS) { HKEY hkey; UINT i; DWORD dwResult; /* create the pidl for This item */ if (IsNamespaceExtensionHidden(MyDocumentsClassString) < 1) { ret = AddToEnumList(_ILCreateMyDocuments()); } ret = AddToEnumList(_ILCreateMyComputer()); for (i = 0; i < 2; i++) { if (i == 0) dwResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Desktop_NameSpaceW, 0, KEY_READ, &hkey); else dwResult = RegOpenKeyExW(HKEY_CURRENT_USER, Desktop_NameSpaceW, 0, KEY_READ, &hkey); if (dwResult == ERROR_SUCCESS) { WCHAR iid[50]; LPITEMIDLIST pidl; int i = 0; while (ret) { DWORD size; LONG r; size = sizeof (iid) / sizeof (iid[0]); r = RegEnumKeyExW(hkey, i, iid, &size, 0, NULL, NULL, NULL); if (ERROR_SUCCESS == r) { if (IsNamespaceExtensionHidden(iid) < 1) { pidl = _ILCreateGuidFromStrW(iid); if (pidl != NULL) { if (!HasItemWithCLSID(pidl)) { ret = AddToEnumList(pidl); } else { SHFree(pidl); } } } } else if (ERROR_NO_MORE_ITEMS == r) break; else ret = FALSE; i++; } RegCloseKey(hkey); } } for (i = 0; i < 2; i++) { if (i == 0) dwResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, ClassicStartMenuW, 0, KEY_READ, &hkey); else dwResult = RegOpenKeyExW(HKEY_CURRENT_USER, ClassicStartMenuW, 0, KEY_READ, &hkey); if (dwResult == ERROR_SUCCESS) { DWORD j = 0, dwVal, Val, dwType, dwIID; LONG r; WCHAR iid[50]; while(ret) { dwVal = sizeof(Val); dwIID = sizeof(iid) / sizeof(WCHAR); r = RegEnumValueW(hkey, j++, iid, &dwIID, NULL, &dwType, (LPBYTE)&Val, &dwVal); if (r == ERROR_SUCCESS) { if (Val == 0 && dwType == REG_DWORD) { LPITEMIDLIST pidl = _ILCreateGuidFromStrW(iid); if (pidl != NULL) { if (!HasItemWithCLSID(pidl)) { AddToEnumList(pidl); } else { SHFree(pidl); } } } } else if (ERROR_NO_MORE_ITEMS == r) break; else ret = FALSE; } RegCloseKey(hkey); } } } /* enumerate the elements in %windir%\desktop */ ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE); ret = ret && CreateFolderEnumList(szPath, dwFlags); ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE); ret = ret && CreateFolderEnumList(szPath, dwFlags); return ret ? S_OK : E_FAIL; }
BOOL CDrivesFolderEnum::CreateMyCompEnumList(DWORD dwFlags) { BOOL bRet = TRUE; static const WCHAR MyComputer_NameSpaceW[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\Namespace"; TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags); /* enumerate the folders */ if (dwFlags & SHCONTF_FOLDERS) { WCHAR wszDriveName[] = {'A', ':', '\\', '\0'}; DWORD dwDrivemap = GetLogicalDrives(); HKEY hKey; UINT i; while (bRet && wszDriveName[0] <= 'Z') { if(dwDrivemap & 0x00000001L) bRet = AddToEnumList(_ILCreateDrive(wszDriveName)); wszDriveName[0]++; dwDrivemap = dwDrivemap >> 1; } TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n", this); for (i = 0; i < 2; i++) { if (bRet && ERROR_SUCCESS == RegOpenKeyExW(i == 0 ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, MyComputer_NameSpaceW, 0, KEY_READ, &hKey)) { WCHAR wszBuf[50]; DWORD dwSize, j = 0; LONG ErrorCode; LPITEMIDLIST pidl; while (bRet) { dwSize = sizeof(wszBuf) / sizeof(wszBuf[0]); ErrorCode = RegEnumKeyExW(hKey, j, wszBuf, &dwSize, 0, NULL, NULL, NULL); if (ERROR_SUCCESS == ErrorCode) { if (wszBuf[0] != L'{') { dwSize = sizeof(wszBuf); RegGetValueW(hKey, wszBuf, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize); } /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */ pidl = _ILCreateGuidFromStrW(wszBuf); if (pidl != NULL) bRet = AddToEnumList(pidl); else ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf); j++; } else if (ERROR_NO_MORE_ITEMS == ErrorCode) break; else bRet = FALSE; } RegCloseKey(hKey); } } }