使用 TmXxx 例程

大多数 KTM 例程使用 ZwXxx 的命名格式。 这些例程基于句柄。 也就是说,至少有一个输入或输出参数是 KTM 对象的句柄。

KTM 还提供使用 TmXxx 命名格式的较少例程。 这些例程基于指针。 其输入或输出参数中至少有一个是指向 KTM 对象的指针。

某些 TmXxx 例程复制 ZwXxx 例程。 其他 TmXxx 例程没有 ZwXxx 等效项。

在大多数情况下,应使用 ZwXxx 例程。 但在以下情况下,应使用 TmXxx 例程:

  • 资源管理器使用 ResourceManagerNotification 回调例程,该例程提供指向登记对象的指针,而不是句柄。

    可以将登记对象指针传递给登记对象的 TmXxx 例程。

  • 事务处理系统 (TPS) 组件对 KTM 执行许多快速调用,这可能会导致系统性能太慢。

    在这种情况下,组件可以调用 ObReferenceObjectByHandle ,将每个 KTM 对象句柄转换为指针,保存指针,然后将指针传递到 TmXxx 例程。 此转换无需 KTM 在每次调用 ZwXxx 例程时在内部将每个句柄转换为指针。

    每次调用 ObReferenceObectByHandle 都应包含一个访问掩码,其中包含相应的 KTM 定义的标志。 KTM 的创建和打开例程的参考页上介绍了这些标志。

    当组件使用完 KTM 对象后,它必须通过调用 ObDereferenceObjectDeferDeleteObDereferenceObject 取消引用对象。

    • 如果组件或驱动程序堆栈中的任何其他组件持有系统提供的任何锁,例如旋转锁、互斥对象或快速互斥锁,则必须使用 ObDereferenceObjectDeferDelete

    • 如果确定驱动程序堆栈上没有组件包含系统提供的锁,则可以使用 ObDereferenceObject

    如果组件在保留锁时调用 ObDereferenceObject ,则可能会出现死锁,因为 KTM 可能还持有对象命名空间的锁。 此外,与调用 ZwQueryInformationTransaction 相比,组件可以调用 TmGetTransactionId 来快速获取事务的标识符。

  • 必须具有 ZwXxx 例程不提供的功能。

    具体而言,资源管理器可以调用以下例程: