NdisAllocateSpinLock 函数 (ndis.h)

NdisAllocateSpinLock 函数初始化 NDIS_SPIN_LOCK 类型的变量,该变量用于同步对非 ISR 驱动程序函数之间共享的资源的访问。

语法

void NdisAllocateSpinLock(
  [out] PNDIS_SPIN_LOCK SpinLock
);

参数

[out] SpinLock

指向表示旋转锁的不透明变量的指针。

返回值

备注

在驱动程序调用 NdisAcquireSpinLockNdisDprAcquireSpinLock 或任何 NdisInterlockedXxx 函数之前,它必须调用 NdisAllocateSpinLock 以初始化作为必需参数传递给这些 NdisXxx 函数的旋转锁。 调用方必须为 SpinLock 处的变量提供非分页存储。

调用 NdisAllocateSpinLock 后,驱动程序可以调用 NdisAcquireSpinLock ,以独占使用 () 旋转锁保护的资源。 资源访问完成后,驱动程序会调用 NdisReleaseSpinLock ,以便其他驱动程序函数可以访问受该旋转锁保护的资源 () 。

一般情况下,为了提高性能,驱动程序应使用不同的锁来保护不同的关键部分。 因此,驱动程序可能会使用 NdisAllocateSpinLock 初始化多个旋转锁。

驱动程序分配的每个旋转锁可保护一组离散共享资源,防止在 IRQL <= DISPATCH_LEVEL 上运行的驱动程序函数同时访问。 例如,维护数据包内部队列的驱动程序可能会初始化一个旋转锁来保护其队列,另一个用于保护多个驱动程序函数(不包括 MiniportInterrupt 或 )的一组状态变量 MiniportDisableInterruptEx 函数,在驱动程序处理数据包时进行访问。

NdisAcquireSpinLock 将 IRQL 提升为DISPATCH_LEVEL并将旧的 IRQL 存储在旋转锁中。 释放旋转锁会将 IRQL 设置为存储在旋转锁中的值。 由于 NDIS 有时会在PASSIVE_LEVEL进入驱动程序,因此以下代码可能会出现问题:

NdisAcquireSpinLock(A);
NdisAcquireSpinLock(B);
NdisReleaseSpinLock(A);
NdisReleaseSpinLock(B);

出于以下原因,驱动程序不应访问此序列中的旋转锁:

  • NdisReleaseSpinLock (A) 和 NdisReleaseSpinLock (B 之间,) 代码以PASSIVE_LEVEL而不是DISPATCH_LEVEL运行,并受到不适当的中断。
  • 在 NdisReleaseSpinLock (B) 代码在DISPATCH_LEVEL运行,这可能会导致调用方稍后出现IRQL_NOT_LESS_OR_EQUAL停止错误。
驱动程序绝不应使用两个旋转锁来保护同一个 (子) 资源集,因为嵌套的自旋锁获取经常会导致死锁。 即使驱动程序可以设计为防止死锁,嵌套的自旋锁获取也会对驱动程序性能和 I/O 吞吐量产生负面影响。

微型端口驱动程序无法使用旋转锁来保护其非 ISR 函数与其 MiniportInterrupt 共享的资源或 MiniportDisableInterruptEx 函数。 若要访问与 MiniportInterruptMiniportDisableInterruptEx 函数共享的资源,微型端口驱动程序必须调用 NdisMSynchronizeWithInterruptEx 具有其 MiniportSynchronizeInterrupt 函数访问 DIRQL 中的这些资源。

当驱动程序不再需要资源保护时,例如,当删除 NIC 并且驱动程序释放它为该 NIC 分配的资源时,驱动程序将调用 NdisFreeSpinLock

释放旋转锁和释放旋转锁可能会造成混淆。 NdisFreeSpinLock 清除 SpinLock 中的内存,使其不再表示旋转锁。 使用 NdisReleaseSpinLock 释放获取的旋转锁只是允许另一个执行线程获取该旋转锁。

有关获取和释放 NDIS 旋转锁的详细信息,请参阅 网络驱动程序中的同步和通知

NdisAllocateSpinLock 的调用方可以在任何 IRQL 上运行。 初始化期间,调用方通常以 IRQL = PASSIVE_LEVEL 运行。

要求

要求
最低受支持的客户端 NDIS 6.0 和 NDIS 5.1 驱动程序支持 (请参阅 Windows Vista 中的 NdisAllocateSpinLock (NDIS 5.1) ) 。 NDIS 5.1 驱动程序支持 (请参阅 Windows XP 中的 NdisAllocateSpinLock (NDIS 5.1) ) 。
目标平台 通用
标头 ndis.h (包括 Ndis.h)
Library Ndis.lib
IRQL 任何级别 (请参阅“备注”部分)
DDI 符合性规则 SpinLockDpr (ndis) SpinLockDprRelease (ndis) SpinlockRelease (ndis)

另请参阅

NDIS 协议驱动程序的 DriverEntry

MiniportDisableInterruptEx

MiniportHaltEx

MiniportInitializeEx

MiniportInterrupt

NdisAcquireSpinLock

NdisDprAcquireSpinLock

NdisDprReleaseSpinLock

NdisFreeSpinLock

NdisInterlockedAddUlong

NdisInterlockedInsertHeadList NdisInterlockedInsertTailList NdisInterlockedRemoveHeadList NdisMSynchronizeWithInterruptEx

NdisReleaseSpinLock

NetTimerCallback