KeInsertHeadQueue 函式 (ntifs.h)
如果 KeInsertHeadQueue 例程無法立即使用專案來滿足線程等候,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 來配置。 如果呼叫端配置固定大小的專案,請使用 ExInitializeNPagedLopoolsideList 來建立 lookaside 列表,並使用 ExAllocateFromNPagedLo可sideList 配置它,比經常呼叫 ExAllocatePoolWithTag 更有效率,特別是對於其大小不是多個PAGE_SIZE的專案。
如果在呼叫 KeInsertHeadQueue 時任何線程正在等候佇列物件,則此呼叫會滿足單一線程的等候。 線程會以指定的 Entry 指標分派執行。
如果在呼叫 KeInsertHeadQueue 時,佇列物件目前沒有等候任何線程,則會在佇列中插入指定的專案,並遞增佇列物件的訊號狀態。
如需使用驅動程式管理的內部佇列的詳細資訊,請參閱 驅動程式管理的佇列。
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
標頭 | ntifs.h (包含 Ntifs.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI 合規性規則 | HwStorPortProhibitedDIS (storport) |