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 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 */
        { /* 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


  • Thank you!!

    Posted by Legacy on 09/03/2002 12:00am

    Originally posted by: Marina Vaillant

    This article was exactly what I looked for after I saw the bug report in MSDN.
    You solve my problem, I added your method in my project and it reacts as expected.

    Thank you!

  • Bugs report

    Posted by Legacy on 07/24/2002 12:00am

    Originally posted by: lsnail

    There is some clerical error in GetDriveTypeExplorerDlg.cpp

    CString driveTypeToString(UINT type)
    CString s;
    { /* decode */
    case DRIVE_REMOTE:
    case IDS_DRIVE_CDROM: // <-- here
    case IDS_DRIVE_RAMDISK: // <-- here
    } /* decode */
    return s;

    The leading "IDS_" in the marked line must be removed as below:
    case DRIVE_CDROM: // <-- here
    case DRIVE_RAMDISK: // <-- here

  • Help to Create a System

    Posted by Legacy on 11/07/2000 12:00am

    Originally posted by: abraham

    i need some tool machinery to create a system and i wont to now how much it going to cost and where can i get this and can you tell me what the tool names are thank you.

  • Problem with CDROM using WinNT

    Posted by Legacy on 11/11/1999 12:00am

    Originally posted by: Peter Klimo

    This solution don't work with CD-ROM under WinNT !

Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Lenovo recommends Windows 8 Pro. "I dropped my laptop getting out of the taxi." This probably sounds familiar to most IT professionals. If your employees are traveling, you know their devices are in for a rough go. Whether it's a trip to the conference room or a convention out of town, any time equipment leaves a user's desk it is at risk of being put into harm's way. Stay connected at all times, whether at the office or on the go, with agile, durable, and flexible devices like the Lenovo® …

  • On-demand Event Event Date: September 23, 2015 The cloud is not just about a runtime platform for your projects – now, you can do your development in the cloud, too. Check out this webcast to learn how the cloud improves your development experience and team collaboration. Join Dana Singleterry, Principal Product Manager for Oracle Dev Tools, as he discusses how to simplify every aspect of the development lifecycle, including requirements gathering, version management, code reviews, build automation, and …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date