次の方法で共有


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を受信すると、ファイル システムはボリュームをディスクにフラッシュし、ファイル システムのディスク構造を一貫性のある最新の状態にする必要があります。 ファイル システムは読み取り専用のマウント可能な状態でファイル システムをロックし、キャッシュされたディスク ページがダーティされないように、新しいファイル システムの変更をブロックする必要があります。 ファイル システムは、このような状態にファイル システムを配置した後、次のドライバーが 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 を受信するときにファイル システムまたはファイル システム フィルター ドライバーが行う必要がある処理は、次の下位レベルのドライバーに送信する以外にありません。

要件

要件
Header ntifs.h (Ntifs.h、Fltkernel.h を含む)

こちらもご覧ください

IRP_MJ_DEVICE_CONTROL