NdisInterlockedInsertHeadList 宏 (ndis.h)
NdisInterlockedInsertHeadList 函数在双链接列表的头插入一个条目(通常是一个数据包),以便以多处理器安全方式同步对列表的访问。
语法
void NdisInterlockedInsertHeadList(
[in] _ListHead,
[in] _ListEntry,
[in] _SpinLock
);
参数
[in] _ListHead
指向要插入条目的双链接列表的标头的指针。
[in] _ListEntry
指向要插入列表顶部的条目的指针。
[in] _SpinLock
指向调用方提供的旋转锁的指针,用于同步对列表的访问。
返回值
无
备注
在调用 NdisInterlockedInsertHeadList 之前,驱动程序必须使用 NdisInitializeListHead 函数初始化 ListHead 中的变量,并使用 NdisAllocateSpinLock 函数初始化 SpinLock 中的变量。 驱动程序还必须为这些变量及其内部队列提供驻留存储。
调用方提供的旋转锁可防止任何其他函数在 NdisInterlockedInsertHeadList 插入给定条目时访问驱动程序的内部队列,即使驱动程序在多处理器计算机上运行也是如此。
当 NdisInterlockedInsertHeadList 获取给定的旋转锁并在返回控件之前还原原始 IRQL 时,它将 IRQL 提升为DISPATCH_LEVEL。 因此,任何调用 NdisInterlockedInsertHeadList 的 驱动程序函数都不能是可分页代码。
大多数 NDIS 驱动程序按 FIFO 顺序处理数据包,因此任何使用互锁队列的驱动程序都倾向于 cal NdisInterlockedInsertTailList 函数的频率远高于 NdisInterlockedInsertHeadList。 此类驱动程序通常仅调用 NdisInterlockedInsertHeadList 来重新排队数据包以执行重试操作。
若要将返回的值转换回插入项的地址,驱动程序可以使用 CONTAINING_RECORD 宏。
如果在 IRQL >= DISPATCH_LEVEL 调用 NdisInterlockedInsertHeadList,则必须驻留 ListHead 参数和列表条目的存储。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | NDIS 6.0 和 NDIS 5.1 驱动程序支持 (请参阅 Windows Vista 中的 NdisInterlockedInsertHeadList (NDIS 5.1) ) 。 NDIS 5.1 驱动程序支持 (请参阅 Windows XP 中的 NdisInterlockedInsertHeadList (NDIS 5.1) ) 。 |
目标平台 | 通用 |
标头 | ndis.h (包括 Ndis.h) |
Library | Ndis.lib |
IRQL | 任何级别 |