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。
调用方可以通过调用 ExReleaseResourceLite 或 ExReleaseResourceForThreadLite释放资源。
如果无法立即授予共享访问权限,调用方可以等待其他线程获取和释放资源的独占所有权。
是否或何时向调用方提供对给定资源的共享访问权限取决于以下情况:
- 如果资源当前未拥有,则立即向当前线程授予共享访问权限。
- 如果调用方已具有对资源的独占访问权限,则以递归方式向当前线程授予相同的访问权限类型。
- 如果资源当前作为共享拥有,并且没有等待获取独占访问权限的尝试,则立即向调用方授予共享访问权限。
-
如果资源当前作为共享拥有,但存在获取独占访问权限的挂起尝试,则调用方要么处于等待状态(Wait 设置为 TRUE),要么 ExAcquireSharedWaitForExclusive 返回 FALSE。
当当前线程等待获取资源,直到释放挂起的独占所有权后,ExAcquireSharedWaitForExclusive 在向当前线程授予对资源的共享访问权限并恢复执行时返回 TRUE。
如果调用方为 Wait 参数指定 TRUE,则调用方将阻止,直到另一个线程代表调用方释放资源,ExReleaseResourceForThread。 驱动程序编写器必须小心,以确保另一个线程实际释放资源;否则,调用方已死锁。 ExAcquireResourceSharedLite 没有此属性,因此驱动程序应使用该例程,除非它们需要 ExAcquireSharedWaitForExclusive的特定行为。
在调用此例程之前,必须禁用正常的内核 APC 传递。 通过调用 KeEnterCriticalRegion禁用正常的内核 APC 传递。 在释放资源之前,传递必须保持禁用状态,此时可以通过调用 KeLeaveCriticalRegion重新启用它。 有关详细信息,请参阅 禁用 APC。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport), IrqlExApcLte3(wdm), SpNoWait(storport), WithinCriticalRegion(storport), WithinCriticalRegion(storport), WithinCriticalRegion(wdm) |
另请参阅
ExAcquireSharedStarveExclusive
ExConvertExclusiveToSharedLite
ExIsResourceAcquiredExclusiveLite