次の方法で共有


FltNotifyFilterChangeDirectory 関数 (fltkernel.h)

FltNotifyFilterChangeDirectory ルーチンは、IRP_MN_NOTIFY_CHANGE_DIRECTORY操作の通知構造体を作成し、指定された通知リストに追加します。

構文

VOID FLTAPI FltNotifyFilterChangeDirectory(
  [in, out]      PNOTIFY_SYNC               NotifySync,
  [in, out]      PLIST_ENTRY                NotifyList,
  [in]           PVOID                      FsContext,
  [in]           PSTRING                    FullDirectoryName,
  [in]           BOOLEAN                    WatchTree,
  [in]           BOOLEAN                    IgnoreBuffer,
  [in]           ULONG                      CompletionFilter,
  [in]           PFLT_CALLBACK_DATA         NotifyCallbackData,
  [in, optional] PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
  [in, optional] PSECURITY_SUBJECT_CONTEXT  SubjectContext,
  [in, optional] PFILTER_REPORT_CHANGE      FilterCallback
);

パラメーター

[in, out] NotifySync

NotifyList パラメーターが指す変更ディレクトリ通知リストの不透明な同期オブジェクトへのポインター。

[in, out] NotifyList

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

[in] FsContext

作成する通知構造を識別するために呼び出し元によって割り当てられた一意の値へのポインター。 コールバック ルーチンが TraverseCallback パラメーターで指定された場合、 FsContext はそのルーチンに NotifyContext パラメーターとして渡されます。

[in] FullDirectoryName

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

[in] WatchTree

FullDirectoryName パラメーターで指定されたディレクトリのすべてのサブディレクトリも監視する必要がある場合は、TRUE に設定します。 ディレクトリ自体のみを監視する場合は FALSE に設定します。

[in] IgnoreBuffer

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

[in] CompletionFilter

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

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

[in] NotifyCallbackData

通知リストに追加する操作のコールバック データ構造へのポインター。 このパラメーターは必須であり、 NULL にすることはできません。

[in, optional] TraverseCallback

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

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

TargetContext パラメーターの詳細については、FsRtlNotifyFullReportChange ルーチンの TargetContext パラメーターを参照してください。

[in, optional] SubjectContext

TraverseCallback に渡されるコンテキスト構造へのポインター。 FltNotifyFilterChangeDirectory は コンテキストを解放し、使用後に構造体を解放します。 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
    );

戻り値

なし

解説

ミニフィルター ドライバーは、通知の変更ディレクトリ操作を処理するために登録した事前操作コールバック ルーチン (PFLT_PRE_OPERATION_CALLBACK) から FltNotifyFilterChangeDirectory を呼び出すことができます。 これらの操作には、IRP_MJ_DIRECTORY_CONTROLの主要な関数コードと、 IRP_MN_NOTIFY_CHANGE_DIRECTORY のマイナー関数コードがあります。

ミニフィルター ドライバーは 、FltNotifyFilterChangeDirectory を呼び出して、操作のコールバック データ構造を保持し、現在のボリュームの通知リストに通知構造体を追加する通知構造体を作成します。

FltNotifyFilterChangeDirectory は次の処理を行います。

  • 操作のファイル オブジェクトがクリーンアップされているかどうかを確認します。 その場合、 FltNotifyFilterChangeDirectory は状態STATUS_NOTIFY_CLEANUPで操作を完了し、通知リストに追加しません。
  • 操作のファイル オブジェクトがクリーンアップされていない場合、 FltNotifyFilterChangeDirectory は、通知リストに指定された FsContext 値の通知構造体が既に含まれているかどうかを確認します。 このような通知構造体が見つかり、レポートに保留中の変更がある場合、 FltNotifyFilterChangeDirectory はNotifyCallbackData パラメーターが指すコールバック データ構造を完了します。 通知構造体が見つかったが、レポートに保留中の変更がない場合、 FltNotifyFilterChangeDirectory は 通知構造体に操作を追加します。 このような通知構造が見つからない場合、 FltNotifyFilterChangeDirectory は 操作の通知構造体を作成し、リストに挿入します。
ディレクトリに変更が発生すると、ファイル システムは FsRtlNotifyFilterReportChange を呼び出して、通知リストの保留中のIRP_MN_NOTIFY_CHANGE_DIRECTORY操作を完了します。

要件

要件
対象プラットフォーム ユニバーサル
Header fltkernel.h (Fltkernel.h を含む)
Library FltMgr.lib
[DLL] Fltmgr.sys
IRQL <= APC_LEVEL

こちらもご覧ください

FsRtlNotifyFilterReportChange

IRP_MJ_DIRECTORY_CONTROL

PFLT_PRE_OPERATION_CALLBACK