Skip to content

Commit a24be59

Browse files
committed
std: win: Don't use GetUserProfileDirectoryW on UWP
1 parent ef26728 commit a24be59

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

src/libstd/sys/windows/c.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ pub const WSAECONNREFUSED: c_int = 10061;
143143

144144
pub const MAX_PROTOCOL_CHAIN: DWORD = 7;
145145

146-
pub const TOKEN_READ: DWORD = 0x20008;
147146
pub const MAXIMUM_REPARSE_DATA_BUFFER_SIZE: usize = 16 * 1024;
148147
pub const FSCTL_GET_REPARSE_POINT: DWORD = 0x900a8;
149148
pub const IO_REPARSE_TAG_SYMLINK: DWORD = 0xa000000c;
@@ -660,10 +659,19 @@ cfg_if::cfg_if! {
660659
if #[cfg(not(target_vendor = "uwp"))] {
661660
pub const HANDLE_FLAG_INHERIT: DWORD = 0x00000001;
662661

662+
pub const TOKEN_READ: DWORD = 0x20008;
663+
663664
extern "system" {
664665
#[link_name = "SystemFunction036"]
665666
pub fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: ULONG) -> BOOLEAN;
666667

668+
// Allowed but unused by UWP
669+
pub fn OpenProcessToken(ProcessHandle: HANDLE,
670+
DesiredAccess: DWORD,
671+
TokenHandle: *mut HANDLE) -> BOOL;
672+
pub fn GetUserProfileDirectoryW(hToken: HANDLE,
673+
lpProfileDir: LPWSTR,
674+
lpcchSize: *mut DWORD) -> BOOL;
667675
pub fn SetHandleInformation(hObject: HANDLE,
668676
dwMask: DWORD,
669677
dwFlags: DWORD) -> BOOL;
@@ -752,9 +760,6 @@ extern "system" {
752760
pub fn GetCommandLineW() -> *mut LPCWSTR;
753761
pub fn GetTempPathW(nBufferLength: DWORD,
754762
lpBuffer: LPCWSTR) -> DWORD;
755-
pub fn OpenProcessToken(ProcessHandle: HANDLE,
756-
DesiredAccess: DWORD,
757-
TokenHandle: *mut HANDLE) -> BOOL;
758763
pub fn GetCurrentProcess() -> HANDLE;
759764
pub fn GetCurrentThread() -> HANDLE;
760765
pub fn GetStdHandle(which: DWORD) -> HANDLE;
@@ -779,9 +784,6 @@ extern "system" {
779784
pub fn SwitchToThread() -> BOOL;
780785
pub fn Sleep(dwMilliseconds: DWORD);
781786
pub fn GetProcessId(handle: HANDLE) -> DWORD;
782-
pub fn GetUserProfileDirectoryW(hToken: HANDLE,
783-
lpProfileDir: LPWSTR,
784-
lpcchSize: *mut DWORD) -> BOOL;
785787
pub fn CopyFileExW(lpExistingFileName: LPCWSTR,
786788
lpNewFileName: LPCWSTR,
787789
lpProgressRoutine: LPPROGRESS_ROUTINE,

src/libstd/sys/windows/os.rs

Lines changed: 17 additions & 6 deletions
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

@@ -284,10 +283,11 @@ pub fn temp_dir() -> PathBuf {
284283
}, super::os2path).unwrap()
285284
}
286285

287-
pub fn home_dir() -> Option<PathBuf> {
288-
crate::env::var_os("HOME").or_else(|| {
289-
crate::env::var_os("USERPROFILE")
290-
}).map(PathBuf::from).or_else(|| unsafe {
286+
#[cfg(not(target_vendor = "uwp"))]
287+
fn home_dir_crt() -> Option<PathBuf> {
288+
unsafe {
289+
use crate::sys::handle::Handle;
290+
291291
let me = c::GetCurrentProcess();
292292
let mut token = ptr::null_mut();
293293
if c::OpenProcessToken(me, c::TOKEN_READ, &mut token) == 0 {
@@ -301,7 +301,18 @@ pub fn home_dir() -> Option<PathBuf> {
301301
_ => sz - 1, // sz includes the null terminator
302302
}
303303
}, super::os2path).ok()
304-
})
304+
}
305+
}
306+
307+
#[cfg(target_vendor = "uwp")]
308+
fn home_dir_crt() -> Option<PathBuf> {
309+
None
310+
}
311+
312+
pub fn home_dir() -> Option<PathBuf> {
313+
crate::env::var_os("HOME").or_else(|| {
314+
crate::env::var_os("USERPROFILE")
315+
}).map(PathBuf::from).or_else(|| home_dir_crt())
305316
}
306317

307318
pub fn exit(code: i32) -> ! {

0 commit comments

Comments
 (0)