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