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,以便其他驱动程序函数可以访问受该旋转锁保护的资源(s)。

一般情况下,为了提高性能,驱动程序应使用不同的锁来保护不同的关键部分。 因此,驱动程序可以使用 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运行。

要求

要求 价值
最低支持的客户端 Windows Vista 中支持 NDIS 6.0 和 NDIS 5.1 驱动程序(请参阅 NdisAllocateSpinLock(NDIS 5.1)。 Windows XP 中支持 NDIS 5.1 驱动程序(请参阅 NdisAllocateSpinLock (NDIS 5.1)。
目标平台 普遍
标头 ndis.h (包括 Ndis.h)
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