diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-12-14 20:23:27 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-12-14 20:23:27 +0000 |
commit | e74758408e50f8980de0d73f5b3721efbd698df9 (patch) | |
tree | 31a9ae8cce2a48dbf228c7e73a26b10387546ec8 /winsup/cygwin/fhandler_process.cc | |
parent | a5d1e69e3d9fc57a2829a0982b1e1352300d366d (diff) | |
download | cygnal-e74758408e50f8980de0d73f5b3721efbd698df9.tar.gz cygnal-e74758408e50f8980de0d73f5b3721efbd698df9.tar.bz2 cygnal-e74758408e50f8980de0d73f5b3721efbd698df9.zip |
Don't leave Windows 2000 behind.
* autoload.cc (GetSystemWow64DirectoryW): Define.
(GetVolumePathNamesForVolumeNameW): Define.
* fhandler_process.cc (get_volume_path_names_for_volume_name): New
static function to workaround missing GetVolumePathNamesForVolumeNameW
function in Windows 2000.
(dos_drive_mappings::dos_drive_mappings): Call
get_volume_path_names_for_volume_name instead of
GetVolumePathNamesForVolumeNameW.
Diffstat (limited to 'winsup/cygwin/fhandler_process.cc')
-rw-r--r-- | winsup/cygwin/fhandler_process.cc | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/winsup/cygwin/fhandler_process.cc b/winsup/cygwin/fhandler_process.cc index 0d269d19e..cefc8f4df 100644 --- a/winsup/cygwin/fhandler_process.cc +++ b/winsup/cygwin/fhandler_process.cc @@ -544,6 +544,41 @@ format_process_winexename (void *data, char *&destbuf) return len + 1; } +static bool +get_volume_path_names_for_volume_name (LPCWSTR vol, LPWSTR mounts) +{ + DWORD len; + if (GetVolumePathNamesForVolumeNameW (vol, mounts, NT_MAX_PATH, &len)) + return true; + + /* Windows 2000 doesn't have GetVolumePathNamesForVolumeNameW. + Just assume that mount points are not longer than MAX_PATH. */ + WCHAR drives[MAX_PATH], dvol[MAX_PATH], mp[MAX_PATH + 3]; + if (!GetLogicalDriveStringsW (MAX_PATH, drives)) + return false; + for (PWCHAR drive = drives; *drive; drive = wcschr (drive, '\0') + 1) + { + if (!GetVolumeNameForVolumeMountPointW (drive, dvol, MAX_PATH)) + continue; + if (!wcscasecmp (vol, dvol)) + mounts = wcpcpy (mounts, drive) + 1; + wcscpy (mp, drive); + HANDLE h = FindFirstVolumeMountPointW (dvol, mp + 3, MAX_PATH); + if (h == INVALID_HANDLE_VALUE) + continue; + do + { + if (GetVolumeNameForVolumeMountPointW (mp, dvol, MAX_PATH)) + if (!wcscasecmp (vol, dvol)) + mounts = wcpcpy (mounts, drive) + 1; + } + while (FindNextVolumeMountPointW (h, mp, MAX_PATH)); + FindVolumeMountPointClose (h); + } + *mounts = L'\0'; + return true; +} + struct dos_drive_mappings { struct mapping @@ -573,9 +608,8 @@ struct dos_drive_mappings else do { - DWORD len; /* Skip drives which are not mounted. */ - if (!GetVolumePathNamesForVolumeNameW (vol, mounts, NT_MAX_PATH, &len) + if (!get_volume_path_names_for_volume_name (vol, mounts) || mounts[0] == L'\0') continue; *wcsrchr (vol, L'\\') = L'\0'; |