what changes can i make??

EDN Admin

Well-known member
Joined
Aug 7, 2010
Messages
12,794
Location
In the Machine
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/??????????????????

View the full article
 
Back
Top