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
返回值
没有
言论
此例程在 Windows 7 及更高版本的 Windows作系统中可用。
ExSetResourceOwnerPointerEx 使充当资源管理器的线程能够将已获取的执行资源的所有权转移到另一个线程,然后使用该资源。 执行资源由 ERESOURCE 结构表示。
调用方必须将 OwnerPointer 的两个最小有效位 参数值设置为 1。 作系统在内部使用这些位来区分由 ExSetResourceOwnerPointerEx 调用所设置的所有者指针,该线程通过调用 ExAcquireResourceExclusiveLite 或 ExAcquireResourceSharedLite 例程来获取资源。
调用 ExSetResourceOwnerPointerEx 以转移资源的所有权的线程必须是以前调用 ExAcquireResourceXxxLite 例程来获取资源的线程。
如果资源管理器线程获取了资源进行独占访问(通过调用 ExAcquireResourceExclusiveLite),则 ExSetResourceOwnerPointerEx 调用将独占访问所有权转让给资源用户线程。 如果资源管理器线程获取了共享访问的资源(通过调用 ExAcquireResourceSharedLite),则 ExSetResourceOwnerPointerEx 调用将共享访问所有权转移到资源用户线程。
当资源用户线程不再需要资源时,应释放资源。 通常,资源用户线程释放资源。 为此,它必须调用 ExReleaseResourceForThreadLite 例程。 在此调用中,ThreadId 参数值必须与 OwnerPointer 参数(包括前 ExSetResourceOwnerPointerEx 中的两个最小有效位)的值匹配, 调用转移资源的所有权。
ExSetResourceOwnerPointerEx 调用转移资源的所有权后,驱动程序可调用指定资源的唯一 ERESOURCE 例程 是 ExReleaseResourceForThreadLite。 尝试调用另一个 ERESOURCE 例程(例如,ExReleaseResourceLite),这是一个错误。
ExSetResourceOwnerPointerEx 可以在两种明显不同的模式下运行。 模式由 标志 参数指定。 若要选择这两种模式的用途更通用,请设置 标志 = FLAG_OWNER_POINTER_IS_THREAD。 此 标志 值通知作系统,OwnerPointer 参数是指向资源管理器线程的线程对象的指针。 如有必要,作系统可以使用此信息暂时提升此线程的优先级,以避免优先级反转。 若要获取用于 OwnerPointer 值的线程对象指针,驱动程序可以调用 ExGetCurrentResourceThread 例程。 请记住将 OwnerPointer 的两个最小有效位 值设置为 1。
如果 标志 为零,则 ExSetResourceOwnerPointerEx 的行为与旧版 ExSetResourceOwnerPointer 例程的行为相同,该例程在 Windows 2000 及更高版本的 Windows作系统中可用。 也就是说,OwnerPointer 参数指向资源管理器线程在调用 ExSetResourceOwnerPointerEx之前在系统内存中分配的存储对象。 在这种情况下,对象类型和值不相关,因为 ExSetResourceOwnerPointerEx 不会尝试访问对象本身。 相反,例程只是使用对象的内存地址来标识资源所有者。 对象的存储必须以内存中的偶数四字节边界开始。 为了防止两个驱动程序无意中同时使用同一所有者指针,在释放资源之前,资源管理器线程不得释放对象的存储。
有关管理执行资源的详细信息,请参阅 ERESOURCE 例程 简介。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 在 Windows 7 及更高版本的 Windows作系统中可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport) |
另请参阅
ExAcquireResourceExclusiveLite