@@ -1124,7 +1124,40 @@ pub(super) mod _os {
11241124 #[ pyfunction]
11251125 fn chdir ( path : OsPath , vm : & VirtualMachine ) -> PyResult < ( ) > {
11261126 env:: set_current_dir ( & path. path )
1127- . map_err ( |err| OSErrorBuilder :: with_filename ( & err, path, vm) )
1127+ . map_err ( |err| OSErrorBuilder :: with_filename ( & err, path, vm) ) ?;
1128+
1129+ #[ cfg( windows) ]
1130+ {
1131+ // win32_wchdir()
1132+
1133+ // On Windows, set the per-drive CWD environment variable (=X:)
1134+ // This is required for GetFullPathNameW to work correctly with drive-relative paths
1135+
1136+ use std:: os:: windows:: ffi:: OsStrExt ;
1137+ use windows_sys:: Win32 :: System :: Environment :: SetEnvironmentVariableW ;
1138+
1139+ if let Ok ( cwd) = env:: current_dir ( ) {
1140+ let cwd_str = cwd. as_os_str ( ) ;
1141+ let mut cwd_wide: Vec < u16 > = cwd_str. encode_wide ( ) . collect ( ) ;
1142+
1143+ // Check for UNC-like paths (\\server\share or //server/share)
1144+ // wcsncmp(new_path, L"\\\\", 2) == 0 || wcsncmp(new_path, L"//", 2) == 0
1145+ let is_unc_like_path = cwd_wide. len ( ) >= 2
1146+ && ( ( cwd_wide[ 0 ] == b'\\' as u16 && cwd_wide[ 1 ] == b'\\' as u16 )
1147+ || ( cwd_wide[ 0 ] == b'/' as u16 && cwd_wide[ 1 ] == b'/' as u16 ) ) ;
1148+
1149+ if !is_unc_like_path {
1150+ // Create env var name "=X:" where X is the drive letter
1151+ let env_name: [ u16 ; 4 ] = [ b'=' as u16 , cwd_wide[ 0 ] , b':' as u16 , 0 ] ;
1152+ cwd_wide. push ( 0 ) ; // null-terminate the path
1153+ unsafe {
1154+ SetEnvironmentVariableW ( env_name. as_ptr ( ) , cwd_wide. as_ptr ( ) ) ;
1155+ }
1156+ }
1157+ }
1158+ }
1159+
1160+ Ok ( ( ) )
11281161 }
11291162
11301163 #[ pyfunction]
0 commit comments