Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何检测媒体是否插入可移动驱动器/读卡器_Windows_Winapi_Msdn - Fatal编程技术网

Windows 如何检测媒体是否插入可移动驱动器/读卡器

Windows 如何检测媒体是否插入可移动驱动器/读卡器,windows,winapi,msdn,Windows,Winapi,Msdn,我有一个读卡器(没有插入记忆棒) 当我插入计算机时,它显示我的计算机中有一个空驱动器 是否可能知道某个驱动器是否有介质(对不起,我不知道如何称呼它…此行为的原因是历史原因,可追溯到软盘驱动器和MS-DOS。A:驱动器仍然是A:驱动器,即使其中没有软盘 有时可以检查带有可移动介质的驱动器是否为空。读卡器和CD驱动器通常支持这一点,软盘驱动器不支持。您将发送驱动器a。我发现MSalters使用IOCTL\u STORAGE\u CHECK\u VERIFY的建议非常好。使用IOCTL\u STORA

我有一个读卡器(没有插入记忆棒)

当我插入计算机时,它显示我的计算机中有一个空驱动器


是否可能知道某个驱动器是否有介质(对不起,我不知道如何称呼它…

此行为的原因是历史原因,可追溯到软盘驱动器和MS-DOS。
A:
驱动器仍然是
A:
驱动器,即使其中没有软盘


有时可以检查带有可移动介质的驱动器是否为空。读卡器和CD驱动器通常支持这一点,软盘驱动器不支持。您将发送驱动器a。

我发现MSalters使用
IOCTL\u STORAGE\u CHECK\u VERIFY
的建议非常好。使用
IOCTL\u STORAGE\u CHECK\u 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\u STORAGE\u CHECK\u VERIFY的实现遵循一些数据读取请求。因此,为了能够使用
IOCTL\u STORAGE\u CHECK\u VERIFY
,而不会出现
ERROR\u ACCESS\u 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);
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"));
还有另一个版本的
IOCTL\u STORAGE\u CHECK\u VERIFY
-
IOCTL\u STORAGE\u CHECK\u VERIFY2
,其工作原理与
IOCTL\u STORAGE\u CHECK\u VERIFY
完全相同,但速度更快(请参阅)。要使用
IOCTL\u STORAGE\u CHECK\u VERIFY2
只能使用
FILE\u READ\u属性打开设备
访问:

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);
测试驱动器中是否存在介质的代码如下所示

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);
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"));

非常感谢您的回复。。。如果可能的话,请告诉我如何从所有驱动器中只筛选软盘驱动器。例如,我有驱动器,即(A:C:D:E:G:)如何从中筛选软盘驱动器。谢谢,我已经这样做了。如果您搜索
文件\u软盘\u软盘
,您将找到该位置。在回答中,我试图再次解释这一点。函数
NtQueryVolumeInformationFile
为您提供驱动器的特征标志。使用您的回复之一,我可以使用IOCTL\u STORAGE\u QUERY\u属性获取驱动器的总线类型。。。如果我根据BusType ex进行过滤,如果(BusType==BusTypeUsb)…我可以得到usb驱动器吗?当然可以,但我不明白为什么usb设备对你如此重要。其他总线,如BusTypeFibre、BusType1394、BusTypeSd、BusTypeMmc等,也可以提供可移动驱动器。如果您对任何可移动媒体感兴趣,您应该考虑所有这些总线,但是
BusType
为您提供了总线类型。