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。 针对 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) |