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 時,佇列物件上有任何線程正在等候,則此呼叫會滿足單個線程的等候。 線程會分派以使用指定的 Entry 指標來執行。
如果呼叫 KeInsertHeadQueue 時,目前沒有等候佇列對象的線程,則會在佇列中插入指定的專案,並遞增佇列物件的訊號狀態。
如需使用驅動程式管理的內部佇列的詳細資訊,請參閱 Driver-Managed 佇列。
要求
| 要求 | 價值 |
|---|---|
| 目標平臺 | 普遍 |
| 標頭 | ntifs.h (include Ntifs.h) |
| 連結庫 | NtosKrnl.lib |
| DLL | NtosKrnl.exe |
| IRQL | <= DISPATCH_LEVEL |
| DDI 合規性規則 | HwStorPortProhibitedDIs(storport) |
另請參閱
ExAllocateFromNPagedLookasideList