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 纳秒为单位),等待将过期。 如果 超时值 为负值,则过期时间相对于当前系统时间;否则,这是绝对的。 绝对过期时间跟踪系统时间中的任何更改;相对过期时间不受系统时间更改的影响。 此指针可以为 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 时,绝不必须尝试在堆栈上传递参数。

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

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

要求

要求 价值
目标平台 普遍
标头 ntifs.h(包括 Ntifs.h、FltKernel.h)
NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDIS(storport)PowerIrpDDis(wdm)

另请参阅

KeInsertHeadQueue

KeInsertQueue