我有一个读卡器(没有插入记忆棒)。
当我插入我的电脑它显示我的电脑中的空驱动器…
是否有可能知道一个驱动器是否有一个媒体(抱歉,我不知道如何调用它)或不…
我发现MSalters的建议使用IOCTL_STORAGE_CHECK_VERIFY
非常好。 使用IOCTL_STORAGE_CHECK_VERIFY
有一个小诀窍。 在DeviceIoControl
函数中使用IOCTL代码之前,需要关于CreateFile
函数打开相应的设备:
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);
对于DeviceIoControl
的使用,可以使用0作为CreateFile
的第二个参数,因为我们不会使用ReadFile
, WriteFile
等函数来访问设备。 IOCTL_STORAGE_CHECK_VERIFY
实现遵循一些数据请求的读取 。 所以为了能够使用IOCTL_STORAGE_CHECK_VERIFY
而不会有ERROR_ACCESS_DENIED
(5)错误,我们必须打开设备如下
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);
还有另一个版本的IOCTL_STORAGE_CHECK_VERIFY
– IOCTL_STORAGE_CHECK_VERIFY2
,它与IOCTL_STORAGE_CHECK_VERIFY
工作方式完全相同,但速度更快(请参阅http://msdn.microsoft.com/zh-cn/library/ff560538.aspx )。 要使用IOCTL_STORAGE_CHECK_VERIFY2
,只能使用FILE_READ_ATTRIBUTES
访问来打开设备:
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);
测试驱动器中介质存在的代码可能如下所示
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"));
这种行为的原因是历史的,可以追溯到软盘驱动器和MS-DOS。 A:
驱动器仍然是A:
驱动器,即使它没有软盘。
有时可以检查带有可移动介质的驱动器是否为空。 读卡器和CD驱动器通常支持这一点,软盘驱动器不支持。 您将发送一个IOCTL_STORAGE_CHECK_VERIFY
驱动器。