RX_CONTEXT和 IRP 管理

RX_CONTEXT结构是 RDBSS 和网络微型重定向程序用来管理 I/O 请求数据包(IRP)的基本数据结构之一。 RX_CONTEXT结构描述处理 IRP 时 IRP,并包含允许在 IRP 完成后释放全局资源的状态信息。 RX_CONTEXT数据结构封装 IRP 供 RDBSS、网络微型重定向器和文件系统使用。 RX_CONTEXT结构包括指向单个 IRP 的指针以及处理 IRP 所需的所有上下文。

RX_CONTEXT结构有时称为 Windows 驱动程序工具包(WDK)头文件中的 IRP 上下文或 RxContext,以及用于开发网络微型重定向程序驱动程序的其他资源。

RX_CONTEXT是附加各种网络微型重定向程序提供的其他信息的数据结构。 从设计的角度来看,可以通过以下几种方式之一处理此附加信息:

  • 允许将上下文指针定义为RX_CONTEXT的一部分,网络微型重定向程序使用该指针来存储其信息。 这意味着,每当分配和销毁RX_CONTEXT结构时,网络微型重定向程序驱动程序都必须对包含其他网络微型重定向程序信息的内存块执行单独的关联分配或销毁。 由于RX_CONTEXT结构以大量方式创建和销毁,因此从性能的角度来看,这不是可接受的解决方案。

  • 另一种方法是通过为每个网络微型重定向程序预先指定的量分配每个RX_CONTEXT结构的大小,然后保留供微型重定向程序使用。 这种方法可以避免额外的分配和销毁,但会使 RDBSS 中的RX_CONTEXT管理代码复杂化。

  • 第三种方法包括分配预先指定的区域,对于每个RX_CONTEXT的一部分,所有网络微型重定向器都是相同的。 这是一个未格式化的区域,其中任何所需结构都可以由各种网络微型重定向程序施加。 这种方法克服了与以前方法相关的缺点。 这是 RDBSS 中当前实现的方法。

第三种方法是 RDBSS 使用的方案。 因此,网络微型重定向程序驱动程序的开发人员应尝试并定义关联的专用上下文,以适应RX_CONTEXT数据结构中定义的此预定义区域。 违反此规则的网络微型重定向程序驱动程序将产生显著的性能损失。

由网络微型重定向程序导出的许多 RDBSS 例程和例程都引用了启动线程或例程使用的一些其他线程中的RX_CONTEXT结构。 因此,对RX_CONTEXT结构进行引用计数,以管理其用于异步作的用途。 当引用计数变为零时,可以在最后一次取消引用作上完成并释放RX_CONTEXT结构。

RDBSS 提供了许多例程,这些例程用于作RX_CONTEXT结构和关联的 IRP。 这些例程用于分配、初始化和删除RX_CONTEXT结构。 这些例程还用于完成与RX_CONTEXT关联的 IRP,并为RX_CONTEXT设置取消例程。

以下例程作RX_CONTEXT结构:

常规 说明

RxCompleteRequest

此例程用于完成与RX_CONTEXT结构关联的 IRP。 此例程由 RDBSS 在内部使用,不应由网络微型重定向程序使用。

RxCompleteRequest_Real

此例程用于完成与RX_CONTEXT结构关联的 IRP。 此例程由 RDBSS 在内部使用,不应由网络微型重定向程序使用。

RxCreateRxContext

此例程分配新的RX_CONTEXT结构并初始化数据结构。

RxDereferenceAndDeleteRxContext_Real

此例程取消引用RX_CONTEXT结构,如果引用计数为零,则会解除分配并从 RDBSS 内存中数据结构中删除指定的RX_CONTEXT结构。

RxInitializeContext

此例程初始化新分配RX_CONTEXT结构。

RxPrepareContextForReuse

此例程通过重置以前所做的所有特定于作的分配和购置来准备RX_CONTEXT结构以供重复使用。 不会修改从 IRP 获取的参数。 此例程由 RDBSS 在内部使用,不应由网络微型重定向程序使用。

RxResumeBlockedOperations_Serially

此例程在序列化的阻塞 I/O 队列上唤醒下一个等待线程(如果有)。

RxSetMinirdrCancelRoutine

该例程为RX_CONTEXT结构设置网络微型重定向程序取消例程。

__RxSynchronizeBlockingOperations

此例程用于将阻止 I/O 同步到同一工作队列。 RDBSS 在内部使用此例程来同步命名管道作。 网络微型重定向程序可以使用此例程来同步由网络微型重定向程序维护的单独队列上的作。

例程仅在 Windows Server 2003 上可用。

__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock

此例程用于将阻止 I/O 同步到同一工作队列。 RDBSS 在内部使用此例程来同步命名管道作。 网络微型重定向程序可以使用此例程来同步由网络微型重定向程序维护的单独队列上的作。

例程仅在 Windows XP 和 Windows 2000 上可用。

以下宏在 rxcontx.h 头文件中定义,该文件调用上表中列出的例程。 通常使用这些宏,而不是直接调用这些例程。

Macro 说明

RxSynchronizeBlockingOperationsRXCONTEXTFCBIOQUEUE

此宏将阻止 I/O 请求同步到同一工作队列。 在 Windows Server 2003 上,此宏调用 __RxSynchronizeBlockingOperations 例程,DropFcbLock 参数设置为 FALSE

在 Windows XP 和 Windows 2000 上,此宏调用 __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock 例程,DropFcbLock 参数设置为 FALSE

RxSynchronizeBlockingOperationsRXCONTEXTFCBIOQUEUE

此宏将阻止 I/O 请求同步到同一工作队列。 在 Windows Server 2003 上,此宏调用 __RxSynchronizeBlockingOperations 例程,DropFcbLock 参数设置为 TRUE

在 Windows XP 和 Windows 2000 上,此宏调用 __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock 例程,并将 DropFcbLock 参数设置为 TRUE