Movatterモバイル変換


[0]ホーム

URL:


Google Git
Sign in
chromium /chromium /src /refs/heads/main /. /base /base_paths_win.cc
blob: 741638e9b8bd34002376a142b4e1d4afbb2af994 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:06[diff] [blame]1// Copyright 2012 The Chromium Authors
license.botbf09a502008-08-24 00:55:55[diff] [blame]2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]4
Takuto Ikutac8d6b16f2024-04-15 16:59:19[diff] [blame]5#include"base/base_paths.h"
6
deanm@google.com5d99d63b2008-08-19 09:26:57[diff] [blame]7#include<windows.h>
Bruce Dawsona1e1cfcb2022-11-22 20:04:35[diff] [blame]8
Bruce Dawson8dcf6bc2017-12-07 17:46:04[diff] [blame]9#include<KnownFolders.h>
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]10#include<shlobj.h>
11
wfh16d2f122015-03-13 14:34:47[diff] [blame]12#include"base/environment.h"
brettw@chromium.org57999812013-02-24 05:40:52[diff] [blame]13#include"base/files/file_path.h"
Greg Thompson0a8c33ed2024-08-20 17:46:41[diff] [blame]14#include"base/files/file_util.h"
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]15#include"base/path_service.h"
jdoerrie5c4dc4e2019-02-01 18:02:33[diff] [blame]16#include"base/strings/string_util.h"
wfh16d2f122015-03-13 14:34:47[diff] [blame]17#include"base/strings/utf_string_conversions.h"
thakisd62f54472016-04-04 02:21:10[diff] [blame]18#include"base/win/current_module.h"
benwells@chromium.orgb2721b02012-08-30 09:16:55[diff] [blame]19#include"base/win/scoped_co_mem.h"
brettw@chromium.org935aa542010-10-15 01:59:15[diff] [blame]20#include"base/win/windows_version.h"
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]21
brettw@chromium.org631a5472013-02-18 06:14:59[diff] [blame]22using base::FilePath;
23
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]24namespace base{
25
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]26boolPathProviderWin(int key,FilePath* result){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]27// We need to go compute the value. It would be nice to support paths with
28// names longer than MAX_PATH, but the system functions don't seem to be
29// designed for it either, with the exception of GetTempPath (but other
30// things will surely break if the temp path is too long, so we don't bother
31// handling it.
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]32wchar_t system_buffer[MAX_PATH];
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]33 system_buffer[0]=0;
34
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]35FilePath cur;
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]36switch(key){
37case base::FILE_EXE:
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]38if(GetModuleFileName(NULL, system_buffer, MAX_PATH)==0){
aranovskii8dcedce2015-06-24 09:03:51[diff] [blame]39returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]40}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]41 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]42break;
43case base::FILE_MODULE:{
44// the resource containing module is assumed to be the one that
45// this code lives in, whether that's a dll or exe
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]46if(GetModuleFileName(CURRENT_MODULE(), system_buffer, MAX_PATH)==0){
aranovskii8dcedce2015-06-24 09:03:51[diff] [blame]47returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]48}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]49 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]50break;
51}
52case base::DIR_WINDOWS:
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]53GetWindowsDirectory(system_buffer, MAX_PATH);
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]54 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]55break;
56case base::DIR_SYSTEM:
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]57GetSystemDirectory(system_buffer, MAX_PATH);
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]58 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]59break;
abodenha@chromium.org9759ffc2011-04-25 18:03:12[diff] [blame]60case base::DIR_PROGRAM_FILESX86:
Lei Zhang10d9e1562019-03-14 18:46:02[diff] [blame]61if(win::OSInfo::GetArchitecture()!= win::OSInfo::X86_ARCHITECTURE){
abodenha@chromium.org9759ffc2011-04-25 18:03:12[diff] [blame]62if(FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]63 SHGFP_TYPE_CURRENT, system_buffer))){
abodenha@chromium.org9759ffc2011-04-25 18:03:12[diff] [blame]64returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]65}
abodenha@chromium.org9759ffc2011-04-25 18:03:12[diff] [blame]66 cur=FilePath(system_buffer);
67break;
68}
69// Fall through to base::DIR_PROGRAM_FILES if we're on an X86 machine.
Roland Bockf534f6b02022-01-04 16:09:18[diff] [blame]70[[fallthrough]];
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]71case base::DIR_PROGRAM_FILES:
72if(FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]73 SHGFP_TYPE_CURRENT, system_buffer))){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]74returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]75}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]76 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]77break;
wfh16d2f122015-03-13 14:34:47[diff] [blame]78case base::DIR_PROGRAM_FILES6432:
79#if !defined(_WIN64)
S. Ganesha4c49ce2023-11-15 02:04:25[diff] [blame]80if(base::win::OSInfo::GetInstance()->IsWowX86OnAMD64()||
81 base::win::OSInfo::GetInstance()->IsWowX86OnARM64()){
dcheng093de9b2016-04-04 21:25:51[diff] [blame]82 std::unique_ptr<base::Environment> env(base::Environment::Create());
wfh16d2f122015-03-13 14:34:47[diff] [blame]83// 32-bit process running in WOW64 sets ProgramW6432 environment
84// variable. See
85// https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx.
Helmut Januschka726658b2025-03-21 22:44:57[diff] [blame]86 std::optional<std::string> programfiles_w6432=
87 env->GetVar("ProgramW6432");
88if(!programfiles_w6432.has_value()){
wfh16d2f122015-03-13 14:34:47[diff] [blame]89returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]90}
wfh16d2f122015-03-13 14:34:47[diff] [blame]91// GetVar returns UTF8 - convert back to Wide.
Helmut Januschka726658b2025-03-21 22:44:57[diff] [blame]92 cur=FilePath(UTF8ToWide(programfiles_w6432.value()));
wfh16d2f122015-03-13 14:34:47[diff] [blame]93break;
94}
95#endif
96if(FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]97 SHGFP_TYPE_CURRENT, system_buffer))){
wfh16d2f122015-03-13 14:34:47[diff] [blame]98returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]99}
wfh16d2f122015-03-13 14:34:47[diff] [blame]100 cur=FilePath(system_buffer);
101break;
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]102case base::DIR_IE_INTERNET_CACHE:
103if(FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]104 SHGFP_TYPE_CURRENT, system_buffer))){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]105returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]106}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]107 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]108break;
109case base::DIR_COMMON_START_MENU:
110if(FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]111 SHGFP_TYPE_CURRENT, system_buffer))){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]112returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]113}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]114 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]115break;
116case base::DIR_START_MENU:
jdoerrie5c4dc4e2019-02-01 18:02:33[diff] [blame]117if(FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]118 system_buffer))){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]119returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]120}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]121 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]122break;
Carlos Frias5ddded62020-05-27 23:38:18[diff] [blame]123case base::DIR_COMMON_STARTUP:
124if(FAILED(SHGetFolderPath(nullptr, CSIDL_COMMON_STARTUP,nullptr,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]125 SHGFP_TYPE_CURRENT, system_buffer))){
Carlos Frias5ddded62020-05-27 23:38:18[diff] [blame]126returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]127}
Carlos Frias5ddded62020-05-27 23:38:18[diff] [blame]128 cur=FilePath(system_buffer);
129break;
130case base::DIR_USER_STARTUP:
131if(FAILED(SHGetFolderPath(nullptr, CSIDL_STARTUP,nullptr,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]132 SHGFP_TYPE_CURRENT, system_buffer))){
Carlos Frias5ddded62020-05-27 23:38:18[diff] [blame]133returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]134}
Carlos Frias5ddded62020-05-27 23:38:18[diff] [blame]135 cur=FilePath(system_buffer);
136break;
David Dorwin048cb9da2021-11-09 00:22:44[diff] [blame]137case base::DIR_ROAMING_APP_DATA:
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]138if(FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]139 system_buffer))){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]140returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]141}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]142 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]143break;
alexeypa@chromium.orgbf3e52c32012-04-04 05:18:47[diff] [blame]144case base::DIR_COMMON_APP_DATA:
145if(FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]146 SHGFP_TYPE_CURRENT, system_buffer))){
alexeypa@chromium.orgbf3e52c32012-04-04 05:18:47[diff] [blame]147returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]148}
alexeypa@chromium.orgbf3e52c32012-04-04 05:18:47[diff] [blame]149 cur=FilePath(system_buffer);
150break;
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]151case base::DIR_LOCAL_APP_DATA:
152if(FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]153 SHGFP_TYPE_CURRENT, system_buffer))){
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]154returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]155}
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]156 cur=FilePath(system_buffer);
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]157break;
David Dorwinc694f722021-10-29 22:46:59[diff] [blame]158case base::DIR_SRC_TEST_DATA_ROOT:{
tkent@chromium.org14a25e502010-06-15 06:53:52[diff] [blame]159FilePath executableDir;
erikkay@google.com37088fef2008-08-15 17:32:10[diff] [blame]160// On Windows, unit tests execute two levels deep from the source root.
161// For example: chrome/{Debug|Release}/ui_tests.exe
tkent@chromium.org14a25e502010-06-15 06:53:52[diff] [blame]162PathService::Get(base::DIR_EXE,&executableDir);
163 cur= executableDir.DirName().DirName();
erikkay@google.com37088fef2008-08-15 17:32:10[diff] [blame]164break;
tkent@chromium.org14a25e502010-06-15 06:53:52[diff] [blame]165}
benwells@chromium.orgb2721b02012-08-30 09:16:55[diff] [blame]166case base::DIR_APP_SHORTCUTS:{
benwells@chromium.orgb2721b02012-08-30 09:16:55[diff] [blame]167 base::win::ScopedCoMem<wchar_t> path_buf;
168if(FAILED(SHGetKnownFolderPath(FOLDERID_ApplicationShortcuts,0, NULL,
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]169&path_buf))){
benwells@chromium.orgb2721b02012-08-30 09:16:55[diff] [blame]170returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]171}
benwells@chromium.orgb2721b02012-08-30 09:16:55[diff] [blame]172
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]173 cur=FilePath(path_buf.get());
benwells@chromium.orgb2721b02012-08-30 09:16:55[diff] [blame]174break;
175}
gab@chromium.orgdea1d7d2012-09-20 16:24:52[diff] [blame]176case base::DIR_USER_DESKTOP:
177if(FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL,
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]178 SHGFP_TYPE_CURRENT, system_buffer))){
gab@chromium.orgdea1d7d2012-09-20 16:24:52[diff] [blame]179returnfalse;
180}
181 cur=FilePath(system_buffer);
182break;
183case base::DIR_COMMON_DESKTOP:
184if(FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL,
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]185 SHGFP_TYPE_CURRENT, system_buffer))){
gab@chromium.orgdea1d7d2012-09-20 16:24:52[diff] [blame]186returnfalse;
187}
188 cur=FilePath(system_buffer);
189break;
190case base::DIR_USER_QUICK_LAUNCH:
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]191if(!PathService::Get(base::DIR_ROAMING_APP_DATA,&cur)){
gab@chromium.orgdea1d7d2012-09-20 16:24:52[diff] [blame]192returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]193}
gab@chromium.orgda4d4fb2014-08-08 18:17:53[diff] [blame]194// According to various sources, appending
195// "Microsoft\Internet Explorer\Quick Launch" to %appdata% is the only
196// reliable way to get the quick launch folder across all versions of
197// Windows.
198// http://stackoverflow.com/questions/76080/how-do-you-reliably-get-the-quick-
199// http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx
pmonette565a8802016-06-21 00:03:43[diff] [blame]200 cur= cur.Append(FILE_PATH_LITERAL("Microsoft"))
201.Append(FILE_PATH_LITERAL("Internet Explorer"))
202.Append(FILE_PATH_LITERAL("Quick Launch"));
gab@chromium.orgdea1d7d2012-09-20 16:24:52[diff] [blame]203break;
Greg Thompson62b01f82020-03-11 15:39:00[diff] [blame]204case base::DIR_TASKBAR_PINS:{
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]205if(!PathService::Get(base::DIR_USER_QUICK_LAUNCH,&cur)){
gab@chromium.orge5f9d822012-11-06 22:27:01[diff] [blame]206returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]207}
pmonette5057ca3b2016-07-04 16:48:40[diff] [blame]208 cur= cur.Append(FILE_PATH_LITERAL("User Pinned"))
209.Append(FILE_PATH_LITERAL("TaskBar"));
210break;
Greg Thompson62b01f82020-03-11 15:39:00[diff] [blame]211}
pmonette5057ca3b2016-07-04 16:48:40[diff] [blame]212case base::DIR_IMPLICIT_APP_SHORTCUTS:
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]213if(!PathService::Get(base::DIR_USER_QUICK_LAUNCH,&cur)){
pmonette5057ca3b2016-07-04 16:48:40[diff] [blame]214returnfalse;
Peter Kasting134ef9af2024-12-28 02:30:09[diff] [blame]215}
pmonette5057ca3b2016-07-04 16:48:40[diff] [blame]216 cur= cur.Append(FILE_PATH_LITERAL("User Pinned"))
217.Append(FILE_PATH_LITERAL("ImplicitAppShortcuts"));
gab@chromium.orge5f9d822012-11-06 22:27:01[diff] [blame]218break;
scottmg@chromium.org3f18e8d2014-03-26 01:41:04[diff] [blame]219case base::DIR_WINDOWS_FONTS:
jdoerrie5c4dc4e2019-02-01 18:02:33[diff] [blame]220if(FAILED(SHGetFolderPath(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT,
Jan Wilken Dörrieb630aca2019-12-04 10:59:11[diff] [blame]221 system_buffer))){
scottmg@chromium.org3f18e8d2014-03-26 01:41:04[diff] [blame]222returnfalse;
223}
224 cur=FilePath(system_buffer);
225break;
Greg Thompson0a8c33ed2024-08-20 17:46:41[diff] [blame]226case base::DIR_SYSTEM_TEMP:
227// Try C:\Windows\SystemTemp, which was introduced sometime before Windows
228// 10 build 19042. Do not use GetTempPath2, as it only appeared later and
229// will only return the path for processes running as SYSTEM.
230if(PathService::Get(DIR_WINDOWS,&cur)){
231 cur= cur.Append(FILE_PATH_LITERAL("SystemTemp"));
232if(PathIsWritable(cur)){
233break;
234}
235}
236// Failing that, use C:\Program Files or C:\Program Files (x86) for older
237// versions of Windows 10.
238if(!PathService::Get(DIR_PROGRAM_FILES,&cur)||!PathIsWritable(cur)){
239returnfalse;
240}
241break;
Foromo Daniel Soromoua1e334d2025-03-06 23:35:36[diff] [blame]242case base::DIR_ONE_DRIVE:{
243 base::win::ScopedCoMem<wchar_t> path_buf;
244// FOLDERID_OneDrive points on the user OneDrive folder. The default path
245// is %USERPROFILE%\OneDrive. It is formerly known as FOLDERID_SkyDrive.
246if(FAILED(SHGetKnownFolderPath(FOLDERID_OneDrive,0, NULL,&path_buf))){
247returnfalse;
248}
249
250 cur=FilePath(path_buf.get());
251break;
252}
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]253default:
254returnfalse;
255}
256
evanm@google.com4792a262008-11-19 16:50:03[diff] [blame]257*result= cur;
erikkay@google.comac510e12008-08-05 19:46:31[diff] [blame]258returntrue;
259}
260
261}// namespace base

[8]ページ先頭

©2009-2025 Movatter.jp