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 about removable 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
1.
Get
the disks base information:
switch ( GetDriveType( szDrvName ) )
{
case 0:
case 1:
drivetype = DRVUNKNOWN;
break;
case DRIVE_REMOVABLE:
drivetype = DRVREMOVE;
break;
case DRIVE_CDROM:
break;
case DRIVE_FIXED:
drivetype = DRVFIXED;
break;
case DRIVE_REMOTE:
drivetype = DRVREMOTE;
break;
case DRIVE_RAMDISK:
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)
{
szMoveDiskName[k] = chFirstDriveFromMask(temp);
szMoveDiskName[0]=k;
k++;
}
}
Close this drive when we finished our work on it:
CloseHandle(hDevice);
3.
How does the GetDisksProperty() work?
BOOL GetDisksProperty(HANDLE hDevice,
PSTORAGE_DEVICE_DESCRIPTOR pDevDesc)
{
STORAGE_PROPERTY_QUERY Query;
DWORD dwOutBytes;
BOOL bResult;
Query.PropertyId = StorageDeviceProperty;
Query.QueryType = PropertyStandardQuery;
bResult = ::DeviceIoControl(hDevice,
IOCTL_STORAGE_QUERY_PROPERTY,
&Query, sizeof(STORAGE_PROPERTY_QUERY),
pDevDesc, pDevDesc->Size,
&dwOutBytes,
(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