locked
what changes can i make?? RRS feed

  • Question

  • hi all,
    i am placing here a piece of code which was a function used to retrieve the drive letter of a USB from the corresponding device ID.

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    BOOL GetSpecificDrive(LPTSTR  lpDevID, TCHAR* DrvName)
    {
        DebugLog("entered GetSpecificDrive");

        HDEVINFO        hVolInfo;
        GUID            guid;
        BYTE            buffer[BUFFER_SIZE];
        DWORD           dwRequiredSize ;
        TCHAR           buf[BUFFER_SIZE],buf1[BUFFER_SIZE];
        DEVINST         devInstParent;
        DWORD           dwIndex;
        TCHAR           volume[BUFFER_SIZE];
        int             nLength;
        DWORD            size;
        ULONG           Status,Problem;

        SP_DEVINFO_LIST_DETAIL_DATA    devInfoListDetail;
        SP_DEVICE_INTERFACE_DATA       devInterfaceData;
        SP_DEVINFO_DATA                   devInfoData,devInfo;
        PSP_DEVICE_INTERFACE_DETAIL_DATA   pDevDetail;
        TCHAR TargetPath[BUFFER_SIZE]= {0};



        if(!lpDevID)
        {
            DebugLog("!lpDevId");       
            return 0;
        }

        // GUID_DEVINTERFACE_VOLUME is interface Guid for Volume class devices.
        guid = GUID_DEVINTERFACE_VOLUME;

        // Get device Information handle for Volume interface
        hVolInfo = SetupDiGetClassDevs(&guid, NULL, NULL,
            DIGCF_DEVICEINTERFACE |
            DIGCF_PRESENT);


        if(hVolInfo == INVALID_HANDLE_VALUE)
        {
            DebugLog("hVolInfo == INVALID_HANDLE_VALUE");
            return 0;
        }

        // Loop until device interfaces are found.
        for(dwIndex = 0; ;dwIndex ++)
        {  
            ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
            devInterfaceData.cbSize = sizeof(devInterfaceData);

            // Get device Interface data.

            char errorCondition[100] = {0};
            if(!SetupDiEnumDeviceInterfaces(hVolInfo, NULL, &guid,dwIndex,&devInterfaceData))
            {
                sprintf(errorCondition,"error code returned : %d ",GetLastError());
                DebugLog("!SetupDiEnumDeviceInterfaces");
                DebugLog(errorCondition);
                break;
            }

            ZeroMemory(&devInfoData, sizeof(devInfoData));
            devInfoData.cbSize = sizeof(devInfoData);

            pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
            pDevDetail->cbSize  = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

            // Get device interface detail data to get
            //      Device Instance from SP_DEVINFO_DATA and
            //  Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA


            if(!SetupDiGetDeviceInterfaceDetail(hVolInfo,
                &devInterfaceData,
                pDevDetail,                     // SP_DEVICE_INTERFACE_DETAIL_DATA
                BUFFER_SIZE,
                &dwRequiredSize,
                &devInfoData))                    // SP_DEVINFO_DATA
            {
                char errcndn[100] = {0};
                sprintf(errcndn,"error code returned : %d",GetLastError());
                DebugLog(errcndn);
                DebugLog("!SetupDiGetDeviceInterfaceDetail");
                break;
            }

           
            // Get the device instance of parent. This points to USBSTOR.
            DebugLog("CM_Get_Parent call");
            if(CM_Get_Parent(&devInstParent,devInfo.DevInst, 0) != CR_SUCCESS)
            {
                DebugLog("CM_Get_Parent failed");
            }
           
            // Get the device instance of grand parent. This points to USB root.
            DebugLog("CM_Get_Parent 2 call");
            if(CM_Get_Parent(&devInstParent,devInstParent, 0) != CR_SUCCESS)
            {
                DebugLog("CM_Get_Parent 2 failed");
            }
            // Get the device ID of the USB root.
            DebugLog("CM_Get_Device_ID call");
            if(CM_Get_Device_ID(devInstParent, buf,BUFFER_SIZE,0) != CR_SUCCESS)
            {
                DebugLog("Cm_Get_Device_ID failed");
            }

            DebugLog("Buf value grandparent :::::::::::::::::");
            DebugLog(buf);
           
            DebugLog(lpDevID);


            if( buf1 != NULL && _tcscmp(lpDevID,buf1) == 0)
            { 
                // Append \ to the DevicePath of SP_DEVICE_INTERFACE_DETAIL_DATA
                nLength =  (int)strlen(pDevDetail->DevicePath);
                pDevDetail->DevicePath[nLength]              = '\\';
                pDevDetail->DevicePath[nLength+1]    = 0;

                char dev[260] = {0};
                sprintf(dev,"%s",pDevDetail->DevicePath);
                DebugLog(pDevDetail->DevicePath);
                DebugLog(dev);

                // Get Volume mount point for the device path.
                char errorReport[50] = {0};
                if(GetVolumeNameForVolumeMountPoint(pDevDetail->DevicePath,volume,BUFFER_SIZE))
                {
                    if(GetVolumePathNamesForVolumeName(volume,TargetPath,BUFFER_SIZE,&size))
                    {
                        _stprintf(DrvName,"%s", TargetPath);
                        DebugLog(DrvName);
                        DebugLog("entered GetSpecificDrive 1");
                        return 1;
                    }
                    else
                    {   
                        DebugLog("Error");
                        DebugLog("exiting GetSpecificDrive 0");
                        return 0;
                    }
                }
                else
                {
                    sprintf(errorReport,"Error Code returned is %d",GetLastError());
                    DebugLog("!GetVolumeNameForVolumeMountPoint");
                    DebugLog(errorReport);
                }
            }
        }

        SetupDiDestroyDeviceInfoList(hVolInfo);
        DebugLog("exiting GetSpecificDrive");
        return 0;

    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    this code is works fine when it is used in development for win-xp.
    windows vista has got some other thigs to go. this code doesnt work.. the functions cm_get_parent encounters an error in retrieving the grandparent device id . as i looked upon i found that in vista there is  no parent child concept and in vista USB devices are no longer handled as removable device instead they are handled as fixed drives.

    i am stuck up here in this part of my code as without getting the drive letter, i cant proceed further.
    what changes can i make or is there any other code which can replace the above code for getting the same functionality/??????????????????
    • Moved by jack 321 Thursday, October 23, 2008 7:36 AM general issue (Moved from Visual C++ Language to Visual C++ General)
    Tuesday, October 21, 2008 6:10 AM

Answers

  • The device's manufacture decided to have two drivers for two operating systems. One register as removable and one register as fixed, for whatever reason. 
    If you need to identify the device in a unified way, contact the manufacture's tech support. 
    Also, your topic is too general and does not seem to relate to the topic of this forum, the C++ language.

    MSMVP VC++
    • Edited by Sheng Jiang 蒋晟 Wednesday, October 22, 2008 7:03 PM off-topic
    • Marked as answer by jack 321 Friday, October 24, 2008 2:58 AM
    Wednesday, October 22, 2008 6:29 PM

All replies

  • The device's manufacture decided to have two drivers for two operating systems. One register as removable and one register as fixed, for whatever reason. 
    If you need to identify the device in a unified way, contact the manufacture's tech support. 
    Also, your topic is too general and does not seem to relate to the topic of this forum, the C++ language.

    MSMVP VC++
    • Edited by Sheng Jiang 蒋晟 Wednesday, October 22, 2008 7:03 PM off-topic
    • Marked as answer by jack 321 Friday, October 24, 2008 2:58 AM
    Wednesday, October 22, 2008 6:29 PM
  • Hello sgcoders,

    I don't know if you have found a solution about your problem.  But 4 years after, i have the same.. I need the same function than GetSpecificDrive, but for Windows Seven..

    Please, if you're still on this forum, answer me :) !!


    Ce que je vous demande, c'est d'ouvrir votre esprit, non de croire.

    Monday, February 27, 2012 10:24 AM