From 238ad07e13a85366bcf49a309e3735d26ff51ff2 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 26 Dec 2008 21:17:49 +0000 Subject: [PATCH] windows-pioctl-drive-subst-20081226 LICENSE MIT GetDriveType() will return "REMOTE" for drive letters that are mapped to network devices via the SUBST command. Recursively check drive letters for the final substitution before checking to see if the drive letter is in fact an AFS device. --- src/sys/pioctl_nt.c | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/sys/pioctl_nt.c b/src/sys/pioctl_nt.c index 0460e2615..4cd31ca6d 100644 --- a/src/sys/pioctl_nt.c +++ b/src/sys/pioctl_nt.c @@ -397,6 +397,45 @@ GetLSAPrincipalName(char * szUser, DWORD *dwSize) return success; } +// +// Recursively evaluate drivestr to find the final +// dos drive letter to which the source is mapped. +// +static BOOL +DriveSubstitution(char *drivestr, char *subststr) +{ + char device[MAX_PATH]; + + if ( QueryDosDevice(drivestr, device, MAX_PATH) ) + { + if ( device[0] == '\\' && + device[1] == '?' && + device[2] == '?' && + device[3] == '\\' && + isalpha(device[4]) && + device[5] == ':') + { + device[0] = device[4]; + device[1] = ':'; + device[2] = '\0'; + if ( DriveSubstitution(device, subststr) ) + { + return TRUE; + } else { + subststr[0] = device[0]; + subststr[1] = ':'; + subststr[2] = '\0'; + return TRUE; + } + } + } + + return FALSE; +} + +// +// drivestr - is ":" +// static BOOL DriveIsMappedToAFS(char *drivestr, char *NetbiosName) { @@ -407,6 +446,17 @@ DriveIsMappedToAFS(char *drivestr, char *NetbiosName) LPNETRESOURCE lpnrLocal; // pointer to enumerated structures DWORD i; BOOL bIsAFS = FALSE; + char subststr[3]; + + // + // Handle drive letter substitution created with "SUBST ". + // If a substitution has occurred, use the target drive letter instead + // of the source. + // + if ( DriveSubstitution(drivestr, subststr) ) + { + drivestr = subststr; + } // // Call the WNetOpenEnum function to begin the enumeration. -- 2.39.5