EDN Admin
Well-known member
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
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