NdisAcquireRWLockRead 函数 (ndis.h)

NdisAcquireRWLockRead 函数获取调用方用于读取对驱动程序线程之间共享的资源的读取访问权限的读取锁。

语法

void NdisAcquireRWLockRead(
  [in]  PNDIS_RW_LOCK_EX Lock,
  [out] PLOCK_STATE_EX   LockState,
  [in]  UCHAR            Flags
);

参数

[in] Lock

指向表示锁的不透明 NDIS_RW_LOCK_EX 变量的指针。 调用方可以使用此锁来获取对非 ISR 驱动程序线程之间共享的资源的写入或读取访问权限。

[out] LockState

指向跟踪锁状态的不透明 LOCK_STATE_EX 变量的指针。 此变量存在于调用方获取和释放锁的时间间隔内。 调用方必须对从同一非 ISR 驱动程序线程获取锁的每个尝试使用不同的类型 LOCK_STATE_EX 变量。

[in] Flags

包含锁标志的 ULONG 值。 如果调用方当前的 IRQL DISPATCH_LEVEL,请将此参数设置为 NDIS_RWL_AT_DISPATCH_LEVEL。 否则,请将此参数设置为零。 有关调度 IRQL 跟踪的详细信息,请参阅 调度 IRQL 跟踪

注意 如果调用方知道当前 IRQL DISPATCH_LEVEL,请将此参数设置为 NDIS_RWL_AT_DISPATCH_LEVEL。 此标志使锁更加高效,因为它会省略当前 IRQL 的检查。 如果当前 IRQL 未知,请不要使用 KeGetCurrentIrql 测试当前 IRQL,以确定是否设置此标志,因为允许 NdisAcquireRWLockRead 函数测试 IRQL 本身更有效。
 

返回值

没有

言论

NDIS 驱动程序调用 NdisAcquireRWLockRead 函数,以获取对驱动程序线程之间共享的资源的只读访问权限。

驱动程序必须先使用 NdisAllocateRWLock 函数分配类型 NDIS_RW_LOCK_EX 变量,然后驱动程序才能调用 NdisAcquireRWLockRead 函数。

驱动程序调用 NdisAllocateRWLock后,它可以调用 NdisAcquireRWLockWriteNdisAcquireRWLockRead 以获取对资源的写入或读取访问权限。 一次只能有一个非 ISR 驱动程序线程获取对资源的写入访问权限。 当一个非 ISR 线程具有写入访问权限时,其他非 ISR 线程的所有读取和写入访问都必须等待,直到写入访问持有者释放锁。 但是,如果非 ISR 线程具有读取访问权限,则其他非 ISR 线程可以同时获取读取访问权限。

NDIS_RW_LOCK_EX 锁不支持从读取到写入的升级。 处理器获取读取访问 NDIS_RW_LOCK_EX(通过调用 NdisAcquireRWLockRead),同一处理器不得尝试获取写入访问权限(通过调用 NdisAcquireRWLockWrite),直到释放以前的读取访问权限。

可以在同一处理器上以递归方式获取 NDIS_RW_LOCK_EX 读取锁。 对于每次调用 NdisAcquireRWLockRead,必须有相应的调用来 NdisReleaseRWLock。 锁仅在上次调用 NdisReleaseRWLock后释放。

驱动程序不能使用锁来保护资源免受其其他函数与 MiniportInterrupt 共享的读取或写入访问权限 MiniportDisableInterruptEx 函数或两者兼有。 相反,驱动程序必须调用 NdisMSynchronizeWithInterruptEx 使其 MiniportSynchronizeInterrupt 函数访问其 MiniportInterrupt MiniportDisableInterruptEx 函数或两者都执行。

NdisAcquireRWLockRead 始终将 IRQL 提升到 IRQL = DISPATCH_LEVEL

要求

要求 价值
最低支持的客户端 NDIS 6.20 及更高版本中受支持。
目标平台 普遍
标头 ndis.h (包括 Ndis.h)
Ndis.lib
IRQL <= DISPATCH_LEVEL

另请参阅

LOCK_STATE_EX

MiniportDisableInterruptEx

MiniportInterrupt

MiniportSynchronizeInterrupt

NDIS_RW_LOCK_EX

NdisAcquireRWLockWrite

NdisAllocateRWLock

NdisMSynchronizeWithInterruptEx

NdisReleaseRWLock