Skip to content

Commit

Permalink
Use a hardcoded constant instead of calling OpenProcessToken.
Browse files Browse the repository at this point in the history
Now that Win 7 support is dropped, we can resurrect rust-lang#90144.

GetCurrentProcessToken is defined in processthreadsapi.h as:

FORCEINLINE
HANDLE
GetCurrentProcessToken (
    VOID
    )
{
    return (HANDLE)(LONG_PTR) -4;
}

Since it's very unlikely that this constant will ever change, let's just use it instead of making calls to get the same information.
  • Loading branch information
smmalis37 authored Dec 17, 2023
1 parent 4451777 commit 1ffbd38
Showing 1 changed file with 8 additions and 14 deletions.
22 changes: 8 additions & 14 deletions library/std/src/sys/windows/os.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,22 +320,16 @@ pub fn temp_dir() -> PathBuf {

#[cfg(not(target_vendor = "uwp"))]
fn home_dir_crt() -> Option<PathBuf> {
unsafe {
// The magic constant -4 can be used as the token passed to GetUserProfileDirectoryW below
// instead of us having to go through these multiple steps to get a token. However this is
// not implemented on Windows 7, only Windows 8 and up. When we drop support for Windows 7
// we can simplify this code. See #90144 for details.
use crate::sys::handle::Handle;

let me = c::GetCurrentProcess();
let mut token = ptr::null_mut();
if c::OpenProcessToken(me, c::TOKEN_READ, &mut token) == 0 {
return None;
}
let _handle = Handle::from_raw_handle(token);
// Defined in processthreadsapi.h.
const CURRENT_PROCESS_TOKEN: usize = -4isize as usize;

super::fill_utf16_buf(
|buf, mut sz| {
match c::GetUserProfileDirectoryW(token, buf, &mut sz) {
match c::GetUserProfileDirectoryW(
ptr::from_exposed_addr_mut(CURRENT_PROCESS_TOKEN),
buf,
&mut sz,
) {
0 if api::get_last_error().code != c::ERROR_INSUFFICIENT_BUFFER => 0,
0 => sz,
_ => sz - 1, // sz includes the null terminator
Expand Down

0 comments on commit 1ffbd38

Please sign in to comment.