![]() |
Platforms, Frameworks & Libraries »
Win32/64 SDK & OS »
General
Intermediate
License: The Code Project Open License (CPOL)
How To get the usbdisk's drive letter properlyBy f22_stormUsing DeviceIoControl to get UsbDisk Drive letter(s) |
VC6, VC7, VC7.1Win2K, WinXP, Win2003, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
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, GetDriveType()' function.
How can we differentiate between these USB �Fix Disk� and Those IDE �Fix Disk�? Here is the solution for this event.
(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:
switch ( GetDriveType( szDrvName ) ) { case 0: // The drive type cannot be determined. case 1: // 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 Win
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[0]=k; k++; } }
Close this drive when we finished our work on it:
CloseHandle(hDevice);
/******************************************************** * * 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; }
case = DRIVE_REMOVABLE:�;
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 28 Mar 2004 Editor: Nishant Sivakumar |
Copyright 2004 by f22_storm Everything else Copyright © CodeProject, 1999-2009 Web21 | Advertise on the Code Project |