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

调用方等待的处理器模式,可以是 KernelModeUserMode。 如果可以通过 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。 针对 NULL 测试 KeRemoveQueue 的返回值是一个编程错误。

为 Timeout 指定零值表示如果队列当前为空,则调用方不愿意等待条目。指定 **NULL*超时指针表示调用方愿意无限期等待某个条目。

如果 WaitMode 参数为 UserMode,则可以在等待期间交换内核堆栈。 因此,在将 WaitMode 设置为 UserMode 的情况下调用 KeRemoveQueue 时,调用方不得尝试在堆栈上传递参数。

在对 KeRemoveQueue 的调用中将 WaitMode 指定为 KernelMode 会阻止调用线程的内核堆栈被交换,并阻止在 APC) (传递用户模式异步过程调用。 它不会阻止内核模式 APC 的传递,例如当线程从 IRQL PASSIVE_LEVEL调用 KeRemoveQueue 时,I/O 管理器用来完成 IRP 的 APC。 此类内核模式 APC 的传递不会阻止调用线程等待队列对象,也不会阻止在内核 APC 运行后使用条目调度执行。

有关使用驱动程序管理的内部队列的详细信息,请参阅 驱动程序托管队列

要求

要求
目标平台 通用
标头 ntifs.h (包括 Ntifs.h、FltKernel.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) PowerIrpDDis (wdm)

另请参阅

KeInsertHeadQueue

KeInsertQueue