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, 32 MB, 64 MB , 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: // 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 32’ 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[0]=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
case = DRIVE_REMOVABLE:
‘; History
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
콜백 함수를 Angular 하위 구성 요소에 전달이 예제는 구성 요소에 함수를 전달하는 것과 관련하여 최근에 직면한 문제를 다룰 것입니다. 국가 목록을 제공하는 콤보 상자 또는 테이블 구성 요소. 지금까지 모든 것이 구성 요소 자체에 캡슐화되었으며 백엔드에 대한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.