我找到的建议MSalters to use IOCTL_STORAGE_CHECK_VERIFY
非常好。使用上有一个小技巧IOCTL_STORAGE_CHECK_VERIFY
。在函数中使用 IOCTL 代码之前DeviceIoControl
需要打开相应的设备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/en-us/library/ff560538.aspx http://msdn.microsoft.com/en-us/library/ff560538.aspx)。使用IOCTL_STORAGE_CHECK_VERIFY2
一个人只需打开设备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);
测试驱动器中媒体是否存在的代码如下所示
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"));