FsRtlNotifyFilterChangeDirectory 関数 (ntifs.h)

FsRtlNotifyFilterChangeDirectory は 、IRP_MN_NOTIFY_CHANGE_DIRECTORY要求の通知構造体を作成し、指定された通知リストに追加します。

構文

void FsRtlNotifyFilterChangeDirectory(
  [in]           PNOTIFY_SYNC               NotifySync,
  [in]           PLIST_ENTRY                NotifyList,
  [in]           PVOID                      FsContext,
  [in]           PSTRING                    FullDirectoryName,
  [in]           BOOLEAN                    WatchTree,
  [in]           BOOLEAN                    IgnoreBuffer,
  [in]           ULONG                      CompletionFilter,
  [in, optional] PIRP                       NotifyIrp,
  [in, optional] PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
  [in, optional] PSECURITY_SUBJECT_CONTEXT  SubjectContext,
  [in, optional] PFILTER_REPORT_CHANGE      FilterCallback
);

パラメーター

[in] NotifySync

NotifyList パラメーターによって指される変更ディレクトリ通知リストの不透明な同期オブジェクトへのポインター。

[in] NotifyList

現在のボリュームの変更ディレクトリ通知リストの先頭へのポインター。 リスト内の各要素は、不透明な通知構造体です。

[in] FsContext

特定のファイル オブジェクトに属するように作成される通知構造を識別するためにファイル システムによって割り当てられた一意の値へのポインター。 TraverseCallback ルーチンが指定されている場合、FsContextNotifyContext パラメーターとしてそのルーチンに渡されます。

[in] FullDirectoryName

この通知構造体に関連付けられているディレクトリの完全な名前を含む ANSI または Unicode 文字列へのポインター。 NotifyIrp が NULL の場合は無視されます。

[in] WatchTree

このディレクトリのすべてのサブディレクトリも監視する必要がある場合は、TRUE に設定します。 ディレクトリ自体のみを監視する場合は FALSE に設定します。 NotifyIrp が NULL の場合は無視されます。

[in] IgnoreBuffer

ユーザー バッファーを無視し、ディレクトリを強制的に再び再開するには、TRUE に設定します。 このアクションにより、操作の速度が向上します。 NotifyIrp が NULL の場合は無視されます。

[in] CompletionFilter

通知リスト内の IRP が完了する原因となるファイルまたはディレクトリに対する変更の種類を指定するフラグのビットマスク。 次の表では、使用可能なフラグ値について説明します。

フラグ 説明
FILE_NOTIFY_CHANGE_FILE_NAME (0x0001) このディレクトリにファイルが追加、削除、または名前変更されました。
FILE_NOTIFY_CHANGE_DIR_NAME (0x0002) サブディレクトリが作成、削除、または名前変更されました。
FILE_NOTIFY_CHANGE_NAME (0x0003) このディレクトリの名前が変更されました。
FILE_NOTIFY_CHANGE_ATTRIBUTES (0x0004) このファイルの属性の値 (最終アクセス時刻など) が変更されました。
FILE_NOTIFY_CHANGE_SIZE (0x0008) このファイルのサイズが変更されました。
FILE_NOTIFY_CHANGE_LAST_WRITE (0x0010) このファイルの最終変更時刻が変更されました。
FILE_NOTIFY_CHANGE_LAST_ACCESS (0x0020) このファイルの最後のアクセス時刻が変更されました。
FILE_NOTIFY_CHANGE_CREATION (0x0040) このファイルの作成時間が変更されました。
FILE_NOTIFY_CHANGE_EA (0x0080) このファイルの拡張属性が変更されました。
FILE_NOTIFY_CHANGE_SECURITY (0x0100) このファイルのセキュリティ情報が変更されました。
FILE_NOTIFY_CHANGE_STREAM_NAME (0x0200) このディレクトリにファイル ストリームが追加、削除、または名前変更されました。
FILE_NOTIFY_CHANGE_STREAM_SIZE (0x0400) このファイル ストリームのサイズが変更されました。
FILE_NOTIFY_CHANGE_STREAM_WRITE (0x0800) このファイル ストリームのデータが変更されました。

NotifyIrp が NULL の場合、CompletionFilter は無視されます。

[in, optional] NotifyIrp

通知リストに追加する IRP へのポインター。 NotifyIrp が NULL の場合は、ファイル オブジェクト (FsContext パラメーターで識別) によって表されるファイル ストリームが削除されることを意味します。

[in, optional] TraverseCallback

ディレクトリ ツリーで監視されているサブディレクトリで変更が発生したときに呼び出されるコールバック ルーチンへのオプションのポインター。 これにより、ファイル システムはウォッチャーがそのディレクトリへの走査アクセス権を持っているかどうかをチェックできます。 このような呼び出し元から提供されるルーチンは、次のように宣言されます。

NTSTATUS
(*PCHECK_FOR_TRAVERSE_ACCESS) (
    IN PVOID NotifyContext,                     // FsContext
    IN PVOID TargetContext,                     // Context pointer
    IN PSECURITY_SUBJECT_CONTEXT SubjectContext // SubjectContext
    );

TargetContext パラメーターの詳細については、FsRtlNotifyFullReportChangeTargetContext パラメーターを参照してください。 NotifyIrp が NULL の場合、TraverseCallback は無視されます。

[in, optional] SubjectContext

TraverseCallback に渡されるSECURITY_SUBJECT_CONTEXT構造体へのポインター。 FsRtlNotifyFilterChangeDirectory は コンテキストを解放し、使用後に構造体を解放します。 NotifyIrp が NULL の場合、このパラメーターは無視されます。 TraverseCallback ルーチンが指定されている場合、SubjectContext はそのルーチンに SubjectContext パラメーターとして渡されます。

[in, optional] FilterCallback

ディレクトリに変更が発生したときに呼び出されるコールバック ルーチンへの省略可能なポインター。 このコールバック ルーチンが TRUE を返す場合、 FsRtlNotifyFilterReportChange は通知リストの保留中のIRP_MN_NOTIFY_CHANGE_DIRECTORY要求を完了します。それ以外の場合は、行われません。 このような呼び出し元から提供されるルーチンは、次のように宣言されます。

BOOLEAN
(*PFILTER_REPORT_CHANGE) (
    IN PVOID NotifyContext,                     // FsContext
    IN PVOID FilterContext                      // Context pointer
    );

戻り値

なし

解説

FsRtlNotifyFilterChangeDirectory は、主要な関数コード IRP_MJ_DIRECTORY_CONTROL、マイナー関数コード IRP_MN_NOTIFY_CHANGE_DIRECTORYを持つ IRP を受け取ったファイル システムによって呼び出されます。

ファイル システムは FsRtlNotifyFilterChangeDirectory を呼び出して、IRP を保持する通知構造体を作成し、現在のボリュームの通知リストに通知構造体を追加します。

NotifyIrp が NULL の場合、FsRtlNotifyFilterChangeDirectory は、指定された FsContext 値に一致するファイル オブジェクトを持つ保留中の IRP が通知リストに既に含まれているかどうかを確認し、存在する場合は、STATUS_DELETE_PENDINGで IRP を完了します。

NotifyIrp が NULL でない場合、FsRtlNotifyFilterChangeDirectory は次の処理を行います。

  • IRP のファイル オブジェクトがクリーンアップを行ったかどうかを確認します。 その場合、 FsRtlNotifyFilterChangeDirectory は状態STATUS_NOTIFY_CLEANUPで IRP を完了し、通知リストに追加しません。

  • IRP のファイル オブジェクトがクリーンアップを行っていない場合、 FsRtlNotifyFilterChangeDirectory は、通知リストに指定された FsContext 値の通知構造体が既に含まれているかどうかを確認します。 このような通知構造が見つかり、レポートに保留中の変更がある場合、 FsRtlNotifyFilterChangeDirectory はNotifyIrp を完了します。 通知構造体が見つかったが、レポートに保留中の変更がない場合、 FsRtlNotifyFilterChangeDirectoryNotifyIrp が指す IRP を保留中としてマークし、通知構造体の通知 IRP の一覧に挿入します。 このような通知構造が見つからない場合、 FsRtlNotifyFilterChangeDirectoryNotifyIrp が指す IRP を保留中としてマークし、通知構造体を作成して、通知リストに挿入します。

ディレクトリに変更が発生すると、ファイル システムは FsRtlNotifyFilterReportChange を呼び出して、通知リストの保留中のIRP_MN_NOTIFY_CHANGE_DIRECTORY要求を完了します。

要件

要件
サポートされている最小のクライアント Windows 2000 SP4 更新プログラムのロールアップ。Windows XP
対象プラットフォーム ユニバーサル
Header ntifs.h (Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL < APC_LEVEL
DDI コンプライアンス規則 HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

こちらもご覧ください

FsRtlNotifyFilterReportChange

FsRtlNotifyFullChangeDirectory

FsRtlNotifyFullReportChange

IRP_MJ_DIRECTORY_CONTROL

SECURITY_SUBJECT_CONTEXT