xref: /aosp_15_r20/external/cronet/base/base_paths_win.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/base_paths.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <windows.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <KnownFolders.h>
10*6777b538SAndroid Build Coastguard Worker #include <shlobj.h>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/environment.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/path_service.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/win/current_module.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_co_mem.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_version.h"
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker using base::FilePath;
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace base {
24*6777b538SAndroid Build Coastguard Worker 
PathProviderWin(int key,FilePath * result)25*6777b538SAndroid Build Coastguard Worker bool PathProviderWin(int key, FilePath* result) {
26*6777b538SAndroid Build Coastguard Worker   // We need to go compute the value. It would be nice to support paths with
27*6777b538SAndroid Build Coastguard Worker   // names longer than MAX_PATH, but the system functions don't seem to be
28*6777b538SAndroid Build Coastguard Worker   // designed for it either, with the exception of GetTempPath (but other
29*6777b538SAndroid Build Coastguard Worker   // things will surely break if the temp path is too long, so we don't bother
30*6777b538SAndroid Build Coastguard Worker   // handling it.
31*6777b538SAndroid Build Coastguard Worker   wchar_t system_buffer[MAX_PATH];
32*6777b538SAndroid Build Coastguard Worker   system_buffer[0] = 0;
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker   FilePath cur;
35*6777b538SAndroid Build Coastguard Worker   switch (key) {
36*6777b538SAndroid Build Coastguard Worker     case base::FILE_EXE:
37*6777b538SAndroid Build Coastguard Worker       if (GetModuleFileName(NULL, system_buffer, MAX_PATH) == 0)
38*6777b538SAndroid Build Coastguard Worker         return false;
39*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
40*6777b538SAndroid Build Coastguard Worker       break;
41*6777b538SAndroid Build Coastguard Worker     case base::FILE_MODULE: {
42*6777b538SAndroid Build Coastguard Worker       // the resource containing module is assumed to be the one that
43*6777b538SAndroid Build Coastguard Worker       // this code lives in, whether that's a dll or exe
44*6777b538SAndroid Build Coastguard Worker       if (GetModuleFileName(CURRENT_MODULE(), system_buffer, MAX_PATH) == 0)
45*6777b538SAndroid Build Coastguard Worker         return false;
46*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
47*6777b538SAndroid Build Coastguard Worker       break;
48*6777b538SAndroid Build Coastguard Worker     }
49*6777b538SAndroid Build Coastguard Worker     case base::DIR_WINDOWS:
50*6777b538SAndroid Build Coastguard Worker       GetWindowsDirectory(system_buffer, MAX_PATH);
51*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
52*6777b538SAndroid Build Coastguard Worker       break;
53*6777b538SAndroid Build Coastguard Worker     case base::DIR_SYSTEM:
54*6777b538SAndroid Build Coastguard Worker       GetSystemDirectory(system_buffer, MAX_PATH);
55*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
56*6777b538SAndroid Build Coastguard Worker       break;
57*6777b538SAndroid Build Coastguard Worker     case base::DIR_PROGRAM_FILESX86:
58*6777b538SAndroid Build Coastguard Worker       if (win::OSInfo::GetArchitecture() != win::OSInfo::X86_ARCHITECTURE) {
59*6777b538SAndroid Build Coastguard Worker         if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, NULL,
60*6777b538SAndroid Build Coastguard Worker                                    SHGFP_TYPE_CURRENT, system_buffer)))
61*6777b538SAndroid Build Coastguard Worker           return false;
62*6777b538SAndroid Build Coastguard Worker         cur = FilePath(system_buffer);
63*6777b538SAndroid Build Coastguard Worker         break;
64*6777b538SAndroid Build Coastguard Worker       }
65*6777b538SAndroid Build Coastguard Worker       // Fall through to base::DIR_PROGRAM_FILES if we're on an X86 machine.
66*6777b538SAndroid Build Coastguard Worker       [[fallthrough]];
67*6777b538SAndroid Build Coastguard Worker     case base::DIR_PROGRAM_FILES:
68*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
69*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
70*6777b538SAndroid Build Coastguard Worker         return false;
71*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
72*6777b538SAndroid Build Coastguard Worker       break;
73*6777b538SAndroid Build Coastguard Worker     case base::DIR_PROGRAM_FILES6432:
74*6777b538SAndroid Build Coastguard Worker #if !defined(_WIN64)
75*6777b538SAndroid Build Coastguard Worker       if (base::win::OSInfo::GetInstance()->IsWowX86OnAMD64() ||
76*6777b538SAndroid Build Coastguard Worker           base::win::OSInfo::GetInstance()->IsWowX86OnARM64()) {
77*6777b538SAndroid Build Coastguard Worker         std::unique_ptr<base::Environment> env(base::Environment::Create());
78*6777b538SAndroid Build Coastguard Worker         std::string programfiles_w6432;
79*6777b538SAndroid Build Coastguard Worker         // 32-bit process running in WOW64 sets ProgramW6432 environment
80*6777b538SAndroid Build Coastguard Worker         // variable. See
81*6777b538SAndroid Build Coastguard Worker         // https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx.
82*6777b538SAndroid Build Coastguard Worker         if (!env->GetVar("ProgramW6432", &programfiles_w6432))
83*6777b538SAndroid Build Coastguard Worker           return false;
84*6777b538SAndroid Build Coastguard Worker         // GetVar returns UTF8 - convert back to Wide.
85*6777b538SAndroid Build Coastguard Worker         cur = FilePath(UTF8ToWide(programfiles_w6432));
86*6777b538SAndroid Build Coastguard Worker         break;
87*6777b538SAndroid Build Coastguard Worker       }
88*6777b538SAndroid Build Coastguard Worker #endif
89*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL,
90*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
91*6777b538SAndroid Build Coastguard Worker         return false;
92*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
93*6777b538SAndroid Build Coastguard Worker       break;
94*6777b538SAndroid Build Coastguard Worker     case base::DIR_IE_INTERNET_CACHE:
95*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL,
96*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
97*6777b538SAndroid Build Coastguard Worker         return false;
98*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
99*6777b538SAndroid Build Coastguard Worker       break;
100*6777b538SAndroid Build Coastguard Worker     case base::DIR_COMMON_START_MENU:
101*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL,
102*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
103*6777b538SAndroid Build Coastguard Worker         return false;
104*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
105*6777b538SAndroid Build Coastguard Worker       break;
106*6777b538SAndroid Build Coastguard Worker     case base::DIR_START_MENU:
107*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT,
108*6777b538SAndroid Build Coastguard Worker                                  system_buffer)))
109*6777b538SAndroid Build Coastguard Worker         return false;
110*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
111*6777b538SAndroid Build Coastguard Worker       break;
112*6777b538SAndroid Build Coastguard Worker     case base::DIR_COMMON_STARTUP:
113*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(nullptr, CSIDL_COMMON_STARTUP, nullptr,
114*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
115*6777b538SAndroid Build Coastguard Worker         return false;
116*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
117*6777b538SAndroid Build Coastguard Worker       break;
118*6777b538SAndroid Build Coastguard Worker     case base::DIR_USER_STARTUP:
119*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(nullptr, CSIDL_STARTUP, nullptr,
120*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
121*6777b538SAndroid Build Coastguard Worker         return false;
122*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
123*6777b538SAndroid Build Coastguard Worker       break;
124*6777b538SAndroid Build Coastguard Worker     case base::DIR_ROAMING_APP_DATA:
125*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT,
126*6777b538SAndroid Build Coastguard Worker                                  system_buffer)))
127*6777b538SAndroid Build Coastguard Worker         return false;
128*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
129*6777b538SAndroid Build Coastguard Worker       break;
130*6777b538SAndroid Build Coastguard Worker     case base::DIR_COMMON_APP_DATA:
131*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL,
132*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
133*6777b538SAndroid Build Coastguard Worker         return false;
134*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
135*6777b538SAndroid Build Coastguard Worker       break;
136*6777b538SAndroid Build Coastguard Worker     case base::DIR_LOCAL_APP_DATA:
137*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL,
138*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer)))
139*6777b538SAndroid Build Coastguard Worker         return false;
140*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
141*6777b538SAndroid Build Coastguard Worker       break;
142*6777b538SAndroid Build Coastguard Worker     case base::DIR_SRC_TEST_DATA_ROOT: {
143*6777b538SAndroid Build Coastguard Worker       FilePath executableDir;
144*6777b538SAndroid Build Coastguard Worker       // On Windows, unit tests execute two levels deep from the source root.
145*6777b538SAndroid Build Coastguard Worker       // For example:  chrome/{Debug|Release}/ui_tests.exe
146*6777b538SAndroid Build Coastguard Worker       PathService::Get(base::DIR_EXE, &executableDir);
147*6777b538SAndroid Build Coastguard Worker       cur = executableDir.DirName().DirName();
148*6777b538SAndroid Build Coastguard Worker       break;
149*6777b538SAndroid Build Coastguard Worker     }
150*6777b538SAndroid Build Coastguard Worker     case base::DIR_APP_SHORTCUTS: {
151*6777b538SAndroid Build Coastguard Worker       base::win::ScopedCoMem<wchar_t> path_buf;
152*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetKnownFolderPath(FOLDERID_ApplicationShortcuts, 0, NULL,
153*6777b538SAndroid Build Coastguard Worker                                       &path_buf)))
154*6777b538SAndroid Build Coastguard Worker         return false;
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker       cur = FilePath(path_buf.get());
157*6777b538SAndroid Build Coastguard Worker       break;
158*6777b538SAndroid Build Coastguard Worker     }
159*6777b538SAndroid Build Coastguard Worker     case base::DIR_USER_DESKTOP:
160*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL,
161*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer))) {
162*6777b538SAndroid Build Coastguard Worker         return false;
163*6777b538SAndroid Build Coastguard Worker       }
164*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
165*6777b538SAndroid Build Coastguard Worker       break;
166*6777b538SAndroid Build Coastguard Worker     case base::DIR_COMMON_DESKTOP:
167*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL,
168*6777b538SAndroid Build Coastguard Worker                                  SHGFP_TYPE_CURRENT, system_buffer))) {
169*6777b538SAndroid Build Coastguard Worker         return false;
170*6777b538SAndroid Build Coastguard Worker       }
171*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
172*6777b538SAndroid Build Coastguard Worker       break;
173*6777b538SAndroid Build Coastguard Worker     case base::DIR_USER_QUICK_LAUNCH:
174*6777b538SAndroid Build Coastguard Worker       if (!PathService::Get(base::DIR_ROAMING_APP_DATA, &cur))
175*6777b538SAndroid Build Coastguard Worker         return false;
176*6777b538SAndroid Build Coastguard Worker       // According to various sources, appending
177*6777b538SAndroid Build Coastguard Worker       // "Microsoft\Internet Explorer\Quick Launch" to %appdata% is the only
178*6777b538SAndroid Build Coastguard Worker       // reliable way to get the quick launch folder across all versions of
179*6777b538SAndroid Build Coastguard Worker       // Windows.
180*6777b538SAndroid Build Coastguard Worker       // http://stackoverflow.com/questions/76080/how-do-you-reliably-get-the-quick-
181*6777b538SAndroid Build Coastguard Worker       // http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx
182*6777b538SAndroid Build Coastguard Worker       cur = cur.Append(FILE_PATH_LITERAL("Microsoft"))
183*6777b538SAndroid Build Coastguard Worker                 .Append(FILE_PATH_LITERAL("Internet Explorer"))
184*6777b538SAndroid Build Coastguard Worker                 .Append(FILE_PATH_LITERAL("Quick Launch"));
185*6777b538SAndroid Build Coastguard Worker       break;
186*6777b538SAndroid Build Coastguard Worker     case base::DIR_TASKBAR_PINS: {
187*6777b538SAndroid Build Coastguard Worker       if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur))
188*6777b538SAndroid Build Coastguard Worker         return false;
189*6777b538SAndroid Build Coastguard Worker       cur = cur.Append(FILE_PATH_LITERAL("User Pinned"))
190*6777b538SAndroid Build Coastguard Worker                 .Append(FILE_PATH_LITERAL("TaskBar"));
191*6777b538SAndroid Build Coastguard Worker       break;
192*6777b538SAndroid Build Coastguard Worker     }
193*6777b538SAndroid Build Coastguard Worker     case base::DIR_IMPLICIT_APP_SHORTCUTS:
194*6777b538SAndroid Build Coastguard Worker       if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur))
195*6777b538SAndroid Build Coastguard Worker         return false;
196*6777b538SAndroid Build Coastguard Worker       cur = cur.Append(FILE_PATH_LITERAL("User Pinned"))
197*6777b538SAndroid Build Coastguard Worker                 .Append(FILE_PATH_LITERAL("ImplicitAppShortcuts"));
198*6777b538SAndroid Build Coastguard Worker       break;
199*6777b538SAndroid Build Coastguard Worker     case base::DIR_WINDOWS_FONTS:
200*6777b538SAndroid Build Coastguard Worker       if (FAILED(SHGetFolderPath(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT,
201*6777b538SAndroid Build Coastguard Worker                                  system_buffer))) {
202*6777b538SAndroid Build Coastguard Worker         return false;
203*6777b538SAndroid Build Coastguard Worker       }
204*6777b538SAndroid Build Coastguard Worker       cur = FilePath(system_buffer);
205*6777b538SAndroid Build Coastguard Worker       break;
206*6777b538SAndroid Build Coastguard Worker     default:
207*6777b538SAndroid Build Coastguard Worker       return false;
208*6777b538SAndroid Build Coastguard Worker   }
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   *result = cur;
211*6777b538SAndroid Build Coastguard Worker   return true;
212*6777b538SAndroid Build Coastguard Worker }
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker }  // namespace base
215