Compartir a través de


Función KeRemoveQueue (ntifs.h)

La rutina KeRemoveQueue proporciona al subproceso de llamada un puntero a una entrada desqueued del objeto de cola especificado o permite que el autor de la llamada espere, hasta un intervalo de tiempo de espera opcional, en el objeto de cola.

Sintaxis

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

Parámetros

[in, out] Queue

Puntero a un objeto de cola inicializado para el que el autor de la llamada proporciona almacenamiento residente en un grupo no paginado.

[in] WaitMode

Modo de procesador en el que el autor de la llamada está esperando, que puede ser KernelMode o UserMode. Si se puede acceder a algo en su pila en IRQL >= DISPATCH_LEVEL, el autor de la llamada debe especificar KernelMode.

[in, optional] Timeout

Puntero a una variable que especifica el tiempo absoluto o relativo, en unidades de 100 nanosegundos, en las que expirará la espera. Si el valor de Timeout es negativo, la hora de expiración es relativa a la hora actual del sistema; de lo contrario, es absoluta. Los tiempos de expiración absolutos realizan un seguimiento de los cambios en la hora del sistema; los tiempos de expiración relativos no se ven afectados por los cambios de hora del sistema. Este puntero puede ser NULL.

Valor devuelto

KeRemoveQueue devuelve una de las siguientes opciones:

  • Puntero a una entrada de cola desqueuada del objeto de cola especificado, si hay uno disponible.
  • STATUS_TIMEOUT, si el intervalo de tiempo de espera especificado expiró antes de que una entrada estuviera disponible.
  • STATUS_USER_APC, si se entregó un APC en modo de usuario en el contexto del subproceso que llama
  • STATUS_ABANDONED, si la cola se ha agotado

Comentarios

Los autores de llamadas de KeRemoveQueue deben probar si su valor devuelto es STATUS_TIMEOUT o STATUS_USER_APC antes de acceder a cualquier miembro de entrada. Probar el valor devuelto de KeRemoveQueue en NULL es un error de programación.

Si se especifica un valor cero para Timeout, se indica que el autor de la llamada no está dispuesto a esperar una entrada si la cola está vacía actualmente. Si se especifica unpuntero de tiempo deespera **NULL*, se indica la voluntad del autor de la llamada de esperar indefinidamente para una entrada.

Si el parámetro WaitMode es UserMode, la pila del kernel se puede intercambiar durante la espera. Por lo tanto, un llamador nunca debe intentar pasar parámetros en la pila al llamar a KeRemoveQueue con WaitMode establecido en UserMode.

La especificación de WaitMode como KernelMode en una llamada a KeRemoveQueue impide que la pila del kernel del subproceso que realiza la llamada se intercambie, así como evitar la entrega de llamadas a procedimientos asincrónicos en modo de usuario (APC). No impide la entrega de LAS API en modo kernel, como las usadas por el Administrador de E/S para completar irP, cuando un subproceso llama a KeRemoveQueue desde IRQL PASSIVE_LEVEL. La entrega de este tipo de APC en modo kernel no impide que el subproceso que realiza la llamada espere en el objeto de cola ni se envíe para su ejecución con una entrada después de que se haya ejecutado el kernel APC.

Para más información sobre el uso de colas internas administradas por controladores, consulte Colas administradas por controladores.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado ntifs.h (incluya Ntifs.h, FltKernel.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Consulte también

KeInsertHeadQueue

KeInsertQueue