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、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 | 指示执行目录虚拟化或实时扩展的任何筛选器仅将请求传递到文件系统,并返回当前位于磁盘上的条目。 |
可以为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 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈