ExSetResourceOwnerPointerEx 函数 (wdm.h)

ExSetResourceOwnerPointerEx 例程将执行资源的所有权从调用线程转移到所有者指针,所有者指针是标识资源所有者的系统地址。

语法

void ExSetResourceOwnerPointerEx(
  [in, out] PERESOURCE Resource,
  [in]      PVOID      OwnerPointer,
  [in]      ULONG      Flags
);

参数

[in, out] Resource

指向执行资源的指针 (调用线程拥有的不透明的 ERESOURCE 结构) 。 调用方之前分配了此结构,并通过调用 ExInitializeResourceLite 例程对其进行初始化。 有关更多信息,请参见下面的“备注”部分。

[in] OwnerPointer

标识资源所有者的指针值。 此参数值在名义上是指向类型为 ERESOURCE_THREAD 但转换为 PVOID 类型的值的指针。 调用方必须将此指针值的两个最低有效位设置为一个有效位。 有关更多信息,请参见下面的“备注”部分。

[in] Flags

一组可以修改此例程操作的标志。 将此参数设置为零或设置为以下标志值:

  • FLAG_OWNER_POINTER_IS_THREAD
如果 Flags = FLAG_OWNER_POINTER_IS_THREAD, 则 OwnerPointer 必须指向 ERESOURCE_THREAD 类型的值,该值是指向不透明线程对象的指针。 如果 Flags = 0, 则 OwnerPointer 必须指向系统内存中的存储对象,该存储对象在释放资源之前保持分配状态。 有关更多信息,请参见下面的“备注”部分。

返回值

备注

此例程在 Windows 7 及更高版本的 Windows 操作系统中可用。

ExSetResourceOwnerPointerEx 使充当资源管理器的线程可以将该线程已获取的执行资源的所有权转移到另一个线程,后者随后使用该资源。 执行资源由 ERESOURCE 结构表示。

调用方必须将 OwnerPointer 参数值的两个最小有效位设置为一个有效位。 操作系统在内部使用这些位来区分已通过调用 ExAcquireResourceExclusiveLite 或 ExAcquireResourceSharedLite 例程获取资源的线程中的 ExSetResourceOwnerPointerEx 调用设置所有者指针。

调用 ExSetResourceOwnerPointerEx 来转移资源所有权的线程必须是以前调用 ExAcquireResourceXxxLite 例程以获取资源的线程。

如果资源管理器线程通过调用 ExAcquireResourceExclusiveLite) (获取了用于独占访问的资源, 则 ExSetResourceOwnerPointerEx 调用会将独占访问权限所有权转移到资源用户线程。 如果资源管理器线程通过调用 ExAcquireResourceSharedLite) 获取了共享访问 (的资源, 则 ExSetResourceOwnerPointerEx 调用会将共享访问所有权转移到资源用户线程。

当资源用户线程不再需要资源时,应释放该资源。 通常,资源用户线程释放资源。 为此,它必须调用 ExReleaseResourceForThreadLite 例程。 在此调用中, ThreadId 参数值必须与 OwnerPointer 参数的值匹配, (包括前一个 ExSetResourceOwnerPointerEx 调用中) 转移资源所有权的两个最小有效位。

在 ExSetResourceOwnerPointerEx 调用转移资源的所有权后,驱动程序可为指定资源调用的唯一其他 ERESOURCE 例程ExReleaseResourceForThreadLite。 尝试为此资源调用另一个 ERESOURCE 例程(如 ExReleaseResourceLite)是错误的。

ExSetResourceOwnerPointerEx 可以在两种截然不同的模式下运行。 模式由 Flags 参数指定。 若要选择这两种模式中更通用的模式,请设置 Flags = FLAG_OWNER_POINTER_IS_THREAD。 此 Flags 值通知操作系统 OwnerPointer 参数是指向资源管理器线程的线程对象的指针。 如有必要,操作系统可以使用此信息暂时提升此线程的优先级,以避免优先级反转。 若要获取要用于 OwnerPointer 值的线程对象指针,驱动程序可以调用 ExGetCurrentResourceThread 例程。 请记住将 OwnerPointer 值的两个最小有效位设置为一个有效位。

如果 Flags 为零, 则 ExSetResourceOwnerPointerEx 的行为与旧版 ExSetResourceOwnerPointer 例程的行为相同,后者在 Windows 2000 及更高版本的 Windows 操作系统中可用。 也就是说, OwnerPointer 参数指向资源管理器线程在调用 ExSetResourceOwnerPointerEx 之前在系统内存中分配的存储对象。 在这种情况下,对象类型和值不相关,因为 ExSetResourceOwnerPointerEx 不会尝试访问对象本身。 相反,例程只使用 对象的内存地址来标识资源所有者。 对象的存储必须从内存中的偶数 4 字节边界开始。 若要防止两个驱动程序无意中同时使用同一所有者指针,资源管理器线程在释放资源之前不得释放对象的存储。

有关管理高管资源的详细信息,请参阅 ERESOURCE 例程简介

要求

要求
最低受支持的客户端 适用于 Windows 7 及更高版本的 Windows 操作系统。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport)

另请参阅

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer