Notifying the File System of Possible Media Changes

A removable-media device driver must ensure that the media is not changed for the device represented by the DeviceObject (input to every driver routine that is sent an IRP) whenever the driver processes an IRP that requests a transfer to/from the media or a device I/O control operation that affects the media. The best possible time to check for changed media is just after the transition from a no-media-present state to a media-present state if the physical device always notifies the driver about these state changes.

If its physical device indicates that the state of the media might have changed before the driver begins an I/O operation or during an operation, the driver must do the following:

  1. Ensure that the volume is mounted by checking the VPB_MOUNTED flag in the VPB. (If the volume is not mounted, the driver must not set the DO_VERIFY_VOLUME bit. The driver should set IoStatus.Status to STATUS_IO_DEVICE_ERROR, set IoStatus.Information to zero, and call IoCompleteRequest with the IRP.)

  2. Set the Flags in the DeviceObject by ORing Flags with DO_VERIFY_VOLUME.

  3. Set the IoStatus block in the IRP to the following:

    • Status set to STATUS_VERIFY_REQUIRED
    • Information set to zero
  4. Before completing any IRP with an IoStatus block in which the Status field is not set to STATUS_SUCCESS, the driver must call IoIsErrorUserInduced, which returns a Boolean TRUE for any of the following Status values:

    • 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

    If IoIsErrorUserInduced returns TRUE, the driver must call IoSetHardErrorOrVerifyDevice so the FSD can open a dialog box to the user, who can then choose to supply the correct media, retry the original request, or cancel the requested operation.