IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL (ntifs.h)

ボリューム シャドウ コピーが発生する前にファイル システムを強制的にフラッシュするために、IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES コントロール コードが送信されます。 この IOCTL は、ローカル ファイル システムのボリューム デバイス オブジェクトと、そのボリュームに接続されている可能性があるファイル システム フィルター ドライバーにのみ送信されるIRP_MJ_DEVICE_CONTROL要求として発行されます。 この IOCTL は、ボリューム シャドウ コピー サービスによって最も一般的に送信されますが、他のユーザー モード のアプリケーションまたはプロセスから発行することもできます。 また、この IOCTL が休止状態要求中またはクラッシュ ダンプの前にボリューム シャドウ コピー ドライバー (volsnap.sys) によって送信される特別な状況でも可能です。 この IOCTL は、ファイル システム フィルター ドライバー、ファイル システム ドライバー、およびその他のデバイス ドライバー (記憶域フィルター ドライバーや記憶域ドライバーなど) にファイル システムの下に送信されます。

NTFS などのファイル システムがIOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITESを受け取ると、ファイル システムはボリュームをディスクにフラッシュし、ファイル システムのディスク構造を一貫性のある up-to-date 状態にする必要があります。 ファイル システムは、読み取り専用のマウント可能な状態でファイル システムをロックし、キャッシュされたディスク ページがダーティにならないように、新しいファイル システムの変更をブロックする必要があります。 ファイル システムがこのような状態にファイル システムを配置したら、次のドライバーが IRP を完了するまで、このような読み取り専用マウント可能な状態でファイル システムを維持しながら、次のドライバーに IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL を持つ IRP を渡す必要があります。 IRP が完了するか取り消されると、ファイル システムはボリュームの I/O を再び有効にして戻ります。

メジャー コード

IRP_MJ_DEVICE_CONTROL

入力バッファー

IrpSp->Parameters.DeviceIoControl.IoControlCode が IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES に設定されています。

出力バッファー

何一つ

状態ブロック

Status メンバーは、成功した場合にSTATUS_SUCCESSするか、次のいずれかの適切な NTSTATUS 値に設定されます。

STATUS_FILE_LOCK_CONFLICT

ファイル ロックの競合が発生しました。 このエラーは、フィルター マネージャーから返される可能性があります。

STATUS_VOLUME_DISMOUNTED

ボリュームがマウント解除されました。

備考

ボリュームのシャドウ コピーは、そのボリュームのポイントインタイム コピーです。 シャドウ コピーは主にバックアップ アプリケーションによって使用されるため、バックアップ操作を完了する期間中にファイルが実際に変更される場合でも、ファイルを一貫した方法でバックアップできます。 また、シャドウ コピーを使用して、PNP 要求に起因する休止状態やクラッシュ ダンプ用のボリュームを準備することもできます。

Windows XP 以降のバージョンのオペレーティング システムには、シャドウ コピーのタイミングを調整するためのフレームワークと、シャドウ コピーを作成するために書き込み時のコピー手法を使用するストレージ フィルター ドライバー (ファイル システム フィルター ドライバーではない) が含まれます。 ボリューム シャドウ コピー サービス (VSS) は、シャドウ コピーを調整します。 ボリューム シャドウ コピー ドライバー (volsnap.sys) は、ファイル システムの下の記憶域スタックの上に読み込まれる記憶域フィルター ドライバーです。

ファイル システムに影響を与えるスナップショット関連の重要な IOCTL の 1 つは、IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITESです。 この IOCTL は、IOCTL であっても、実際にはファイル システムによる解釈を目的としています。 これは、すべてのファイル システムが、ファイル システムの後に IOCTL の処理を待機している下位レベルのドライバーに IOCTL を渡す必要があるためです。

IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITESは、ローカル ファイル システムのボリューム デバイス オブジェクトと、そのボリュームに接続されている可能性があるファイル システム フィルター ドライバーにのみ送信されます。 ボリューム パラメーター ブロック (VPB) 構造体の RealDevice メンバーを介してボリュームにリンクされているストレージ デバイス オブジェクトには、常に次のいずれかの種類のデバイスがあります。

FILE_DEVICE_DISK

FILE_DEVICE_VIRTUAL_DISK

この IOCTL はリモート・ファイル・システムには送信されません。

ローカル ファイル システムがIOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITESを受け取ると、ドライバーはファイル システム メタデータの一貫性のあるイメージを作成する必要があります。 ドライバーは、互いに矛盾しているページを持つべきではありません。 ドライバーは、下位レベルのドライバーによって IOCTL が完了するまで、ディスクにフラッシュされていないメタデータとマップされたキャッシュ バッファーの一部をフラッシュし、書き込みを保持する必要があります。

ミニフィルター ファイル システム ドライバーの場合、フィルター マネージャーはこの IOCTL を受け取り、ドライバーがこの IRP を受け取るために登録されている場合、ミニフィルター ドライバーにコールバックを発行します。 ミニフィルター ドライバーまたはレガシ ファイル システム フィルター ドライバーがこの IOCTL を受け取ると、ドライバーは、ディスクにフラッシュされていないメタデータの一部をフラッシュする必要があります。 フィルター ドライバーがマップされたキャッシュ バッファーを使用してメタデータを書き込む場合、ファイル システムはすべてのフラッシュを処理します。 フィルター ドライバーは、ファイル システムが変更をディスクにフラッシュしようとしているときに、マップされたキャッシュ バッファーに書き込まないことを確認する必要があります。 レガシ ファイル システム フィルター ドライバーは、スタック内の次のドライバーに IRP を渡す必要があります。

ドライバーは、下位レベルのドライバーに渡す前に、IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES IOCTL を含むこの IRP を保持している間にデータをフラッシュすることを選択できます。 IRP を次の下位レベルのドライバーに送信する前に、この IOCTL を保持している間にディスクにフラッシュされたデータは、結果のシャドウ コピーで使用できるデータになります。

これが読み取り専用ボリュームの場合、通常、次の下位レベルのドライバーに送信する以外に、この IOCTL を受信するときにファイル システムまたはファイル システム フィルター ドライバーが行う必要があることは何もありません。

必要条件

要件 価値
ヘッダー ntifs.h (Ntifs.h、Fltkernel.h を含む)

関連項目

IRP_MJ_DEVICE_CONTROL