NdisCoOidRequest 函数 (ndis.h)

NdisCoOidRequest 函数将请求转发到目标 CoNDIS 驱动程序,以查询或设置目标驱动程序的 OID 指定信息。

语法

NDIS_STATUS NdisCoOidRequest(
  [in]           NDIS_HANDLE       NdisBindingHandle,
  [in, optional] NDIS_HANDLE       NdisAfHandle,
  [in, optional] NDIS_HANDLE       NdisVcHandle,
  [in, optional] NDIS_HANDLE       NdisPartyHandle,
  [in, out]      PNDIS_OID_REQUEST OidRequest
);

参数

[in] NdisBindingHandle

NdisOpenAdapterEx 函数返回的句柄,用于标识绑定的目标适配器。

[in, optional] NdisAfHandle

标识客户端、呼叫管理器和 NDIS 之间共享的地址系列 (AF) 的句柄。 此句柄的获取方式如下:

  • 如果调用方是向调用管理器发出请求的客户端,则客户端最初是通过对 的成功调用获取此句柄的 NdisClOpenAddressFamilyEx 函数。
  • 如果调用方是向客户端发出请求 (MCM) 的独立呼叫管理器或微型端口调用管理器,则调用管理器或 MCM 最初获取此句柄作为其 ProtocolCmOpenAf 函数的输入参数。
若要从客户端或独立调用管理器向基础微型端口驱动程序发出请求,此参数必须为 NULL

[in, optional] NdisVcHandle

标识虚拟连接 (VC 的句柄,) 调用方请求或设置其信息(如果请求特定于 VC)。 否则,如果此参数为 NULL,则请求不是特定于 VC 的。 对于任何特定于 VC 的请求,调用方最初是在使用 NdisCoCreateVc 函数创建 VC 时或作为其 ProtocolCoCreateVc 函数的输入参数时获取此句柄的。 对于定向到基础微型端口驱动程序的特定于 VC 的请求,此句柄标识 VC,而 NdisAfHandleNdisPartyHandleNULL

[in, optional] NdisPartyHandle

一个句柄,用于标识调用方正在请求的多点 VC 上的参与方,如果请求特定于参与方,则为该方设置信息。 否则,如果此参数为 NULL,则请求不是特定于参与方的。 对于任何特定于参与方的请求,客户端最初是通过成功调用 NdisClAddParty 函数或 NdisClMakeCall 函数获取此句柄的,或者调用管理器获取此句柄作为其 ProtocolCmAddParty 函数的输入参数。 如果 NdisAfHandleNULL则 NdisPartyHandle 也为 NULL

[in, out] OidRequest

指向 NDIS_OID_REQUEST 结构的指针,该结构指定使用给定的 OID_XXX 代码请求的操作来查询或设置信息。

返回值

目标驱动程序确定 NdisCoOidRequest 返回的NDIS_STATUS_XXX 代码,通常为以下值之一:

返回代码 说明
NDIS_STATUS_SUCCESS
请求操作已成功完成。
NDIS_STATUS_PENDING
正在异步处理请求,NDIS 将调用调用方请求完成时的 ProtocolCoOidRequestComplete 函数。
NDIS_STATUS_INVALID_OID
OidRequest 参数的 NDIS_OID_REQUEST 结构的 Oid 成员中指定的 OID_XXX 代码无效或不受基础驱动程序支持。
NDIS_STATUS_INVALID_LENGTH或NDIS_STATUS_BUFFER_TOO_SHORT
OidRequest 处NDIS_OID_REQUEST结构化缓冲区的 InformationBufferLength 成员中指定的值与给定OID_XXX 代码的要求不匹配。 如果信息缓冲区太小,则当 NdisCoOidRequest 返回时,NDIS_OID_REQUEST 的 BytesNeeded 成员包含 InformationBufferLength 的正确值。
NDIS_STATUS_INVALID_DATA
给定NDIS_OID_REQUEST结构中的 InformationBuffer 中提供的数据对于给定的 OID_XXX 代码无效。
NDIS_STATUS_NOT_SUPPORTED或NDIS_STATUS_NOT_RECOGNIZED
基础驱动程序不支持请求的操作。
NDIS_STATUS_RESOURCES
由于资源短缺,无法满足请求。 通常,此返回值表示尝试分配内存失败,但不一定指示同一请求(如果稍后提交)将因相同原因而失败。
NDIS_STATUS_NOT_ACCEPTED
基础驱动程序尝试了请求的操作(通常是设置的请求),但操作失败。 例如,尝试设置过多的多播地址可能会导致 NdisCoOidRequest 返回此值。
NDIS_STATUS_CLOSING或NDIS_STATUS_CLOSING_INDICATING
基础驱动程序使请求的操作失败,因为关闭操作正在进行中。
NDIS_STATUS_RESET_IN_PROGRESS
基础微型端口驱动程序目前无法满足请求,因为它当前正在重置受影响的 NIC。 调用方 ProtocolStatusEx 函数已调用或将结合NDIS_STATUS_RESET_START调用,以指示重置正在进行。 此返回值不一定指示同一请求(如果稍后提交)将因相同原因而失败。
NDIS_STATUS_FAILURE
此值通常是一个非特定默认值,当没有更具体的NDIS_STATUS_XXX 导致基础驱动程序请求失败时,将返回该值。
NDIS_STATUS_REQUEST_ABORTED
微型端口驱动程序已停止处理请求。 例如,NDIS 调用基础微型端口驱动程序的 MiniportResetEx MiniportCancelOidRequest 函数。

注解

CoNDIS 客户端和独立调用管理器可以调用 NdisCoOidRequest 函数,以发送 OID 请求以查询或设置目标驱动程序中的 OID 指定信息。 目标驱动程序可以是另一个 CoNDIS 协议驱动程序或基础驱动程序。

NdisCoOidRequest 的调用方必须分配足够的内存来保存与指定 OID 关联的信息缓冲区。 调用方还必须在 OidRequest 上分配和设置缓冲区,然后才能调用 NdisCoOidRequest。 必须从非分页池中分配这两个缓冲区,因为目标驱动程序可以在处理请求时在引发的 IRQL 下运行。

NdisCoOidRequest 返回的一些错误是可恢复的,其中包括:

  • NDIS_STATUS_INVALID_OID
  • NDIS_STATUS_INVALID_LENGTH
  • NDIS_STATUS_BUFFER_TOO_SHORT
  • NDIS_STATUS_INVALID_DATA
  • NDIS_STATUS_RESOURCES
  • NDIS_STATUS_RESET_IN_PROGRESS
也就是说,驱动程序可以适当地修改 OidRequest 处的数据包,以更正 informationBuffer 处的 OID_XXX 代码或缓冲区的大小或内容,并将请求数据包重新提交到 NdisCoOidRequest。 如果原始调用指示正在进行重置,或者资源短缺(可能是暂时的)阻止执行该请求,则驱动程序将其重新提交到 NdisCoOidRequest 时,可能会满足相同的数据包。

根据 NdisAfHandle 参数的值,客户端和独立调用管理器调用 NdisCoOidRequest 以相互通信或与面向连接的基础微型端口驱动程序进行通信。

如果驱动程序为 NdisVcHandle 传递 NULL,则请求本质上是全局的,无论请求是定向到客户端、调用管理器还是微型端口驱动程序。 例如,如果调用方为 NdisVcHandle 提供非 NULL 值,则对面向基础连接的微型端口驱动程序的OID_GEN_CO_RCV_CRC_ERROR OID 请求将返回特定 VC 遇到的循环冗余检查 (CRC) 错误的数量。 对于 NdisVcHandleNULL 的同一请求,基础微型端口驱动程序将返回所有 VC 遇到的 CRC 错误总数。

客户端和独立调用管理器应为所有非面向连接的 OID 调用 NdisOidRequest 函数,例如在 OID_GEN_SUPPORTED_LIST 查询中返回的 NdisOidRequest 函数,该查询通常在协议驱动程序将自身绑定到基础 NIC 驱动程序后在初始化期间发出。

如果 NdisCoOidRequest 返回NDIS_STATUS_PENDING,则请求正在异步处理,NDIS 将调用驱动程序的请求完成时的 ProtocolCoOidRequestComplete 函数。 如果 NdisCoOidRequest 返回任何其他状态,则请求在 NdisCoOidRequest 返回时完成,并且 NDIS 不调用 ProtocolCoOidRequestComplete

有关定义为与 NdisCoOidRequest 和 NdisOidRequest 一起使用的 OID 集的详细信息,请参阅 NDIS OID

只有协议驱动程序的客户端和独立调用管理器才能调用 NdisCoOidRequest。 MCM 调用 NdisMCmOidRequest 函数以与其客户端通信。

要求

要求
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
目标平台 桌面
标头 ndis.h (包括 Ndis.h)
Library Ndis.lib
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 Irql_Connection_Function (ndis)

另请参阅

MiniportCancelOidRequest

MiniportResetEx

NDIS_OID_REQUEST

NdisClAddParty

NdisClMakeCall

NdisClOpenAddressFamilyEx

NdisCoCreateVc

NdisMCmOidRequest

NdisOidRequest

NdisOpenAdapterEx

OID_GEN_CO_RCV_CRC_ERROR

OID_GEN_SUPPORTED_LIST

ProtocolCmAddParty

ProtocolCmOpenAf

ProtocolCoCreateVc

ProtocolCoOidRequestComplete

ProtocolStatusEx