GetDriveType Enhancement


Download Source Code and Example

This subroutine handles GetDeviceType when you have an arbitrary path. There are three problems with the GetDeviceType API: (1) if you have a path which contains a file name, it returns the error code DRIVE_NO_ROOT_DIR; (2) it works differently on Windows NT and Windows 95; (3) if you pass it a string that contains a name like “\\.\d\” it does not recognize the local drive. This code fixes these problems. It strips back the name until it has either a drive letter (C:, for example), or a network path name (\\ prefix). It discards any file name portion. It also handles paths that do not contain a drive or UNC name. The program knows how to compensate for the fact that Windows 95 and Windows NT _splitpath parse differently.

GetDriveType(“C:”) returns DRIVE_FIXED on NT 4.0 and DRIVE_NO_ROOT_DIR on Win95.

GetDriveType(“C:\”) returns DRIVE_FIXED on both systems.

The sample application, the GetDriveType Explorer, allows you to test this subroutine by typing in a test string. As each character is typed, you see the result of calling GetDriveType with the current string, the result of a _splitpath operation on the path, and the “cooked” result of applying getDriveType (note the initial lowercase letter).

For concisesness, the comments have been removed from the version below. They appear in the full source in the download.

UINT getDriveType(LPCTSTR fullpath)
TCHAR filename[_MAX_PATH];

_splitpath(fullpath, drv, path, filename, ext);
if(lstrlen(drv) != 0)
{ /* drv */
lstrcat(drv, _T(“\\”));
return GetDriveType(drv);
} /* drv */
{ /* what else? */
if(path[0] != _T(‘\\’) ||
(lstrlen(path) > 2 && path[0] == _T(‘\\’) &&
path[1] != _T(‘\\’)))
return GetDriveType(NULL);

UINT result = GetDriveType(path);
if(result == DRIVE_NO_ROOT_DIR &&
lstrlen(path) >= 4 && path[0] == _T(‘\\’) && path[1] == _T(‘\\’)
&& path[2] == _T(‘.’) && path[3] == _T(‘\\’))
{ /* \\. */
if(lstrlen(path) == 4)
lstrcat(path, filename);
LPTSTR p = &path[4];
LPTSTR b = strchr(p, _T(‘\\’));
if(b != NULL)
{ /* logical drive */
*b++ = _T(‘:’);
*b++ = _T(‘\\’);
*b = _T(‘\0’);
} /* logical drive */
lstrcat(p, _T(“:\\”));

return GetDriveType(p);
} /* \\. */

if(lstrlen(path) < 2 || path[0] != _T(‘\\’) || path[1] != _T(‘\\’))
return result;

return GetDriveType(path);
} /* what else? */


Last updated: 28 July 1998

More by Author

Must Read