筛选器驱动程序的控制设备对象
注意
为了获得最佳可靠性和性能,请使用支持筛选器管理器的 文件系统微筛选器驱动程序 ,而不是旧的文件系统筛选器驱动程序。 若要将旧驱动程序移植到微筛选器驱动程序,请参阅 移植旧版筛选器驱动程序指南。
创建和使用命名控制设备对象需要文件系统, (CDO) 。 与文件系统不同,旧文件系统筛选器驱动程序不需要具有 CDO。 如果存在,则此(可选)命名的 CDO 表示系统的筛选器驱动程序。 其角色是接收来自用户模式应用程序的 I/O 请求, (或不太常见的是另一个内核模式驱动程序) ,并对其进行适当处理。
大多数文件系统筛选器驱动程序创建并使用 CDO。 但是,对 CDO 上的 I/O 请求的支持是可选的。 若要提供此支持,当筛选器驱动程序调用 IoCreateDevice 创建 CDO 时,它必须提供对象的设备名称。 然后,用户模式应用程序可以通过调用 CreateFile 来获取命名 CDO 的句柄,并提供设备名称的用户模式版本。
例如,请考虑假设的“MyLegacyFilter”内核模式驱动程序。 此驱动程序可以使用以下名称创建 CDO:
\Device\MyLegacyFilter
并调用 IoCreateSymbolicLink 将此名称链接到等效的用户模式可见名称。 完成此命名是为了 MyLegacyFilter 的用户模式应用程序可以通过提供名称来打开内核模式驱动程序的 CDO 的句柄:
\\.\MyLegacyFilter
调用 CreateFile 时。
发送到筛选器驱动程序的控制设备对象的 I/O 请求的类型
文件系统筛选器驱动程序无需支持控制设备对象上的任何 I/O 操作 (CDO) 。 但是,大多数筛选器允许将以下类型的 I/O 请求发送到筛选器的 CDO:
IRP_MJ_CREATE (打开目标设备对象的句柄,并将该句柄提供给用户应用程序)
IRP_MJ_CLEANUP (关闭目标设备对象的用户模式应用程序的句柄)
IRP_MJ_CLOSE (关闭目标设备对象的最后一个剩余打开句柄)
IRP_MJ_DEVICE_CONTROL、 IRP_MJ_FILE_SYSTEM_CONTROL 或 FastIoDeviceControl (将专用 IOCTL 或 FSCL 发送到筛选器驱动程序)
与文件系统筛选器驱动程序创建的所有其他设备对象不同,CDO 不会附加到驱动程序堆栈。 筛选器驱动程序的 CDO 上方或下方未附加任何设备对象。 因此,对于它收到的任何 I/O 请求,CDO 可以安全地假定它是唯一的预期接收方。 对于筛选器设备对象或文件系统 CDO,情况并非如此。 因此,CDO 最终必须完成它收到的每个 IRP。 对于快速 I/O 请求,它必须返回 TRUE 或 FALSE。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈