static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) { char name[MAX_PATH]; char value[MAX_PATH]; HKEY hkey; int cnt = 0; if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) { int idx = 0; for(;; ++idx) { DWORD nameLen = MAX_PATH; DWORD valueLen = MAX_PATH; if (RegEnumValueA(hkey, idx, name, &nameLen, NULL, NULL, (LPBYTE)&value, &valueLen) != ERROR_SUCCESS) break; if (SHELL_RegisterCPanelApp(list, value)) ++cnt; } RegCloseKey(hkey); } return cnt; }
/************************************************************************** * CreateCPanelEnumList() */ static BOOL CreateCPanelEnumList(IEnumIDListImpl *list, DWORD dwFlags) { CHAR szPath[MAX_PATH]; WIN32_FIND_DATAA wfd; HANDLE hFile; TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags); /* enumerate control panel folders */ if (dwFlags & SHCONTF_FOLDERS) SHELL_RegisterCPanelFolders(list, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace"); /* enumerate the control panel applets */ if (dwFlags & SHCONTF_NONFOLDERS) { LPSTR p; GetSystemDirectoryA(szPath, MAX_PATH); p = PathAddBackslashA(szPath); strcpy(p, "*.cpl"); TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n", list, debugstr_a(szPath)); hFile = FindFirstFileA(szPath, &wfd); if (hFile != INVALID_HANDLE_VALUE) { do { if (!(dwFlags & SHCONTF_INCLUDEHIDDEN) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) continue; if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { strcpy(p, wfd.cFileName); SHELL_RegisterCPanelApp(list, szPath); } } while(FindNextFileA(hFile, &wfd)); FindClose(hFile); } SHELL_RegisterRegistryCPanelApps(list, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); SHELL_RegisterRegistryCPanelApps(list, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); } return TRUE; }