在 NDIS 筛选器驱动程序中筛选 OID 请求

筛选器驱动程序可以处理由过度分配驱动程序发起的 OID 请求。 NDIS 调用 FilterOidRequest 函数来处理每个 OID 请求。 筛选器驱动程序可以通过调用 NdisFOidRequest 函数将 OID 请求转发到基础驱动程序。

NDIS 可以调用筛选器驱动程序的 FilterCancelOidRequest 函数来取消 OID 请求。 当 NDIS 调用 FilterCancelOidRequest 时,筛选器驱动程序应尝试尽快调用 NdisFOidRequest 函数。

下图演示了筛选的 OID 请求。

说明筛选的 OID 请求过程的关系图。

筛选器驱动程序可以通过分别从 FilterOidRequest 返回NDIS_STATUS_SUCCESS或NDIS_STATUS_PENDING,以同步或异步方式完成 OID 请求。 FilterOidRequest 还可以同步完成并出现错误状态。

成功处理 OID 集请求的筛选器驱动程序必须在从 OID 集请求返回时在 NDIS_OID_REQUEST 结构中设置 SupportedRevision 成员。 SupportedRevision 成员通知 OID 请求的发起方有关驱动程序支持的修订版。 有关 NDIS 结构中的版本信息的详细信息,请参阅 指定 NDIS 版本信息

如果 FilterOidRequest 返回NDIS_STATUS_PENDING,则必须在完成 OID 请求后调用 NdisFOidRequestComplete 函数。 在这种情况下,驱动程序会在 NdisFOidRequestCompleteOidRequest 参数中传递请求的结果。 驱动程序在 NdisFOidRequestCompleteStatus 参数中传递请求的最终状态。

如果 FilterOidRequest 返回NDIS_STATUS_SUCCESS,它将在 OidRequest 参数处的 NDIS_OID_REQUEST 结构中返回查询请求的结果。 在这种情况下,驱动程序不会调用 NdisFOidRequestComplete 函数。

若要将 OID 请求转发到基础驱动程序,筛选器驱动程序会调用 NdisFOidRequest 函数。 如果不应将请求转发到基础驱动程序,筛选器驱动程序可以立即完成请求。 若要在不转发的情况下完成请求,驱动程序可以从 FilterOidRequest 返回NDIS_STATUS_SUCCESS (或错误状态) ,也可以在返回NDIS_STATUS_PENDING后调用 NdisFOidRequestComplete

注意 在驱动程序调用 NdisFOidRequest 之前,驱动程序必须分配 NDIS_OID_REQUEST 结构,并通过调用 NdisAllocateCloneOidRequest 将请求信息传输到新结构。

转发的请求的处理方式与筛选器驱动程序发起的请求相同。 有关详细信息,请参阅 从 NDIS 筛选器驱动程序生成 OID 请求

在基础驱动程序完成转发的请求后,筛选器驱动程序可以修改响应(如有必要),并将其传递给过度分配的驱动程序。

筛选器驱动程序在处于“正在重启”、“正在运行”、“正在暂停”或“已暂停”状态时,可以接收来自过度驱动程序的 OID 请求。

注意 与微型端口驱动程序一样,筛选器驱动程序一次只能接收一个 OID 请求。 由于 NDIS 序列化发送到筛选器模块的请求,因此在完成上一个请求之前,无法在 FilterOidRequest 中调用筛选器驱动程序。

下面是筛选器驱动程序修改 OID 请求的示例:

  • 筛选器驱动程序添加标头。 在这种情况下,在驱动程序从基础驱动程序收到对 OID_GEN_MAXIMUM_FRAME_SIZE 查询的响应后,筛选器将从响应中减去其标头的大小。 驱动程序减去其标头大小,因为驱动程序在每个发送的数据包的前面插入一个标头,并删除每个接收的数据包中的标头。