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.
This commit is contained in:
Corinna Vinschen 2011-12-14 20:23:27 +00:00
parent a5d1e69e3d
commit e74758408e
3 changed files with 49 additions and 2 deletions

View File

@ -1,3 +1,14 @@
2011-12-14 Corinna Vinschen <vinschen@redhat.com>
* 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.
2011-12-13 Christopher Faylor <me.cygwin2011@cgf.cx> 2011-12-13 Christopher Faylor <me.cygwin2011@cgf.cx>
* dcrt0.cc (init_windows_system_directory): Record * dcrt0.cc (init_windows_system_directory): Record

View File

@ -392,6 +392,8 @@ LoadDLLfunc (GetUdpTable, 12, iphlpapi)
LoadDLLfuncEx (AttachConsole, 4, kernel32, 1) LoadDLLfuncEx (AttachConsole, 4, kernel32, 1)
LoadDLLfuncEx (GetModuleHandleExW, 12, kernel32, 1) LoadDLLfuncEx (GetModuleHandleExW, 12, kernel32, 1)
LoadDLLfuncEx (GetNamedPipeClientProcessId, 8, kernel32, 1) LoadDLLfuncEx (GetNamedPipeClientProcessId, 8, kernel32, 1)
LoadDLLfuncEx (GetSystemWow64DirectoryW, 8, kernel32, 1)
LoadDLLfuncEx (GetVolumePathNamesForVolumeNameW, 16, kernel32, 1)
LoadDLLfunc (LocaleNameToLCID, 8, kernel32) LoadDLLfunc (LocaleNameToLCID, 8, kernel32)
LoadDLLfunc (WNetCloseEnum, 4, mpr) LoadDLLfunc (WNetCloseEnum, 4, mpr)

View File

@ -544,6 +544,41 @@ format_process_winexename (void *data, char *&destbuf)
return len + 1; 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 dos_drive_mappings
{ {
struct mapping struct mapping
@ -573,9 +608,8 @@ struct dos_drive_mappings
else else
do do
{ {
DWORD len;
/* Skip drives which are not mounted. */ /* 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') || mounts[0] == L'\0')
continue; continue;
*wcsrchr (vol, L'\\') = L'\0'; *wcsrchr (vol, L'\\') = L'\0';