@@ -477,7 +477,7 @@ impl File {
477
477
fn reparse_point (
478
478
& self ,
479
479
space : & mut Align8 < [ MaybeUninit < u8 > ] > ,
480
- ) -> io:: Result < ( c:: DWORD , * const c:: REPARSE_DATA_BUFFER ) > {
480
+ ) -> io:: Result < ( c:: DWORD , * mut c:: REPARSE_DATA_BUFFER ) > {
481
481
unsafe {
482
482
let mut bytes = 0 ;
483
483
cvt ( {
@@ -496,7 +496,7 @@ impl File {
496
496
)
497
497
} ) ?;
498
498
const _: ( ) = assert ! ( core:: mem:: align_of:: <c:: REPARSE_DATA_BUFFER >( ) <= 8 ) ;
499
- Ok ( ( bytes, space. 0 . as_ptr ( ) . cast :: < c:: REPARSE_DATA_BUFFER > ( ) ) )
499
+ Ok ( ( bytes, space. 0 . as_mut_ptr ( ) . cast :: < c:: REPARSE_DATA_BUFFER > ( ) ) )
500
500
}
501
501
}
502
502
@@ -506,22 +506,22 @@ impl File {
506
506
unsafe {
507
507
let ( path_buffer, subst_off, subst_len, relative) = match ( * buf) . ReparseTag {
508
508
c:: IO_REPARSE_TAG_SYMLINK => {
509
- let info: * const c:: SYMBOLIC_LINK_REPARSE_BUFFER =
510
- ptr:: addr_of !( ( * buf) . rest) . cast ( ) ;
509
+ let info: * mut c:: SYMBOLIC_LINK_REPARSE_BUFFER =
510
+ ptr:: addr_of_mut !( ( * buf) . rest) . cast ( ) ;
511
511
assert ! ( info. is_aligned( ) ) ;
512
512
(
513
- ptr:: addr_of !( ( * info) . PathBuffer ) . cast :: < u16 > ( ) ,
513
+ ptr:: addr_of_mut !( ( * info) . PathBuffer ) . cast :: < u16 > ( ) ,
514
514
( * info) . SubstituteNameOffset / 2 ,
515
515
( * info) . SubstituteNameLength / 2 ,
516
516
( * info) . Flags & c:: SYMLINK_FLAG_RELATIVE != 0 ,
517
517
)
518
518
}
519
519
c:: IO_REPARSE_TAG_MOUNT_POINT => {
520
- let info: * const c:: MOUNT_POINT_REPARSE_BUFFER =
521
- ptr:: addr_of !( ( * buf) . rest) . cast ( ) ;
520
+ let info: * mut c:: MOUNT_POINT_REPARSE_BUFFER =
521
+ ptr:: addr_of_mut !( ( * buf) . rest) . cast ( ) ;
522
522
assert ! ( info. is_aligned( ) ) ;
523
523
(
524
- ptr:: addr_of !( ( * info) . PathBuffer ) . cast :: < u16 > ( ) ,
524
+ ptr:: addr_of_mut !( ( * info) . PathBuffer ) . cast :: < u16 > ( ) ,
525
525
( * info) . SubstituteNameOffset / 2 ,
526
526
( * info) . SubstituteNameLength / 2 ,
527
527
false ,
@@ -535,13 +535,18 @@ impl File {
535
535
}
536
536
} ;
537
537
let subst_ptr = path_buffer. add ( subst_off. into ( ) ) ;
538
- let mut subst = slice:: from_raw_parts ( subst_ptr, subst_len as usize ) ;
538
+ let subst = slice:: from_raw_parts_mut ( subst_ptr, subst_len as usize ) ;
539
539
// Absolute paths start with an NT internal namespace prefix `\??\`
540
540
// We should not let it leak through.
541
541
if !relative && subst. starts_with ( & [ 92u16 , 63u16 , 63u16 , 92u16 ] ) {
542
- subst = & subst[ 4 ..] ;
542
+ // Turn `\??\` into `\\?\` (a verbatim path).
543
+ subst[ 1 ] = b'\\' as u16 ;
544
+ // Attempt to convert to a more user-friendly path.
545
+ let user = super :: args:: to_user_path ( subst. iter ( ) . copied ( ) . chain ( [ 0 ] ) . collect ( ) ) ?;
546
+ Ok ( PathBuf :: from ( OsString :: from_wide ( & user) ) )
547
+ } else {
548
+ Ok ( PathBuf :: from ( OsString :: from_wide ( subst) ) )
543
549
}
544
- Ok ( PathBuf :: from ( OsString :: from_wide ( subst) ) )
545
550
}
546
551
}
547
552
0 commit comments