向文件系统通知可能发生了媒体更改

可移动媒体设备驱动程序必须确保不会更改 DeviceObject 表示的设备媒体 (每个驱动程序例程的输入,每当驱动程序处理请求与媒体的传输请求的 IRP 或影响媒体的设备 I/O 控制操作时发送 IRP) 。 如果物理设备始终通知驱动程序这些状态更改,则为更改的媒体检查的最佳时间是在从无媒体当前状态过渡到媒体当前状态之后。

如果其物理设备指示在驱动程序开始 I/O 操作之前或操作期间媒体的状态可能已更改,则驱动程序必须执行以下操作:

  1. 通过检查 VPB 中的VPB_MOUNTED标志,确保已装载卷。 (如果未装载卷,驱动程序不得设置DO_VERIFY_VOLUME位。驱动程序应将 IoStatus.Status 设置为 STATUS_IO_DEVICE_ERROR,将 IoStatus.Information 设置为零 ,并使用 IRP.)

  2. DeviceObject中通过 ORing 标志设置标志,DO_VERIFY_VOLUME。

  3. 将 IRP 中的 IoStatus 块设置为以下内容:

    • 状态 设置为STATUS_VERIFY_REQUIRED
    • 信息 设置为零
  4. 在使用“状态”字段未设置为STATUS_SUCCESS的 IoStatus 块完成任何 IRP 之前,驱动程序必须调用 IoIsErrorUserInduced,这将为以下任何 Status 值返回布尔值 TRUE

    • STATUS_VERIFY_REQUIRED
    • STATUS_NO_MEDIA_IN_DEVICE
    • STATUS_WRONG_VOLUME
    • STATUS_UNRECOGNIZED_MEDIA
    • STATUS_MEDIA_WRITE_PROTECTED
    • STATUS_IO_TIMEOUT
    • STATUS_DEVICE_NOT_READY

    如果 IoIsErrorUserInduced 返回 TRUE,驱动程序必须调用 IoSetHardErrorOrVerifyDevice ,以便 FSD 可以向用户打开一个对话框,然后用户可以选择提供正确的媒体、重试原始请求或取消请求的操作。