GetDriveType Enhancement | CodeGuru

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 […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 6, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

 

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 drv[_MAX_PATH];
     TCHAR path[_MAX_PATH];
     TCHAR filename[_MAX_PATH];
     TCHAR ext[_MAX_PATH];

_splitpath(fullpath, drv, path, filename, ext);
if(lstrlen(drv) != 0)
{ /* drv */
lstrcat(drv, _T(“\\”));
return GetDriveType(drv);
} /* drv */
else
{ /* 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 */
else
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

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.