【问题标题】:canceling oid request in NDIS driver在 NDIS 驱动程序中取消 oid 请求
【发布时间】:2013-09-13 04:15:58
【问题描述】:

如何取消 oid 请求。谁能告诉我详细的流程?假设 NDIS 向微型端口驱动程序发送任何请求。驱动程序如何取消请求并将其发送到微型端口驱动程序。

【问题讨论】:

    标签: driver ndis


    【解决方案1】:

    有一些关于 OID 处理的信息here。每个 OID 在 NDIS_OID_REQEST::RequestId 中都有一个取消 ID。如果 NDIS 想要取消 OID 请求,NDIS 将调用您的微型端口的 MiniportCancelOidRequest 处理程序,并传递一个 RequestId。您的微型端口应将 RequestId 与当前 OID 请求的请求 ID 进行比较。如果 RequestId 匹配,您的微型端口应该加快 OID 请求的完成,因为更高层不再需要该操作来完成。

    但是,您的微型端口驱动程序没有义务取消任何请求,尤其是,您不应浪费时间尝试“撤消”请求。 NDIS 知道取消可能“为时已晚”,如果需要,NDIS 准备发布额外的 OID 以正确回滚操作。

    所以对于微型端口,这些都是处理取消请求的有效方法:

    1. 忽略取消,继续处理请求。使用NDIS_STATUS_SUCCESS(或失败代码,如果操作失败)完成请求。
    2. 尝试取消操作(例如,通过调用 IoCancelIrp 或类似方法)。
      • 如果操作实际上被取消(例如,您的 IRP 的完成处理程序获得了 STATUS_CANCELLED),则返回 NDIS_STATUS_REQUEST_ABORTED
      • 如果操作仍然成功(例如,您的 IRP 的完成处理程序获得了 STATUS_SUCCESS),则返回 NDIS_STATUS_SUCCESS,即使您尝试取消也是如此。

    对于“微不足道”的 OID,不必费心实施取消。例如,如果您只需将数据复制到 OID 的缓冲区即可满足OID_GEN_STATISTICS 的要求,而无需使用硬件,那么就不必费心尝试为此 OID 实现取消。取消只会增加一堆开销而没有真正有用。

    当 OID 请求导致对硬件的阻塞调用(例如,将URB 向下发送到 USB 小工具)时,取消会更有用。

    确保,如果 OID 需要多次调用,而您在第一次调用后取消,则将硬件恢复到已知状态。例如,如果处理OID_PNP_SET_POWER 需要您对硬件进行 10 次调用,并且您决定为此 OID 实施取消,那么如果在第 3 次硬件调用后取消 OID,您应该安全地将硬件恢复到之前的电源状态。

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 2016-03-10
      • 2017-06-21
      • 1970-01-01
      • 2016-12-11
      • 2012-05-08
      • 2014-11-08
      • 2010-10-26
      • 2012-02-02
      相关资源
      最近更新 更多