exAcquireSharedWaitForExclusive 函数 (wdm.h)

如果可以授予共享访问权限且没有排他服务员, ExAcquireSharedWaitForExclusive 例程将获取给定资源用于共享访问。

语法

BOOLEAN ExAcquireSharedWaitForExclusive(
  [in, out] PERESOURCE Resource,
  [in]      BOOLEAN    Wait
);

参数

[in, out] Resource

指向要获取用于共享访问的资源的指针。

[in] Wait

指定每当无法立即获取资源时例程的行为。 如果 为 TRUE,则调用方将进入等待状态,直到获取资源。 如果 为 FALSE,则无论是否可以获取资源,例程都会立即返回。

返回值

如果授予请求的访问权限或独占所有者释放资源,ExAcquireSharedWaitForExclusive 将返回 TRUE。 如果输入 WaitFALSE 且无法立即授予共享访问权限,则此例程返回 FALSE

注解

大多数驱动程序应使用 ExAcquireResourceSharedLite 而不是 ExAcquireSharedWaitForExclusive

调用方可以通过调用 ExReleaseResourceLiteExReleaseResourceForThreadLite 释放资源

如果无法立即授予共享访问权限,调用方可以等待其他线程获取并释放资源的独占所有权。

是否或何时向调用方授予对给定资源的共享访问权限取决于以下事项:

  • 如果资源当前是无所有者的,则会立即向当前线程授予共享访问权限。
  • 如果调用方已对资源具有独占访问权限,则以递归方式向当前线程授予相同类型的访问权限。
  • 如果资源当前作为共享拥有,并且没有等待获取独占访问权限的尝试,则会立即向调用方授予共享访问权限。
  • 如果资源当前作为共享拥有,但有等待获取独占访问权限的尝试,则调用方将置于等待状态 (Wait 设置为 TRUE) 或 ExAcquireSharedWaitForExclusive 返回 FALSE

    当当前线程等待获取资源,直到释放挂起的独占所有权后, ExAcquireSharedWaitForExclusive 将返回 TRUE 时,向当前线程授予对资源的共享访问权限并恢复执行。

ExAcquireSharedWaitForExclusive 的行为与 ExAcquireResourceSharedLite 的行为相同,除非调用线程已将资源作为共享拥有并且存在排他服务员。 在这种情况下, ExAcquireSharedWaitForExclusive 允许独占服务员获取资源的独占所有权。

如果调用方为 Wait 参数指定 TRUE,则调用方将阻止,直到另一个线程使用 ExReleaseResourceForThread 代表调用方释放资源。 驱动程序编写者必须小心,以确保另一个线程实际释放资源;否则调用方死锁。 ExAcquireResourceSharedLite 没有此属性,因此驱动程序应使用该例程,除非它们需要 ExAcquireSharedWaitForExclusive 的特定行为。

在调用此例程之前,必须禁用常规内核 APC 传递。 通过调用 KeEnterCriticalRegion 禁用正常的内核 APC 传递。 在释放资源之前,传递必须保持禁用状态,此时可以通过调用 KeLeaveCriticalRegion 重新启用它。 有关详细信息,请参阅 禁用 APC

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlExApcLte3 (wdm) SpNoWait (storport) WithinCriticalRegion (storport) 、WithinCriticalRegion (storport) 、 WithinCriticalRegion (wdm)

另请参阅

ExAcquireResourceSharedLite

ExAcquireSharedStarveExclusive

ExConvertExclusiveToSharedLite

ExGetExclusiveWaiterCount

ExIsResourceAcquiredExclusiveLite

ExIsResourceAcquiredSharedLite

ExReleaseResourceForThread