IRP_MJ_QUERY_INFORMATION (FS 和篩選驅動程式)
傳送時
I/O 管理員、其他作業系統元件和其他內核模式驅動程式會傳送IRP_MJ_QUERY_INFORMATION要求。 例如,當使用者模式應用程式呼叫 GetFileInformationByHandle 等 Win32 函式時,或核心模式元件已呼叫 ZwQueryInformationFile 時,可以傳送此要求。
作業:檔案系統驅動程式
文件系統驅動程式應該擷取和譯碼檔案物件,以判斷它是否代表開啟檔案或目錄的使用者。 如果這樣做,驅動程式應該處理查詢並完成 IRP。 否則,驅動程式應該適當地完成 IRP,而不需處理查詢。
可查詢的檔案和目錄資訊類型與檔案系統相依,但通常包含下列值:
- FileAllInformation
- FileAlternateNameInformation
- FileAttributeTagInformation
- FileBasicInformation
- FileCompressionInformation
- FileEaInformation
- FileInternalInformation
- FileNameInformation
- FileNetworkOpenInformation
- FilePositionInformation
- FileStandardInformation
- FileStreamInformation
- FileHardLinkInformation
雖然 FileAccessInformation、FileAlignmentInformation 和 FileModeInformation 資訊類型也可以當做參數傳遞至 ZwQueryInformationFile,但這項資訊與文件系統無關。 因此 ,ZwQueryInformationFile 會直接提供這項資訊,而不需傳送IRP_MJ_QUERY_INFORMATION要求給文件系統。
如需所有可能的信息類型清單,請參閱 ntifs.h 中的 FILE_INFORMATION_CLASS 列舉。
作業:網路重新導向器驅動程式
網络重新導向器驅動程式不是以接收 FileAllInformation 或 FileNameInformation IRP_MJ_QUERY_INFORMATION要求的 RDBSS 為基礎,必須在伺服器名稱前面加上單一前置反斜杠的檔名完整 “\server\share\file” 路徑回應。 必須針對以通用命名慣例 (UNC) 名稱 (\\server\share\folder\filename.txt存取的檔案傳回這個格式,例如,) 或位於對應磁碟驅動器 (x:\folder\filename.txt的檔案,例如) 。
對於網路迷你重新導向器驅動程式 (以動態方式連結 rdbss.sys 或以靜態方式連結 rdbsslib.lib) 的驅動程式,RDBSS 會處理 FileNameInformation 的IRP_MJ_QUERY_INFORMATION要求,並傳回正確的名稱資訊。 針對網路迷你重新導向器驅動程式,RDBSS 會針對要求的名稱資訊部分,處理 FileAllInformation 的IRP_MJ_QUERY_INFORMATION要求。 FileAllInformation 要求的其他部分會以個別的要求傳送給網路迷你重新導向器驅動程式,以解決此問題。
如果檔案的簡短名稱存在,則接收 FileAlternateNameInformation IRP_MJ_QUERY_INFORMATION要求的網路重新導向器應該以簡短名稱 (8.3 個字元) 來響應檔案。
作業:舊版文件系統篩選驅動程式
篩選驅動程式應該會將此 IRP 向下傳遞至堆疊上的下一個較低驅動程式。
參數
文件系統或篩選驅動程式會針對指定的 IRP 呼叫 IoGetCurrentIrpStackLocation ,以取得 IRP 中本身堆疊位置的指標。 在下列參數中, Irp 會指向 IRP , 而 IrpSp 指向 IO_STACK_LOCATION。 驅動程式可以使用下列 IRP 成員和 IRP 堆疊位置中設定的資訊來處理查詢檔案資訊要求:
DeviceObject 是目標裝置物件的指標。
Irp->AssociatedIrp.SystemBuffer 指向要傳回檔案或目錄信息的輸出緩衝區。 此資訊會儲存在下列其中一個結構中:
FILE_ALL_INFORMATION
FILE_ATTRIBUTE_TAG_INFORMATION
FILE_BASIC_INFORMATION
FILE_COMPRESSION_INFORMATION
FILE_EA_INFORMATION
FILE_INTERNAL_INFORMATION
FILE_NAME_INFORMATION
FILE_NETWORK_OPEN_INFORMATION
FILE_POSITION_INFORMATION
FILE_STANDARD_INFORMATION
FILE_STREAM_INFORMATION
FILE_LINKS_INFORMATION
Irp->IoStatus 指向接收最終完成狀態和所要求作業相關信息 的IO_STATUS_BLOCK 結構。 如需詳細資訊,請參閱 ZwQueryInformationFile 中的 IoStatusBlock 參數描述。 常規。
Irp->UserBuffer 是呼叫端提供的輸出緩衝區選擇性指標,I/O 管理員會在 I/O 完成期間複製 Irp-AssociatedIrp.SystemBuffer> 的內容。 驅動程式不會使用此緩衝區傳回要求的任何數據。
IrpSp->FileObject 指向與 DeviceObject 相關聯的檔案物件。
IrpSp-FileObject> 參數包含 RelatedFileObject 字段的指標,這也是FILE_OBJECT結構。 FILE_OBJECT結構的 RelatedFileObject 字段在處理IRP_MJ_QUERY_INFORMATION期間無效,不應使用。
IrpSp->MajorFunction 設定為 IRP_MJ_QUERY_INFORMATION。
IrpSp->Parameters.QueryFile.FileInformationClass 是要查詢的文件類型。 這個成員可以是下列其中一個值。
值 意義 FileAllInformation 傳回檔案的FILE_ALL_INFORMATION結構。 FileAttributeTagInformation 傳回檔案 的FILE_ATTRIBUTE_TAG_INFORMATION 結構。 FileBasicInformation 傳回檔案 的FILE_BASIC_INFORMATION 結構。 FileCompressionInformation 傳回檔案的FILE_COMPRESSION_INFORMATION結構。 FileEaInformation 傳回檔案的FILE_EA_INFORMATION結構。 FileInternalInformation 傳回檔案 的FILE_INTERNAL_INFORMATION 結構。 FileNameInformation 傳回檔案 的FILE_NAME_INFORMATION 結構。 FileNetworkOpenInformation 傳回檔案的單一 FILE_NETWORK_OPEN_INFORMATION 結構。 FilePositionInformation 傳回檔案的單一 FILE_POSITION_INFORMATION 結構。 FileStandardInformation 傳回檔案的單 一FILE_STANDARD_INFORMATION 結構。 FileStreamInformation 傳回檔案的單一 FILE_STREAM_INFORMATION 結構。 FileHardLinkInformation 傳回檔案 的FILE_LINKS_INFORMATION 結構。 IrpSp->Parameters.QueryFile.Length 是 Irp-AssociatedIrp.SystemBuffer> 所指向緩衝區的長度,以位元組為單位。
備註
I/O 管理員一律會緩衝IRP_MJ_QUERY_INFORMATION作業。 I/O 管理員會從非分頁集區內存配置 Irp-AssociatedIrp.SystemBuffer>,用來傳回要求的檔案或目錄資訊。 因此,操作系統所傳回的 Irp-AssociatedIrp.SystemBuffer> 一律是 IrpSp-Parameters.QueryFile.Length> 中所指定長度的有效位址。
I/O 管理員會在內部使用 Irp-AssociatedIrp.UserBuffer>,不應由文件系統或文件系統篩選驅動程式使用。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應