PREFETCH_OPEN_ECP_CONTEXT结构 (ntifs.h)

PREFETCH_OPEN_ECP_CONTEXT 结构传达预提取程序是否对文件执行给定的打开请求。

语法

typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
  PVOID Context;
} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;

成员

Context

指向与打开请求关联的不透明上下文的指针。

言论

预提取程序是操作系统的一个组件,它与缓存管理器和内存管理器紧密集成,使磁盘访问更高效,从而提高性能。 如果其他组件干扰预提取器,则系统性能会降低,并且可能会死锁。 因此,预提取程序将 PREFETCH_OPEN_ECP_CONTEXT 结构附加到文件,以传达预提取程序对该文件执行了打开的请求。 预提取程序在调用 FltCreateFileEx2IoCreateFileEx 例程中使用 GUID_ECP_PREFETCH_OPEN GUID 来附加 PREFETCH_OPEN_ECP_CONTEXT 结构。 文件系统筛选器驱动程序(筛选器)可以调用 FltFindExtraCreateParameter 来确定 PREFETCH_OPEN_ECP_CONTEXT 是否已附加到该文件,然后采取适当的措施。 筛选器应调用 FltIsEcpFromUserMode 例程,以确定 PREFETCH_OPEN_ECP_CONTEXT 上下文结构是否源自内核模式。 为了防止恶意应用程序欺骗预提取器,如果筛选器源自用户模式,则不应接受 PREFETCH_OPEN_ECP_CONTEXT

预提取程序将 PREFETCH_OPEN_ECP_CONTEXT 结构附加到文件后,该文件的所有其他预提取活动都涉及已附加 PREFETCH_OPEN_ECP_CONTEXT 的文件对象。 如果筛选器必须标识除创建请求以外的预提取文件系统请求,筛选器应维护其自己的状态(例如,筛选器管理器处理上下文)。 筛选器维护其自己的状态,以确定特定文件对象是否为预提取文件对象。

内存管理器可以缓存预提取文件对象。 然后,内存管理器可以使用预提取文件对象对使用缓存管理器执行映射 I/O 或缓存 I/O 的其他应用程序。 因此,预提取文件对象可用于在预提取器关闭其句柄之前或之后对 I/O 进行分页。 此分页 I/O 可以包括分页写入,即使预提取器永远不会写入任何数据。 分页写入由其他应用程序生成。 内存管理器使用其缓存的预提取文件对象从应用程序写入数据。 因此,筛选器执行由分页写入触发的工作,即使分页写入位于预提取文件对象上,筛选器仍应执行该工作。

当筛选器确定在预提取文件对象上发生清理操作时,筛选器不应再将该文件对象视为预提取打开。

以下是预提取器执行的常见操作(但是,在这些操作中,预提取器永远不会更改文件内容):

  • 卷打开并关闭
  • 文件打开并关闭
  • 查询文件信息
  • 设置文件信息(仅指示文件系统不更新此打开的上次访问时间)
  • 创建映像和数据部分
  • 执行异步分页 I/O

为了避免出现可能的死锁情况,筛选器应:

  • 从不阻止任何预提取操作。
  • 在不发出其他文件系统请求的情况下传递预提取操作。

要使任何应用程序或驱动程序能够访问正在预提取的任何数据,它必须打开文件自己的句柄或创建一个节或两者。

有关如何使用 ECP 将其他信息与文件上的 IRP_MJ_CREATE 操作相关联的信息,请参阅 将额外创建参数与IRP_MJ_CREATE操作

PREFETCH_OPEN_ECP_CONTEXT 结构为只读。 应使用它来检索有关预提取器打开 ECP 的信息。 有关此问题的详细信息,请参阅 System-Defined ECP

要求

要求 价值
最低支持的客户端 Windows Vista
标头 ntifs.h (include Ntifs.h)

另请参阅

FltCreateFileEx2

FltIsEcpFromUserMode

IoCreateFileEx