How to match between physical usb device and its drive letter?
struct tagDrives
{
WCHAR letter;
WCHAR volume[ BUFFER_SIZE ];
} g_drives[ ]; //
WCHAR GetUSBDrive( )
{
LPTSTR lpDevID;
WCHAR cDrive;
DWORD dwSize = BUFFER_SIZE; // Get all removable disks on user laptop.
if ( !GetAllRemovableDisks( ) )
{
WRITELOG( "Error - GetAllRemovableDisks failed\n" );
return ;
} // Alocate memory to device ID
lpDevID = (LPTSTR) AllocMem( BUFFER_SIZE ); // Get device ID corresponding to USBFM from registry.
if ( !GetRegValue( lpDevID, DEVICE_ID, dwSize ) )
{
WRITELOG( "Error - Registry - USBFMDevID failed\n" );
FreeMem( lpDevID );
return ;
} // Get drive corresponding to the registry entry.
cDrive = GetSpecificDrive( lpDevID ); FreeMem( lpDevID ); // return the drive letter.
return cDrive;
} /******************************************************************************
* GetAllRemovableDisks - This function retrieves volume information for all
removable disks
*
* In: None
*
* Out: TRUE - Success
* FALSE - Failure
*
*******************************************************************************/ BOOL GetAllRemovableDisks( )
{
WCHAR caDrive[ ];
WCHAR volume[ BUFFER_SIZE ];
int nLoopIndex;
DWORD dwDriveMask; caDrive[ ] = 'A';
caDrive[ ] = ':';
caDrive[ ] = '\\';
caDrive[ ] = ; g_count = ; // Get all drives in the system.
dwDriveMask = GetLogicalDrives( ); if ( dwDriveMask == )
{
WRITELOG( "Error - GetLogicalDrives failed\n" );
return FALSE;
} // Loop for all drives (MAX_DRIVES = 26) for ( nLoopIndex = ; nLoopIndex < MAX_DRIVES; nLoopIndex++ )
{
// if a drive is present,
if ( dwDriveMask & )
{
caDrive[ ] = 'A' + nLoopIndex; // If a drive is removable
if ( GetDriveType( caDrive ) == DRIVE_REMOVABLE )
{
//Get its volume info and store it in the global variable.
if ( GetVolumeNameForVolumeMountPoint( caDrive, volume, BUFFER_SIZE ) )
{
g_drives[ g_count ].letter = caDrive[ ];
wcscpy( g_drives[ g_count ].volume, volume );
g_count++;
} }
}
dwDriveMask >>= ;
} // success if atleast one removable drive is found.
if ( g_count == )
{
return FALSE;
}
else
{
return TRUE;
}
} /******************************************************************************
* GetSpecificDrive - This function returns the drive corresponding to the
given device ID
*
* In : lpDevID - Device ID
*
* Return: Drive letter corresponding to the given device ID.
*
*******************************************************************************/ WCHAR GetSpecificDrive( LPTSTR lpDevID )
{
HDEVINFO hDevInfo;
GUID guid;
BYTE buffer[ BUFFER_SIZE ];
DWORD dwRequiredSize;
WCHAR buf[ BUFFER_SIZE ];
DEVINST devInstParent;
DWORD dwIndex;
WCHAR volume[ BUFFER_SIZE ];
int nLength, nLoopIndex; SP_DEVICE_INTERFACE_DATA devInterfaceData;
SP_DEVINFO_DATA devInfoData;
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail; if ( !lpDevID )
{
return ;
} // GUID_DEVINTERFACE_VOLUME is interface Guid for Volume class devices.
guid = GUID_DEVINTERFACE_VOLUME; // Get device Information handle for Volume interface
hDevInfo = SetupDiGetClassDevs( &guid, NULL, NULL,
DIGCF_DEVICEINTERFACE | DIGCF_PRESENT ); if ( hDevInfo == INVALID_HANDLE_VALUE )
{
WRITELOG( "Error - SetupDiGetClassDevs failed\n" );
return ;
} // Loop until device interfaces are found.
for ( dwIndex = ;; dwIndex++ )
{
ZeroMemory( &devInterfaceData, sizeof( devInterfaceData ) );
devInterfaceData.cbSize = sizeof( devInterfaceData ); // Get device Interface data. if ( !SetupDiEnumDeviceInterfaces( hDevInfo, NULL, &guid, dwIndex,
&devInterfaceData ) )
{
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 SetupDiGetDeviceInterfaceDetail( hDevInfo, &devInterfaceData, pDevDetail, // SP_DEVICE_INTERFACE_DETAIL_DATA
BUFFER_SIZE, &dwRequiredSize, &devInfoData ); // SP_DEVINFO_DATA // Get the device instance of parent. This points to USBSTOR.
CM_Get_Parent( &devInstParent, devInfoData.DevInst, ); // Get the device instance of grand parent. This points to USB root.
CM_Get_Parent( &devInstParent, devInstParent, ); // Get the device ID of the USB root.
CM_Get_Device_ID( devInstParent, buf, BUFFER_SIZE, ); // If USB root device matches with the input device ID, it is the target device. if ( buf != NULL && wcscmp( lpDevID, buf ) == )
{
// Append \ to the DevicePath of SP_DEVICE_INTERFACE_DETAIL_DATA nLength = wcslen( pDevDetail->DevicePath );
pDevDetail->DevicePath[ nLength ] = '\\';
pDevDetail->DevicePath[ nLength + ] = ; // Get Volume mount point for the device path.
if ( GetVolumeNameForVolumeMountPoint( pDevDetail->DevicePath, volume,
BUFFER_SIZE ) )
{
for ( nLoopIndex = ; nLoopIndex < g_count; nLoopIndex++ )
{
// Compare volume mount point with the one stored earlier.
// If both match, return the corresponding drive letter. if ( wcscmp( g_drives[ nLoopIndex ].volume, volume ) == )
{
SetupDiDestroyDeviceInfoList( hDevInfo );
return g_drives[ nLoopIndex ].letter;
}
}
}
}
} SetupDiDestroyDeviceInfoList( hDevInfo );
WRITELOG( "Error - No drives found in GetSpecificDrives\n" );
return ;
}
http://www.lvr.com/files/find_drive_letter.txt
(From Marc Reinig) Look at the code that Devcon.exe (from the DDK) uses in
Devcon.exe find =diskdrive
This will give you the instance ID of the disks present on the system, in
order of their disk number. 0, 1, 2, 3, … . So now you know what the disk
number is for your device.
Then, using the code below, loop through all possible 26 logical drives,
using strings that look like “C:” for szDriveLetter. When you get an
sdnDevNumber.DeviceNumber that matches the disk number you are looking
for, you have found your drive letter, szDriveLetter:
char szDriveLetter[ ];
char * pszDrive;
STORAGE_DEVICE_NUMBER sdnDevNumber;
BOOL fResult; fResult = GetBasicDiskDriveMapping( szDriveLetter, &sdnDevNumber ); // sdnDevNumber.DeviceNumber will contain the drive number you want
// sdnDevNumber.PartitionNumber will contain the partition for your reference BOOL GetBasicDiskDriveMapping( LPCSTR pszDrive, STORAGE_DEVICE_NUMBER *psdn ) { BOOL fResult;
char szDriveName[ ];
HANDLE hDrive;
DWORD dwBytesReturned; __try
{
lstrcpy( szDriveName, "\\\\.\\" ); lstrcat( szDriveName, pszDrive ); // Open the volume to which the drive letter refers and get
// the physical drive on which the volume resides. hDrive = CreateFile( szDriveName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, , OPEN_EXISTING, , ); if ( INVALID_HANDLE_VALUE != hDrive ) fResult = DeviceIoControl( hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, , , psdn, sizeof(STORAGE_DEVICE_NUMBER), &dwBytesReturned, ); else fResult = false;
} __except( EXCEPTION_EXECUTE_HANDLER ) {
// if we get here, one of the arguments probably
// points to not enough memory. SetLastError( ERROR_INVALID_PARAMETER ); fResult = false;
} CloseHandle( hDrive ); return ( fResult );
}
How To get the usbdisk's drive letter properly
http://www.codeproject.com/Articles/6559/How-To-get-the-usbdisk-s-drive-letter-properly
Introduction
We know USB disk should be a removable disk just like floppy disk, and be used more and more widely now.
Because, the USB disk is more faster, reliable, and affordable than old floppy disk.
So, when we want to check one disk or drive of target system is removable or not,
we may be thinking of using API function "GetDriveType()".
Yes, it really works on some USB device, such as 16MB, 32MB, 64MB, and 128MB. ;-)
Here, how aboutremovable hard disk which is connected to system by USB channel? -
Windows will report them as 'Fix Disk', and we would get the same result using 'GetDriveType()' function.
How can we differentiate between these USB ‘Fix Disk’ and Those IDE ‘Fix Disk’?
Here is the solution for this event.
Background
(Why do I want get the USB disks' drive letter properly?
Because I want to check the virus while one new USB drive is inserted.
We should not be remiss of the virus which is more and more technical day by day:)
Since we can get the base information about the disk type
(using API Function ‘GetDriveType()’),
we may only want to check the ‘Removable Hard Disk’ to verify its bus-type.
Well, we’ll have two steps to get the USB disk’s drive letters:
Code Thoughts
switch ( GetDriveType( szDrvName ) )
{
case : // The drive type cannot be determined.
case :// The root directory does not exist.
drivetype = DRVUNKNOWN;
break;
case DRIVE_REMOVABLE:// The drive can be removed from the drive.
drivetype = DRVREMOVE;
break;
case DRIVE_CDROM:// The drive is a CD-ROM drive.
break;
case DRIVE_FIXED:// The disk cannot be removed from the drive.
drivetype = DRVFIXED;
break;
case DRIVE_REMOTE:// The drive is a remote (network) drive.
drivetype = DRVREMOTE;
break;
case DRIVE_RAMDISK:// The drive is a RAM disk.
drivetype = DRVRAM;
break;
}
These codes above are based on ‘Article ID: Q161300 HOWTO:
Determine the Type of Drive Using Win32’ from MSDN.
2. Determinate the bus type of the ‘Fix Disk’:
Now, we may embed our codes at the ‘case = DRIVE_FIXED’:
Open the drive which we get now:
hDevice = CreateFile(szBuf,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, NULL, NULL);
If we opened this drive, check its BUSTYPE, using API GetDisksProperty():
if(GetDisksProperty(hDevice, pDevDesc))
{
if(pDevDesc->BusType == BusTypeUsb) // This is the ‘Check Point’!!! ;-)
{
// We store the drive letter here
szMoveDiskName[k] = chFirstDriveFromMask(temp);
szMoveDiskName[]=k;
k++;
}
}
Close this drive when we finished our work on it:
CloseHandle(hDevice);
3. How does the GetDisksProperty() work?
/********************************************************
*
* FUNCTION: GetDisksProperty(HANDLE hDevice,
* PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
*
* PURPOSE: get the info of specified device
*
******************************************************/
BOOL GetDisksProperty(HANDLE hDevice,
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
STORAGE_PROPERTY_QUERY Query; // input param for query
DWORD dwOutBytes; // IOCTL output length
BOOL bResult; // IOCTL return val // specify the query type
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery; // Query using IOCTL_STORAGE_QUERY_PROPERTY
bResult = ::DeviceIoControl(hDevice, // device handle
IOCTL_STORAGE_QUERY_PROPERTY, // info of device property
&Query, sizeof(STORAGE_PROPERTY_QUERY), // input data buffer
pDevDesc, pDevDesc->Size, // output data buffer
&dwOutBytes, // out's length
(LPOVERLAPPED)NULL); return bResult;
}
Comments
- There are some structures not commented, see usbdisks_src for them.;
- Floppy drive (A: or B:) is reported as USB Disks by this demo, -And-
it is easy to correct this, just putting some codes to the ‘case = DRIVE_REMOVABLE:‘;
History
- 2004-03-29 - 1st GO
License
This article, along with any associated source code and files,
is licensed underThe Code Project Open License (CPOL)
How to match between physical usb device and its drive letter?的更多相关文章
- What is a Windows USB device path and how is it formatted?
http://community.silabs.com/t5/Interface-Knowledge-Base/Windows-USB-Device-Path/ta-p/114059 Windows ...
- Install Slax on USB device (Slax U 盘安装)
Slax is a modern, portable, small and fast Linux operating system with a modular approach and outsta ...
- USB Device Finder
http://www.velleman.eu/images/tmp/usbfind.c #ifdef __cplusplus extern "C" { #endif #includ ...
- Assigning Host USB device to a Guest VM
Example Assigning Host USB device to a Guest VM This example is based on qemu-kvm (0.15.0) as instal ...
- usb host和usb device
S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb devic ...
- "The connection for the USB device '###' was unsuccessful. The device is currently in use"
一.问题描述 1.情景描述 笔者的物理主机系统是“windows7 64位”,想使用“摄像头录像大师”.这个软件在录制视频的过程中,需要调用windows自带的"windows media ...
- USB device & USB controller & USB passthrough
目录 USB device USB controller Linux 相关命令 Python 相关库 Libvirt USB passthrough 参考资料 近期往 openstack 里倒腾 US ...
- usb device address error 110
ubuntu失灵了,怎么都起不来,报一堆错误usb device descriptor read/64, error 110......重启,换kvm的接口,usb键盘鼠标...终于在试了下面这个方法 ...
- STM32F4 HAL Composite USB Device Example : CDC + MSC
STM32F4 USB Composite CDC + MSC I'm in the process of building a USB composite CDC + MSC device on t ...
随机推荐
- 【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...
- thinkphp模版常量替换机制
- webpack性能优化-实战
题外话:年初项目重构上线,项目技术栈使用vue+webpack,测试执行整个打包流程需要10分钟,同时又因涉及三个渠道,部署好环境就需半个小时,这严重延误了上线进度,因此提高webpack构建效率,成 ...
- Linux命令之cp命令
cp命令:用来将一个或多个源文件或者目录复制到指定的目的文件或目录.它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下.cp命令还支持同时复制多个文件,当一次复制多个文件时,目标 ...
- Python decorator装饰器
问题: 定义了一个新函数 想在运行时动态增加功能 又不想改动函数本身的代码 通过高阶段函数返回一个新函数 def f1(x): return x*2 def new_fn(f): #装饰器函数 def ...
- Tetris:pygame实现
网上搜到一个Pygame写的俄罗斯方块(tetris),大部分看懂的前提下增加了注释,Fedora19下运行OK的 主程序: #coding:utf8 #! /usr/bin/env python # ...
- chmod g+s 、chmod o+t 、chmod u+s:Linux高级权限管理
关于linux下权限操作chmod的一些说明!比rxw高级内容! 转载自http://blog.chinaunix.net/uid-26642180-id-3378119.html Set uid, ...
- C语言:奇偶归一猜想
1.奇偶归一猜想——求多少步归一.(10分) 题目内容: 奇偶归一猜想——对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1. 如n = 11,得 ...
- django Form 表单 总结与小实例
开头寄语: 这几天一直在看Django的form表单验证,然后想对于这几天要有个总结. 首先,先来看一下找到的一个form表单验证的流程: 验证过程 流程详解1. 函数full_clean()依次调用 ...
- js判断某年某月有多少天
function getCountDays(ym) { var curDate = new Date(ym); /* 获取当前月份 */ var curMonth = curDate.getMonth ...