Поделиться через


Функция 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. Если вызывающий объект выделяет записи фиксированного размера, создание списка lookaside с помощью ExInitializeNPagedLookasideList и выделение из него с помощью 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

ExAllocatePoolWithTag

ExInitializeNPagedLookasideList

KeInitializeQueue

KeInsertQueue

KeRemoveQueue