Skip to content

Commit b514557

Browse files
committed
std: win: Don't use GetUserProfileDirectoryW on UWP
1 parent 5466e9f commit b514557

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
@@ -147,7 +147,6 @@ pub const WSAECONNREFUSED: c_int = 10061;
147147

148148
pub const MAX_PROTOCOL_CHAIN: DWORD = 7;
149149

150-
pub const TOKEN_READ: DWORD = 0x20008;
151150
pub const MAXIMUM_REPARSE_DATA_BUFFER_SIZE: usize = 16 * 1024;
152151
pub const FSCTL_GET_REPARSE_POINT: DWORD = 0x900a8;
153152
pub const IO_REPARSE_TAG_SYMLINK: DWORD = 0xa000000c;
@@ -664,10 +663,19 @@ pub struct timeval {
664663
ifdef! {
665664
pub const HANDLE_FLAG_INHERIT: DWORD = 0x00000001;
666665

666+
pub const TOKEN_READ: DWORD = 0x20008;
667+
667668
extern "system" {
668669
#[link_name = "SystemFunction036"]
669670
pub fn RtlGenRandom(RandomBuffer: *mut u8, RandomBufferLength: ULONG) -> BOOLEAN;
670671

672+
// Allowed but unused by UWP
673+
pub fn OpenProcessToken(ProcessHandle: HANDLE,
674+
DesiredAccess: DWORD,
675+
TokenHandle: *mut HANDLE) -> BOOL;
676+
pub fn GetUserProfileDirectoryW(hToken: HANDLE,
677+
lpProfileDir: LPWSTR,
678+
lpcchSize: *mut DWORD) -> BOOL;
671679
pub fn SetHandleInformation(hObject: HANDLE,
672680
dwMask: DWORD,
673681
dwFlags: DWORD) -> BOOL;
@@ -754,9 +762,6 @@ extern "system" {
754762
pub fn GetCommandLineW() -> *mut LPCWSTR;
755763
pub fn GetTempPathW(nBufferLength: DWORD,
756764
lpBuffer: LPCWSTR) -> DWORD;
757-
pub fn OpenProcessToken(ProcessHandle: HANDLE,
758-
DesiredAccess: DWORD,
759-
TokenHandle: *mut HANDLE) -> BOOL;
760765
pub fn GetCurrentProcess() -> HANDLE;
761766
pub fn GetCurrentThread() -> HANDLE;
762767
pub fn GetStdHandle(which: DWORD) -> HANDLE;
@@ -781,9 +786,6 @@ extern "system" {
781786
pub fn SwitchToThread() -> BOOL;
782787
pub fn Sleep(dwMilliseconds: DWORD);
783788
pub fn GetProcessId(handle: HANDLE) -> DWORD;
784-
pub fn GetUserProfileDirectoryW(hToken: HANDLE,
785-
lpProfileDir: LPWSTR,
786-
lpcchSize: *mut DWORD) -> BOOL;
787789
pub fn CopyFileExW(lpExistingFileName: LPCWSTR,
788790
lpNewFileName: LPCWSTR,
789791
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)