Функция 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