取消NDIS驱动程序中的oid请求

时间:2013-09-12 06:35:17

标签: driver ndis

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

1 个答案:

答案 0 :(得分:0)

有一些关于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,即使您尝试取消。
  3. 对于“琐碎的”OID,不要打扰实施取消。例如,如果您只需将数据复制到OID的缓冲区就可以满足OID_GEN_STATISTICS而无需转到硬件,那么就不要试图为此OID实现取消。取消只会增加一大堆开销而不是真正有用。

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

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