メディア変更の可能性に関するファイル システムへの通知
リムーバブル メディアのデバイス ドライバーは、そのメディアとの間での転送を要求する IRP またはそのメディアに影響するデバイス I/O 制御操作を処理するたびに、DeviceObject (IRP の送信先となるすべてのドライバー ルーチンへの入力) で表現されるデバイスに対してメディアが変更されていないことを確認する必要があります。 メディアの存在の変化が必ず物理デバイスからドライバーに通知されるのであれば、メディアの変更の確認に最適な時点は、メディアが存在しない状態からメディアが存在する状態に移行した直後です。
ドライバーが I/O 操作を開始する前またはその操作中に、メディアの状態が変化した可能性があることが物理デバイスから通知された場合、ドライバーでは以下の操作を実行する必要があります。
VPB で VPB_MOUNTED フラグを調べて、ボリュームがマウントされていることを確認します (ボリュームがマウントされていない場合、ドライバーでは DO_VERIFY_VOLUME ビットを設定しないようにします。IoStatus.Status を STATUS_IO_DEVICE_ERROR、IoStatus.Information をゼロにそれぞれ設定し、IRP を指定して IoCompleteRequest を呼び出す必要があります)。
DO_VERIFY_VOLUME と DeviceObject の Flags との論理和演算により、Flags を設定します。
IRP の IoStatus ブロックを次のように設定します。
- Status を STATUS_VERIFY_REQUIRED に設定
- Information をゼロに設定
Status フィールドが 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 でユーザーにダイアログ ボックスを表示できるようにします。これにより、ユーザーは適切なメディアの提供、元の要求の再試行、または要求した操作のキャンセルを選択できます。