KeInsertHeadQueue 函数 (ntifs.h)
KeInsertHeadQueue 例程在给定队列的头插入一个条目(如果无法立即使用该条目来满足线程等待)。
语法
LONG KeInsertHeadQueue(
[in, out] PRKQUEUE Queue,
[in, out] PLIST_ENTRY Entry
);
参数
[in, out] Queue
指向调用方在非分页池中提供常驻存储的初始化队列对象的指针。 此结构的定义如下:
typedef struct _KQUEUE {
DISPATCHER_HEADER Header;
LIST_ENTRY EntryListHead;
ULONG CurrentCount;
ULONG MaximumCount;
LIST_ENTRY ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
成员 | 意义 |
---|---|
标头 | 队列标头 |
EntryListHead | 指向队列中第一个条目的指针 |
CurrentCount | 队列中的条目数 |
MaximumCount | 队列可以包含的最大条目数 |
ThreadListHead | 指向线程列表中的第一个条目的指针 |
[in, out] Entry
指向要插入的队列条目的指针。 此指针必须是常驻系统空间地址。
返回值
KeInsertHeadQueue 返回给定队列的上一个信号状态。 如果在调用 KeInsertHeadQueue 之前将其设置为零(未发出信号),则 KeInsertHeadQueue 返回零,这意味着没有排队条目。 如果为非零(信号),KeInsertHeadQueue 返回调用 KeInsertHeadQueue 之前排队的条目数。
言论
必须从非分页池中分配由 KeInsertHeadQueue 排队的条目。 例如,可以使用 ExAllocatePoolWithTag分配调用方定义的条目的内存。 如果调用方分配大小固定的条目, 使用 ExInitializeNPagedLookasideList 创建 lookaside 列表,并使用 ExAllocateFromNPagedLookasideList 从中分配它比频繁调用 ExAllocatePoolWithTag更有效,尤其是对于其大小不是PAGE_SIZE倍数的条目。
如果在调用 KeInsertHeadQueue 时,任何线程都在等待队列对象,则此调用会满足单个线程的等待。 使用给定的 条目 指针调度线程来执行。
如果在调用 KeInsertHeadQueue 时当前没有等待队列对象,则会在队列中插入给定条目,并且队列对象的信号状态递增。
有关使用驱动程序管理的内部队列的详细信息,请参阅 Driver-Managed 队列。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | ntifs.h (include Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDIS(storport) |
另请参阅
ExAllocateFromNPagedLookasideList