【问题标题】:Is it possible to retrieve the CPU that created a WDFREQUEST?是否可以检索创建 WDFREQUEST 的 CPU?
【发布时间】:2013-01-07 12:42:54
【问题描述】:

我正在尝试将 CompleteRequest 的完成与最初发出请求的 CPU 关联起来。有没有办法检索在 FdoDeviceControl 期间发出请求的 CPU 或任何其他方式来查看请求在进入调度队列之前来自何处?

【问题讨论】:

  • 在调度发生后检索 CPU 当然很简单。但是我能保证回调函数和问题在同一个核心上运行吗?

标签: c windows device-driver wdk wdf


【解决方案1】:

一旦您进入 DPC 例程,就无法判断请求的来源。在将请求排队到 DPC 队列之前,您需要调用 KeGetCurrentProcessorNumberEx()。我假设请求是 IRP...?

【讨论】:

  • David,我正在使用 KMDF 来处理请求,因此 IRP 被包装在 WDFREQUEST 结构中。在我看到请求时,它已经通过了 I/O 队列
  • 如果您使用的是 KMDF,那么您需要调用 WdfDeviceInitSetIoInCallerContextCallback()。这将允许您在 I/O 请求进入 kmdf I/O 队列之前查看它,您将在 I/O 启动器的进程上下文中运行,并且您将位于启动 I/O 的核心上O。从那里你可以调用 KeGetCurrentProcessorNumberEx() 并保存结果。
  • 列为答案大卫,谢谢。在相关的说明中,我是否保证 EvtDeviceWdmIrpPreprocess 也在客户端的上下文中被调用(我使用有保证的转发进度队列,所以我需要确保我总是得到调用,它看起来像 SetIoInCallerContextCallback 不这样做)跨度>
  • 这很不寻常,我认为您应该始终使用 WdfDeviceInitSetIoInCallerContextCallback() 获取回调。确保在调用 WdfDeviceCreate() 之前调用它。无论如何,如果您上面有过滤器驱动程序,那么原始上下文可能会丢失。
猜你喜欢
  • 2012-05-08
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
相关资源
最近更新 更多