IRP_MJ_DIRECTORY_CONTROL (FS 和篩選驅動程式)
傳送時
I/O 管理員、其他作業系統元件和其他核心模式驅動程式會傳送IRP_MJ_DIRECTORY_CONTROL要求。 例如,當使用者模式應用程式呼叫 Win32 函式,例如 ReadDirectoryChangesW 或 FindNextVolumeMountPoint,或核心模式元件稱為 ZwQueryDirectoryFile 或 ZwQueryDirectoryFileEx 時,可以傳送它。
作業:檔案系統驅動程式
文件系統驅動程式應該檢查次要函式程式碼,以判斷要求哪些目錄控制作業。 以下是有效的次要函式代碼:
程式碼 | 描述 |
---|---|
IRP_MN_QUERY_DIRECTORY | 指出目錄查詢要求。 可查詢的信息類型取決於文件系統,但通常包含下列值:FileBothDirectoryInformation、FileDirectoryInformation、FileFullDirectoryInformation、FileIdBothDirectoryInformation、FileIdFullDirectoryInformation、FileNamesInformation、FileObjectIdInformation、FileReparsePointInformation。 |
IRP_MN_NOTIFY_CHANGE_DIRECTORY | 指出要求通知目錄的變更。 通常,文件系統驅動程式通常會在私人佇列中保存 IRP,而不是立即滿足此要求。 當目錄發生變更時,文件系統驅動程式會執行通知,並排入佇列並完成 IRP。 檔系統驅動程式會傳回 FILE_NOTIFY_INFORMATION 結構中的資訊。 |
IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX | 指出要求通知目錄的變更。 通常,文件系統驅動程式通常會在私人佇列中保存 IRP,而不是立即滿足此要求。 當目錄發生變更時,文件系統驅動程式會執行通知,並排入佇列並完成 IRP。 文件系統驅動程式會根據指定的 IrpSp-Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass> 傳回資訊。 |
注意
FileQuotaInformation 資訊類別已過時。 應該改用IRP_MJ_QUERY_QUOTA。
文件系統驅動程式在執行要求的作業之後,應該完成 IRP。
作業:舊版文件系統篩選驅動程式
篩選驅動程式必須將此 IRP 向下傳遞至堆疊上的下一個較低驅動程式。
參數
文件系統或篩選驅動程式會針對指定的 IRP 呼叫 IoGetCurrentIrpStackLocation ,以取得 IRP 中本身堆疊位置的指標。 在下列參數中, Irp 指向 IRP , 而 IrpSp 指向 IO_STACK_LOCATION。 驅動程式可以使用下列 IRP 成員中設定的資訊,以及 IRP 堆疊位置中設定的資訊來處理目錄控制件要求。
DeviceObject 是目標裝置物件的指標。
Irp->AssociatedIrp.SystemBuffer 指向 IO_STATUS_BLOCK結構, 該結構會接收最終完成狀態和所要求作業的相關信息。
Irp->UserBuffer 指向呼叫端提供的輸出緩衝區,以接收目錄內容的要求資訊。
IrpSp->FileObject 指向與 DeviceObject 相關聯的檔案物件。
IrpSp-FileObject> 參數包含 RelatedFileObject 字段的指標,這也是FILE_OBJECT結構。 FILE_OBJECT 結構的 RelatedFileObject 字段在處理IRP_MJ_DIRECTORY_CONTROL期間無效,不應使用。
IrpSp->旗標 可以設定為下列一或多個IRP_MN_QUERY_DIRECTORY值。
旗標 | 意義 |
---|---|
SL_INDEX_SPECIFIED | 開始掃描目錄中索引由 IrpSp-Parameters.QueryDirectory.FileIndex> 提供的專案。 |
SL_RESTART_SCAN | 在目錄中的第一個項目開始掃描。 如果未設定此旗標,請從先前的IRP_MN_QUERY_DIRECTORY要求繼續掃描。 |
SL_RETURN_SINGLE_ENTRY | 只傳回找到的第一個專案。 |
SL_RETURN_ON_DISK_ENTRIES_ONLY | 指示執行目錄虛擬化或 Just-In-Time 擴充的任何篩選,只將要求傳遞至文件系統,並傳回目前位於磁碟上的專案。 |
您可以針對IRP_MN_NOTIFY_CHANGE_DIRECTORY設定下列旗標:
旗標 | 意義 |
---|---|
SL_WATCH_TREE | 如果也應該監看此目錄的所有子目錄,請將 設定為 TRUE 。 如果只有目錄本身要監看,則設定為 FALSE 。 |
IrpSp->MajorFunction 設定為 IRP_MJ_DIRECTORY_CONTROL。
IrpSp->MinorFunction 可以設定為下列其中一個值。
- IRP_MN_QUERY_DIRECTORY
- IRP_MN_NOTIFY_CHANGE_DIRECTORY
- IRP_MN_NOTIFY_CHANGE_DIRECTORY_EX
IrpSp->Parameters.QueryDirectory.FileIndex 是開始目錄掃描之檔案的索引。 如果未設定SL_INDEX_SPECIFIED旗標,則會忽略此值。 此參數無法在任何 Win32 函式或核心模式支援例程中指定。 目前只有 NT 虛擬 DOS 電腦 (NTVDM) 才使用,只有 32 位 NT 型平臺上存在。 檔案索引未定義給文件系統,例如NTFS,其中父目錄中的檔案位置並未固定,而且可以隨時變更以維護排序順序。
IrpSp->Parameters.QueryDirectory.FileInformationClass 設定為下列其中一個值。
值 意義 FileBothDirectoryInformation 傳回每個檔案 的FILE_BOTH_DIR_INFORMATION 結構。 FileDirectoryInformation 傳回每個檔案 的FILE_DIRECTORY_INFORMATION 結構。 FileFullDirectoryInformation 傳回每個檔案 的FILE_FULL_DIR_INFORMATION」結構。 FileIdBothDirectoryInformation 傳回每個檔案 的FILE_ID_BOTH_DIR_INFORMATION 結構。 FileIdFullDirectoryInformation 傳回每個檔案 的FILE_ID_FULL_DIR_INFORMATION 結構。 FileNamesInformation 傳回每個檔案 的FILE_NAMES_INFORMATION 結構。 FileObjectIdInformation 傳回每個檔案 的FILE_OBJECTID_INFORMATION 結構。 FileQuotaInformation 已過時。 請改用 IRP_MJ_QUERY_QUOTA 。 FileReparsePointInformation 傳回目錄的單一 FILE_REPARSE_POINT_INFORMATION 結構。 IrpSp->Parameters.QueryDirectory.FileName 是指定目錄中檔案的選擇性名稱。
IrpSp->Parameters.QueryDirectory.Length 是 Irp-UserBuffer> 所指向之緩衝區的位元組長度。
IrpSp->Parameters.NotifyDirectory.Length 是 Irp-UserBuffer> 所指向之緩衝區的位元組長度。
IrpSp->Parameters.NotifyDirectory.CompletionFilter:如需詳細資訊,請參閱 FsRtlNotifyFullChangeDirectory 的 CompletionFilter 參數描述。
IrpSp->Parameters.NotifyDirectoryEx.Length 是 Irp-UserBuffer> 所指向之緩衝區的位元組長度。
IrpSp->Parameters.NotifyDirectoryEx.CompletionFilter:如需詳細資訊,請參閱 FsRtlNotifyFullChangeDirectory 的 CompletionFilter 參數描述。
IrpSp->Parameters.NotifyDirectoryEx.DirectoryNotifyInformationClass 是下列其中一個值。
值 意義 DirectoryNotifyInformation 傳回目錄變更 FILE_NOTIFY_INFORMATION 結構。 DirectoryNotifyExtendedInformation 傳回每個目錄變更 的FILE_NOTIFY_EXTENDED_INFORMATION 結構。 DirectoryNotifyFullInformation 傳回每個目錄變更 的FILE_NOTIFY_FULL_INFORMATION 結構。
另請參閱
FILE_REPARSE_POINT_INFORMATION
FsRtlNotifyFullChangeDirectory
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應