views:

41

answers:

2

Grretings to all..

i have a card reader ( no memory stick is inserted ).

when i insert into my compter it shows a drive in My Computer...

why it shows like that....

Is it possible to know whether a drive is having a media ( sorry i am not sure how to call it ) or not...

+1  A: 

The reason for this behavior is historical, and dates back to floppy drives and MS-DOS. The A: drive would still be the A: drive even if there was no floppy in it.

It is sometimes possible to check whether a drive with removable media is empty. Card readers and CD drives usually support this, floppy drives don't. You would send the drive a IOCTL_STORAGE_CHECK_VERIFY .

MSalters
+1  A: 

I find the suggestion of MSalters to use IOCTL_STORAGE_CHECK_VERIFY very good. There are a small trick in the usage of IOCTL_STORAGE_CHECK_VERIFY. Before the usage of IOCTL code in the function DeviceIoControl one need to open the corresponding device with respect of CreateFile function:

HANDLE hDevice = CreateFile (szDeviceName,  // like "\\.\E:"
                             0,             // no access to the drive
                             FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
                             NULL, OPEN_EXISTING, 0, NULL);

For the usage of DeviceIoControl one can use 0 as a second parameter of CreateFile, because we will not use ReadFile, WriteFile etc functions to access the device. The implementation of IOCTL_STORAGE_CHECK_VERIFY do follow to some read of data requests. So to be able to use IOCTL_STORAGE_CHECK_VERIFY without having ERROR_ACCESS_DENIED (5) error we have to open the device as following

HANDLE hDevice = CreateFile (szDeviceName,  // like "\\.\E:"
                             FILE_READ_DATA, // read access to the data
                             FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
                             NULL, OPEN_EXISTING, 0, NULL);

There exist another version of IOCTL_STORAGE_CHECK_VERIFY - IOCTL_STORAGE_CHECK_VERIFY2 which works absolutely the same as IOCTL_STORAGE_CHECK_VERIFY but much more quickly (see http://msdn.microsoft.com/en-us/library/ff560538.aspx). To use IOCTL_STORAGE_CHECK_VERIFY2 one can open device with only FILE_READ_ATTRIBUTES access:

HANDLE hDevice = CreateFile (szDeviceName,         // like "\\.\E:"
                             FILE_READ_ATTRIBUTES, // read access to the attributes
                             FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
                             NULL, OPEN_EXISTING, 0, NULL);

The code which test the existence of the media in the drive can look like following

DWORD cbBytesReturned;
bSuccess = DeviceIoControl (hDevice,                     // device to be queried
                            IOCTL_STORAGE_CHECK_VERIFY2,
                            NULL, 0,                     // no input buffer
                            NULL, 0,                     // no output buffer
                            &cbBytesReturned,            // # bytes returned
                            (LPOVERLAPPED) NULL);        // synchronous I/O
if (bSuccess)
    _tprintf (TEXT("the device media are accessible\n"));
else if (GetLastError() == ERROR_NOT_READY)
    _tprintf (TEXT("the device media are not accessible\n"));
Oleg
@Oleg : thanks a lot for your reply...if possible can you please tell me how to filter only floppy drive from all the drives ..for example i have drives namely ( A: C: D: E: G: ) how can i filter the floppy drive from it..Thank you
barbgal
In the http://stackoverflow.com/questions/3098696/how-to-get-the-vid-pid-and-drive-letter-for-all-the-usb-mass-storage-devices-plug/3100268#3100268 I do this already. If you search for `FILE_FLOPPY_DISKETTE` you will find the place. In the answer http://stackoverflow.com/questions/3156284/check-floppy-drive/3156474#3156474 I try to explain this one more time. The function `NtQueryVolumeInformationFile` gives you characteristics flags of a drive.
Oleg
@Oleg: using one of your reply i can able to use IOCTL_STORAGE_QUERY_PROPERTY to get the bus type of the drive ...if i filter based on the BusType ex if ( BusType == BusTypeUsb)..can i get usb drives
barbgal
Yes of cause, but I am not understand why are USB devices so important for you. Other buses like BusTypeFibre, BusType1394, BusTypeSd, BusTypeMmc etc can provide also removable drives. If you are intresting for any removable medias you should take all this buses in consideration, but the `BusType` gives the type of bus for you.
Oleg