Функция 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 было задано значение 0 (без сигнала), keInsertHeadQueue возвращает ноль, то есть записи не помещались в очередь. Если это ненулевая (сигнальная), KeInsertHeadQueue возвращает количество записей, которые были поставлены в очередь до вызова KeInsertHeadQueue .

Комментарии

Записи, которые будут помещены в очередь с помощью KeInsertHeadQueue , должны быть выделены из непагрегированного пула. Например, память для записей, определяемых вызывающим объектом, можно выделить с помощью ExAllocatePoolWithTag. Если вызывающий объект выделяет записи фиксированного размера, создание списка lookaside с помощью ExInitializeNPagedLookasideList и выделение из него с помощью ExAllocateFromNPagedLookasideList более эффективно, чем частые вызовы ExAllocatePoolWithTag, особенно для записей, размер которых не кратен PAGE_SIZE.

Если какие-либо потоки ожидают объекта очереди при вызове KeInsertHeadQueue , этот вызов удовлетворяет ожиданию одного потока. Поток отправляется для выполнения с помощью заданного указателя входа .

Если при вызове KeInsertHeadQueue потоки не ожидают объекта очереди, в очередь вставляется данная запись, а состояние сигнала объекта очереди увеличивается.

Дополнительные сведения об использовании внутренних очередей, управляемых драйвером, см. в разделе Очереди, управляемые драйвером.

Требования

Требование Значение
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Правила соответствия DDI HwStorPortProhibitedDIs(storport)

См. также раздел

ExAllocateFromNPagedLookasideList

ExAllocatePoolWithTag

ExInitializeNPagedLookasideList

KeInitializeQueue

KeInsertQueue

KeRemoveQueue