Reputation: 6386
I have a card reader ( no memory stick is inserted ).
When i insert into my compter it shows an empty drive in My Computer...
Is it possible to know whether a drive is having a media ( sorry i am not sure how to call it ) or not...
Upvotes: 4
Views: 3758
Reputation: 221997
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"));
Upvotes: 14
Reputation: 179787
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
.
Upvotes: 3