IRP_MJ_QUERY_INFORMATION (FS 和筛选器驱动程序)
发送时间
I/O 管理器、其他操作系统组件和其他内核模式驱动程序发送IRP_MJ_QUERY_INFORMATION请求。 例如,当用户模式应用程序调用 Win32 函数(如 GetFileInformationByHandle )或内核模式组件调用 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 枚举。
操作:网络重定向程序驱动程序
不基于 RDBSS 的网络重定向程序驱动程序接收 FileAllInformation 或 FileNameInformation 的IRP_MJ_QUERY_INFORMATION请求时,必须使用文件名的完整“\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 是指向调用方提供的输出缓冲区的可选指针,Irp-AssociatedIrp.SystemBuffer> 的内容在 I/O 完成期间由 I/O 管理器复制到该缓冲区中。 驱动程序不使用此缓冲区为请求返回任何数据。
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> 中指定的长度的有效地址。
Irp-AssociatedIrp.UserBuffer> 由 I/O 管理器在内部使用,不应由文件系统或文件系统筛选器驱动程序使用。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈