void GETUsbList ( )
{
HANDLE hDevice;
BOOL result;
DWORD readed;
STORAGE_DESCRIPTOR_HEADER * pDevDescHeader;
STORAGE_DEVICE_DESCRIPTOR * pDevDesc;
DWORD devDescLength;
STORAGE_PROPERTY_QUERY query;
std:: wstring wsSrcPath;
for ( wchar_t d = 'A' ; d <= 'Z' ; d++ )
{
TCHAR szTemp[ 2 ] = { d , ':' } ;
wsSrcPath = TChar2ws ( szTemp) ;
if ( wsSrcPath. empty ( ) )
{
return ;
}
wsSrcPath = wsSrcPath. substr ( 0 , wsSrcPath. find ( L":" ) ) ;
std:: map< std:: wstring, std:: wstring> :: iterator iter = mUsbNameList. find ( wsSrcPath) ;
if ( iter != mUsbNameList. end ( ) )
{
return ;
}
wsSrcPath = wsSrcPath. substr ( 0 , wsSrcPath. find ( L":\\" ) ) ;
std:: wstring szPath = wsformat ( L"\\\\.\\%s:" , wsSrcPath. c_str ( ) ) ;
hDevice = CreateFile (
szPath. c_str ( ) ,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL ,
OPEN_EXISTING,
0 ,
NULL
) ;
if ( hDevice == INVALID_HANDLE_VALUE)
{
fprintf ( stderr , "CreateFile() Error: %ld\n" , GetLastError ( ) ) ;
continue ;
}
query. PropertyId = StorageDeviceProperty;
query. QueryType = PropertyStandardQuery;
pDevDescHeader = ( STORAGE_DESCRIPTOR_HEADER * ) malloc ( sizeof ( STORAGE_DESCRIPTOR_HEADER) ) ;
if ( NULL == pDevDescHeader)
{
continue ;
}
result = DeviceIoControl (
hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof query,
pDevDescHeader,
sizeof ( STORAGE_DESCRIPTOR_HEADER) ,
& readed,
NULL ) ;
if ( ! result)
{
fprintf ( stderr , "IOCTL_STORAGE_QUERY_PROPERTY Error: %ld\n" , GetLastError ( ) ) ;
free ( pDevDescHeader) ;
( void ) CloseHandle ( hDevice) ;
continue ;
}
devDescLength = pDevDescHeader- > Size;
pDevDesc = ( STORAGE_DEVICE_DESCRIPTOR * ) malloc ( devDescLength) ;
if ( NULL == pDevDesc)
{
free ( pDevDescHeader) ;
continue ;
}
result = DeviceIoControl (
hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
& query,
sizeof query,
pDevDesc,
devDescLength,
& readed,
NULL ) ;
if ( ! result)
{
fprintf ( stderr , "IOCTL_STORAGE_QUERY_PROPERTY Error: %ld\n" , GetLastError ( ) ) ;
free ( pDevDescHeader) ;
free ( pDevDesc) ;
( void ) CloseHandle ( hDevice) ;
continue ;
}
if ( BusTypeUsb == ( WORD) pDevDesc- > BusType)
{
}
else
{
continue ;
}
}
return ;
}
void GetUsbInfo ( std:: wstring wsSrcPath)
{
if ( wsSrcPath. empty ( ) )
{
return ;
}
wsSrcPath = wsSrcPath. substr ( 0 , wsSrcPath. find ( L":\\" ) ) ;
std:: wstring szPath = wsformat ( L"\\\\.\\%s:" , wsSrcPath. c_str ( ) ) ;
HANDLE hDevice = CreateFile ( szPath. c_str ( ) , GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL , OPEN_EXISTING, NULL , NULL ) ;
if ( hDevice != INVALID_HANDLE_VALUE)
{
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc = ( PSTORAGE_DEVICE_DESCRIPTOR) new BYTE[ sizeof ( STORAGE_DEVICE_DESCRIPTOR) + 512 - 1 ] ;
pDevDesc- > Size = sizeof ( STORAGE_DEVICE_DESCRIPTOR) + 512 - 1 ;
if ( GetDisksProperty ( hDevice, pDevDesc) )
{
char * p= ( char * ) pDevDesc;
VendorId = ( pDevDesc- > VendorIdOffset ? & p[ pDevDesc- > VendorIdOffset] : "(NULL)" ) ;
ProductId= ( pDevDesc- > ProductIdOffset ? & p[ pDevDesc- > ProductIdOffset] : "(NULL)" ) ;
ProductRevision = ( pDevDesc- > ProductRevisionOffset ? & p[ pDevDesc- > ProductRevisionOffset] : "(NULL)" ) ;
SerialNumber = ( pDevDesc- > SerialNumberOffset ? & p[ pDevDesc- > SerialNumberOffset] : "(NULL)" ) ;
}
delete pDevDesc;
CloseHandle ( hDevice) ;
}
}