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 例程, FsContext 會當做 NotifyContext 參數傳遞至該例程。

[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

要傳遞至 TraverseCallbackSECURITY_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 IRP_MJ_DIRECTORY_CONTROL、次要函式程式代碼IRP_MN_NOTIFY_CHANGE_DIRECTORY。

文件系統會呼叫 FsRtlNotifyFilterChangeDirectory 來建立通知結構來保存 IRP,並將通知結構新增至目前磁碟區的通知清單。

如果 NotifyIrpNULL,FsRtlNotifyFilterChangeDirectory 會檢查通知清單是否已經包含任何符合指定 FsContext 值之檔案對象的擱置 IRP,如果是的話,請完成具有STATUS_DELETE_PENDING的 IRP。

如果 NotifyIrp 不是 NULL,FsRtlNotifyFilterChangeDirectory 會執行下列動作:

  • 檢查 IRP 的檔案物件是否已進行清除。 若是如此, FsRtlNotifyFilterChangeDirectory 會以狀態STATUS_NOTIFY_CLEANUP完成 IRP,且不會將其新增至通知清單。

  • 如果 IRP 的檔案物件尚未進行清除, FsRtlNotifyFilterChangeDirectory 會檢查通知清單是否已經包含指定 FsContext 值的通知結構。 如果找到這類通知結構,而且有待處理的報表變更, FsRtlNotifyFilterChangeDirectory 就會完成 NotifyIrp。 如果找到通知結構,但沒有要報告的擱置變更, FsRtlNotifyFilterChangeDirectory 會將 NotifyIrp 指向的 IRP 標示為擱置中,並將它插入通知結構中的通知 IRP 清單中。 如果找不到這類通知結構, FsRtlNotifyFilterChangeDirectory 會將 NotifyIrp 指向的 IRP 標示為擱置中、建立通知結構,然後將它插入通知清單中。

當目錄發生變更時,文件系統會呼叫 FsRtlNotifyFilterReportChange 來完成通知清單中的擱置IRP_MN_NOTIFY_CHANGE_DIRECTORY要求。

規格需求

需求
最低支援的用戶端 Windows 2000 SP4 更新匯總;Windowsxp
目標平台 Universal
標頭 ntifs.h (包含 Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL < APC_LEVEL
DDI 合規性規則 HwStorPortProhibitedDDIs (storport) PowerIrpDDis (wdm)

另請參閱

FsRtlNotifyFilterReportChange

FsRtlNotifyFullChangeDirectory

FsRtlNotifyFullReportChange

IRP_MJ_DIRECTORY_CONTROL

SECURITY_SUBJECT_CONTEXT