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 的信息。 有关此问题的详细信息,请参阅 系统定义的 ECP

要求

要求
最低受支持的客户端 Windows Vista
标头 ntifs.h (包括 Ntifs.h)

另请参阅

FltCreateFileEx2

FltIsEcpFromUserMode

IoCreateFileEx