NDIS Filter开发-OID 请求

NDIS 定义对象标识符 (OID) 值来标识适配器参数,其中包括操作参数,例如设备特征、可配置的设置和统计信息。 Filter驱动程序可以查询或设置基础驱动程序的操作参数,或过滤/覆盖顶层驱动程序的 OID 请求。

NDIS 还为 NDIS 6.1 及更高版本的Filter驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支持经常查询或设置的 OID 请求。 例如,IPsecv2 (IPsecv2) 接口为直接 OID 请求提供 OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA OID。 对于 NDIS 驱动程序,直接 OID 请求接口是可选的。

对于 NDIS 6.81 及更高版本的Filter驱动程序,NDIS 提供 同步 OID 请求接口。 同步 OID 请求路径支持需要同步的 OID 或不应由Filter驱动程序(如 RSSv2 OID)排队的 OID。 同步 OID 请求接口对于 NDIS 驱动程序是可选的,但如果Filter驱动程序播发对 RSSv2 的支持,则是必需的。

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

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

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

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

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

成功处理 OID 集请求的Filter驱动程序必须在从 OID 集请求返回时在 NDIS_OID_REQUEST 结构中设置 SupportedRevision 成员。 SupportedRevision 成员通知 OID 请求的发起方有关驱动程序支持的修订版。 

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

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

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

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

转发的请求的处理方式与Filter驱动程序发起的请求相同。 

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

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

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

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

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

从 NDIS Filter驱动程序生成 OID 请求

Filter驱动程序可以通过调用 NdisFOidRequest 函数来发起 OID 查询或设置对基础驱动程序的请求。

下图演示了Filter驱动程序发起的 OID 请求:

 

在Filter驱动程序调用 NdisFOidRequest 函数后,NDIS 将调用下一个基础驱动程序的请求函数。

为了同步完成, NdisFOidRequest 返回NDIS_STATUS_SUCCESS或错误状态。 为了异步完成, NdisFOidRequest 返回NDIS_STATUS_PENDING。

若要确定基础驱动程序成功处理了哪些信息,发出 OID 请求的Filter驱动程序必须在 OID 请求返回后检查NDIS_OID_REQUEST结构中 SupportedRevision 成员中的值。 

如果 NdisFOidRequest 返回NDIS_STATUS_PENDING,则 NDIS 会在基础驱动程序完成 OID 请求后调用 FilterOidRequestComplete 函数。 在这种情况下,NDIS 在 FilterOidRequestComplete 的 OidRequest 参数处传递请求的结果。 NDIS 在 FilterOidRequestComplete 的 Status 参数中传递请求的最终状态。

如果 NdisFOidRequest 返回NDIS_STATUS_SUCCESS,它将在 OidRequest 参数处的 NDIS_OID_REQUEST 结构中返回查询请求的结果。 在这种情况下,NDIS 不会调用 FilterOidRequestComplete 函数。

当驱动程序处于“正在重启”、“正在运行”、“正在暂停”或“已暂停”状态时,驱动程序可以调用 NdisFOidRequest。

注意 Filter驱动程序应跟踪其发起的 OID 请求,并确保在此类请求完成时不会调用 NdisFOidRequestComplete 函数。

Filter驱动直接 OID 请求

为了支持直接 OID 请求路径,Filter驱动程序在 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构中提供 FilterXxx 函数入口点,NDIS 为Filter驱动程序提供 NdisFXxx 函数。

直接 OID 请求接口类似于标准 OID 请求接口。 例如, NdisFDirectOidRequest 和 FilterDirectOidRequest 函数类似于 NdisFOidRequest 和 FilterOidRequest 函数。

注意 NDIS 6.1 及更高版本支持用于直接 OID 请求接口的特定 OID。 不支持在 NDIS 6.1 和某些 NDIS 6.1 OID 之前存在的 OID。 

Filter驱动程序必须能够处理未序列化的直接 OID 请求。 与标准 OID 请求接口不同,NDIS 不会将直接 OID 请求与使用直接 OID 接口或标准 OID 请求接口发送的其他请求序列化。 此外,Filter驱动程序必须能够在 IRQL <= DISPATCH_LEVEL 处理直接 OID 请求。

若要支持直接 OID 请求接口,请使用标准 OID 请求接口的文档。 下表显示了直接 OID 请求接口中的函数与标准 OID 请求接口之间的关系:

Filter驱动同步 OID 请求

为了支持同步 OID 请求路径,Filter驱动程序在调用 NdisFRegisterFilterDriver 函数时,在 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构中提供 FilterSynchronousOidRequest 函数入口点。

NDIS 6.81 支持用于同步 OID 请求接口的特定 OID。 不支持在 NDIS 6.80 和某些 NDIS 6.80 OID 之前存在的 OID。 

若要支持同步 OID 请求接口,请使用标准 OID 请求接口的文档。 下表显示了同步 OID 请求接口中的函数与标准 OID 请求接口之间的关系:

 

Filter Drivers主要包括以下特性:   1) 一个Filter Drivers实例叫Filter Module。Filter Module附加在一个适配器的微端口驱动上, 来自相同或不同Filter Drivers的多个Filter Module都可以被堆叠在一个网络适配器上   2) 在Filter Module被安装到驱动栈时,之上的协议驱动和之下的微端口驱动都不需要提供额外的支持功能   3) 因为Filter Module不像中间层驱动(intermediate driver)那样提供一个虚拟的微口,也不与某个设备对象联结,所以在微端口适配器(miniport adapter)之上的Filter Module 功能相当于一个修过过版本的微端口适配器(miniport adapter)。(原文:Because filter drivers do not implement virtual miniports like an intermediate driver, filter drivers are not associated with a device object. A miniport adapter with overlying filter modules functions as a modified version of the miniport adapter.)   4) NDIS使用配置信息来到决定一个Filter Module附加到一个网络适配器栈上的顺序   5) 在不用拆除整驱动栈的情况下,NDIS可以动态的插入、删除Filter Module或进行重新配置   6) 当NDIS重起驱动栈的时候协议驱动可以获得在栈上的Filter Module列表   7) Filter Drivers可以过滤下层网络适配器上绝大部分的通信。Filter Module不联结某特定的绑定(Filter modules are not associated with any particular binding between overlying protocol drivers and the miniport adapter.)   8) Filter Drivers 可以选择为过滤服务也可以选择为分流的不过滤服务,选择为哪一种是可以动态配置的(Filter drivers can select the services that are filtered and can be bypassed for the services that are not filtered. The selection of the services that are bypassed and the services that are filtered can be reconfigured dynamically.)   9) NDIS 保证有效的上下文空间,也不就是说Filter Drivers不要需要通代码COPY缓冲区来获得上下文空间  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值