Функция KeRemoveQueue (ntifs.h)

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

Синтаксис

PLIST_ENTRY KeRemoveQueue(
  [in, out]      PRKQUEUE        Queue,
  [in]           KPROCESSOR_MODE WaitMode,
  [in, optional] PLARGE_INTEGER  Timeout
);

Параметры

[in, out] Queue

Указатель на инициализированный объект очереди, для которого вызывающий объект предоставляет резидентное хранилище в непагрованном пуле.

[in] WaitMode

Режим процессора, в котором ожидает вызывающий объект, который может иметь значение KernelMode или UserMode. Если доступ к чему-либо в стеке можно получить по адресу IRQL >= DISPATCH_LEVEL, вызывающий объект должен указать KernelMode.

[in, optional] Timeout

Указатель на переменную, указывающую абсолютное или относительное время в единицах 100 наносекунд, в течение которого истекает время ожидания. Если значение Timeout отрицательное, время истечения срока действия относительно текущего системного времени; в противном случае он является абсолютным. Абсолютное время истечения срока действия отслеживает любые изменения системного времени; Изменения системного времени не влияют на относительный срок действия. Этот указатель может иметь значение NULL.

Возвращаемое значение

KeRemoveQueue возвращает одно из следующих элементов:

  • Указатель на запись, выведенную из очереди, если она доступна.
  • STATUS_TIMEOUT, если заданный интервал времени ожидания истек до того, как запись стала доступной
  • STATUS_USER_APC, если APC в пользовательском режиме был доставлен в контексте вызывающего потока
  • STATUS_ABANDONED, если очередь была запущена

Комментарии

Вызывающие элементы KeRemoveQueue должны проверить, является ли возвращаемое значение STATUS_TIMEOUT или STATUS_USER_APC. Проверка возвращаемого значения KeRemoveQueue на значение NULL является ошибкой программирования.

Указание нулевого значения для параметра Timeout указывает на нежелание вызывающего объекта ждать записи, если очередь в настоящее время пуста. Указание указателя **NULL*Timeout указывает на готовность вызывающего объекта ждать ввода в течение неограниченного времени.

Если параметр WaitMode имеет значение UserMode, стек ядра можно переключить во время ожидания. Следовательно, вызывающий объект никогда не должен пытаться передать параметры в стеке при вызове KeRemoveQueue с параметром WaitMode , равным UserMode.

Указание WaitMode в качестве KernelMode в вызове KeRemoveQueue предотвращает переключение стека ядра вызывающего потока, а также предотвращает доставку вызовов асинхронных процедур (APC) в пользовательском режиме. Это не препятствует доставке APC в режиме ядра, например тех, которые используются диспетчером ввода-вывода для завершения irP, когда поток вызывает KeRemoveQueue из IRQL PASSIVE_LEVEL. Доставка такого APC в режиме ядра не предотвращает ожидание вызывающего потока для объекта очереди и отправку для выполнения с записью после запуска ядра APC.

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

Требования

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

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

KeInsertHeadQueue

KeInsertQueue