在CD-ROM驱动器上使用IOCTL_VOLUME_OFFLINE后,DeviceIoControl返回错误1和50

时间:2018-12-14 11:32:56

标签: winapi

我想让我的C ++ Windows应用程序卸下驱动器,并且不允许操作系统自动将其重新安装回去。

为此,我使用两个函数:CreateFile用于检索驱动器的句柄,DeviceIoControl用于对该驱动器执行不同的操作(通过从第一个函数检索的句柄)。

研究Windows API文档后,我的执行方法如下:

  1. 调用CreateFile()获取指定字母的驱动器句柄。
  2. 卸下驱动器。
  3. 将该驱动器设置为脱机。
  4. 合上驱动器的把手。

代码看起来像这样(为简单起见,我省略了一些变量声明):

HANDLE hVolume;
std::string volume_name = std::string("\\\\.\\D:");     //for drive with letter D
hVolume = CreateFile(
    volume_name.c_str(),
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);

DWORD dwBytesReturned;
DeviceIoControl(
    hVolume,
    FSCTL_DISMOUNT_VOLUME,
    NULL, 0,
    NULL, 0,
    &dwBytesReturned,
    NULL);

DeviceIoControl(
    hVolume,
    IOCTL_VOLUME_OFFLINE,
    NULL,
    0,
    NULL,
    0,
    &dwBytesReturned,
    NULL);

CloseHandle(hVolume);

现在,这对于到目前为止我尝试过的几种不同的USB驱动器都可以正常工作。即使您双击“我的电脑”窗口中显示的驱动器D,也无法正确卸下它们,也不会将它们重新装回。

当我尝试使用CD-ROM驱动器时,事情不再起作用。有趣的是,我遇到了两个不同的错误(都在使用IOCTL_VOLUME_OFFLINE参数调用DeviceIoControl时):

  1. 在内部CD-ROM驱动器上(我正在笔记本电脑上进行这些测试) 错误1(ERROR_INVALID_FUNCTION)。
  2. 在两个不同的外部USB上     CD-ROM驱动器,出现错误50(ERROR_NOT_SUPPORTED)。

有人使用IOCTL_VOLUME_OFFLINE与DeviceIoControl一起工作,并且经历了USB驱动器和CD-ROM驱动器的这种不同行为吗?还是有人知道如何以其他方式完成我想做的事情?

我正在使用Windows 7,但是根据Windows文档,此功能自Windows XP起可用。

任何指针将不胜感激。非常感谢。

0 个答案:

没有答案