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

  • Complex hybrid environments can make it difficult to track interdependencies, increasing the risk of disrupting critical business services. In this white paper by EMA, you'll learn how application discovery and dependency mapping can help you: Meet granular targets for availability, cost, and time-to-revenue for cloud services. Accelerate mean time to repair (MTTR) while communicating better with stakeholders. Manage even the most complex hybrid environments more efficiently and effectively Understand the …

  • Anthony Christie, the Chief Marketing Officer for Level Communications, is responsible for customer experience, worldwide marketing and product management. In this informative asset, he shares his insights into why a private network connection to cloud-bases applications is the right decision for your enterprise. Download now to find out more.

Most Popular Programming Stories

More for Developers

RSS Feeds

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