Skip to content

Commit afc92f2

Browse files
committed
libstd: win: Replace GetUserProfileDirectoryW by SHGetFolderPathW
The later is allowed on UWP
1 parent 0214d3c commit afc92f2

File tree

2 files changed

+19
-20
lines changed

2 files changed

+19
-20
lines changed

src/libstd/sys/windows/c.rs

+12-7
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,15 @@ pub const SECURITY_SQOS_PRESENT: DWORD = 0x00100000;
108108

109109
pub const FIONBIO: c_ulong = 0x8004667e;
110110

111+
pub const CSIDL_PROFILE: c_int = 0x0028;
112+
113+
#[repr(C)]
114+
#[allow(dead_code)] // we only use some variants
115+
pub enum SHGFP_TYPE {
116+
SHGFP_TYPE_CURRENT = 0,
117+
SHGFP_TYPE_DEFAULT = 1
118+
}
119+
111120
#[cfg(target_arch = "arm")]
112121
const ARM_MAX_BREAKPOINTS: usize = 8;
113122
#[cfg(target_arch = "arm")]
@@ -154,7 +163,6 @@ pub const WSAECONNREFUSED: c_int = 10061;
154163

155164
pub const MAX_PROTOCOL_CHAIN: DWORD = 7;
156165

157-
pub const TOKEN_READ: DWORD = 0x20008;
158166
pub const MAXIMUM_REPARSE_DATA_BUFFER_SIZE: usize = 16 * 1024;
159167
pub const FSCTL_GET_REPARSE_POINT: DWORD = 0x900a8;
160168
pub const IO_REPARSE_TAG_SYMLINK: DWORD = 0xa000000c;
@@ -1056,9 +1064,6 @@ extern "system" {
10561064
pub fn GetCommandLineW() -> *mut LPCWSTR;
10571065
pub fn GetTempPathW(nBufferLength: DWORD,
10581066
lpBuffer: LPCWSTR) -> DWORD;
1059-
pub fn OpenProcessToken(ProcessHandle: HANDLE,
1060-
DesiredAccess: DWORD,
1061-
TokenHandle: *mut HANDLE) -> BOOL;
10621067
pub fn GetCurrentProcess() -> HANDLE;
10631068
pub fn GetCurrentThread() -> HANDLE;
10641069
pub fn GetStdHandle(which: DWORD) -> HANDLE;
@@ -1083,9 +1088,9 @@ extern "system" {
10831088
pub fn SwitchToThread() -> BOOL;
10841089
pub fn Sleep(dwMilliseconds: DWORD);
10851090
pub fn GetProcessId(handle: HANDLE) -> DWORD;
1086-
pub fn GetUserProfileDirectoryW(hToken: HANDLE,
1087-
lpProfileDir: LPWSTR,
1088-
lpcchSize: *mut DWORD) -> BOOL;
1091+
pub fn SHGetFolderPathW(handle: HANDLE, csidl: c_int,
1092+
hToken: HANDLE, dwFlags: DWORD,
1093+
pszPath: LPWSTR) -> DWORD;
10891094
#[cfg(not(target_os = "uwp"))]
10901095
pub fn SetHandleInformation(hObject: HANDLE,
10911096
dwMask: DWORD,

src/libstd/sys/windows/os.rs

+7-13
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use crate::path::{self, PathBuf};
1313
use crate::ptr;
1414
use crate::slice;
1515
use crate::sys::{c, cvt};
16-
use crate::sys::handle::Handle;
1716

1817
use super::to_u16s;
1918

@@ -288,19 +287,14 @@ pub fn home_dir() -> Option<PathBuf> {
288287
crate::env::var_os("HOME").or_else(|| {
289288
crate::env::var_os("USERPROFILE")
290289
}).map(PathBuf::from).or_else(|| unsafe {
291-
let me = c::GetCurrentProcess();
292-
let mut token = ptr::null_mut();
293-
if c::OpenProcessToken(me, c::TOKEN_READ, &mut token) == 0 {
294-
return None
290+
let mut bufArray = [0u16; 260]; // MAX_PATH
291+
let buf = bufArray[..].as_mut_ptr();
292+
match c::SHGetFolderPathW(ptr::null_mut(), c::CSIDL_PROFILE,
293+
ptr::null_mut(), c::SHGFP_TYPE::SHGFP_TYPE_CURRENT as u32,
294+
buf) {
295+
0 => Some(super::os2path(&bufArray[..])),
296+
_ => None
295297
}
296-
let _handle = Handle::new(token);
297-
super::fill_utf16_buf(|buf, mut sz| {
298-
match c::GetUserProfileDirectoryW(token, buf, &mut sz) {
299-
0 if c::GetLastError() != c::ERROR_INSUFFICIENT_BUFFER => 0,
300-
0 => sz,
301-
_ => sz - 1, // sz includes the null terminator
302-
}
303-
}, super::os2path).ok()
304298
})
305299
}
306300

0 commit comments

Comments
 (0)