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) |