ファイル システムからの検証チェック要求への応答
ファイル システムは、それ自身の判断で、I/O スタックの場所で Parameters.DeviceIoControl.IoControlCode 要求を以下のように設定して、IRP_MJ_DEVICE_CONTROL のデバイス ドライバーのディスパッチ エントリ ポイントに IRP を送信できます。
IOCTL_XXX_CHECK_VERIFY
ここで、XXX は、DISK、TAPE、CDROM など、デバイスの種類です。
DISK タイプには、パーティション分割できない (フロッピー) デバイスとパーティション分割可能なリムーバブル メディア デバイスの両方が含まれます。
基になるデバイス ドライバーがメディアが変更されていないと判断すると、ドライバーは IRP を完了し、IoStatus ブロックを次の値で返します。
Status |
STATUS_SUCCESS に設定 |
情報 |
0 (ゼロ) に設定 |
さらに、デバイスの種類が DISK や CDROM で、呼び出し元が出力バッファーが指定された場合、ドライバーは Irp->AssociatedIrp.SystemBuffer のバッファー内のメディア変更数を返し、Irp-IoStatus.Information を >sizeof (ULONG) に設定します。 この数を返すことによって、ドライバーは、メディアがその観点から変更されたかどうかを判断する機会を呼び出し元に与えます。
基になるデバイス ドライバーがメディアが変更されたと判断した場合、ボリュームがマウントされているかどうかによって異なるアクションが実行されます。 ボリュームがマウントされている場合 (VPB で VPB_MOUNTED フラグが設定されている場合)、ドライバーは次の操作を行う必要があります。
DO_VERIFY_VOLUME と DeviceObject の Flags との論理和演算により、Flags を設定します。
IRP の IoStatus ブロックを次のように設定します。
- Status を STATUS_VERIFY_REQUIRED に設定
- Information を 0 に設定
指定された IRP を使用して IoCompleteRequest を呼び出します。
ボリュームがマウントされていない場合、ドライバーは DO_VERIFY_VOLUME ビットを設定できません。 ドライバーは、IoStatus.Status を STATUS_IO_DEVICE_ERRORに設定し、IoStatus.Information を 0 に設定し、IRP で IoCompleteRequest を呼び出す必要があります。