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 函数的输入参数。
[in, optional] NdisVcHandle
标识虚拟连接 (VC 的句柄,) 调用方请求或设置其信息(如果请求特定于 VC)。 否则,如果此参数为 NULL,则请求不是特定于 VC 的。 对于任何特定于 VC 的请求,调用方最初是在使用 NdisCoCreateVc 函数创建 VC 时或作为其 ProtocolCoCreateVc 函数的输入参数时获取此句柄的。 对于定向到基础微型端口驱动程序的特定于 VC 的请求,此句柄标识 VC,而 NdisAfHandle 和 NdisPartyHandle 为 NULL。
[in, optional] NdisPartyHandle
一个句柄,用于标识调用方正在请求的多点 VC 上的参与方,如果请求特定于参与方,则为该方设置信息。 否则,如果此参数为 NULL,则请求不是特定于参与方的。 对于任何特定于参与方的请求,客户端最初是通过成功调用 NdisClAddParty 函数或 NdisClMakeCall 函数获取此句柄的,或者调用管理器获取此句柄作为其 ProtocolCmAddParty 函数的输入参数。 如果 NdisAfHandle 为 NULL, 则 NdisPartyHandle 也为 NULL。
[in, out] OidRequest
指向 NDIS_OID_REQUEST 结构的指针,该结构指定使用给定的 OID_XXX 代码请求的操作来查询或设置信息。
返回值
目标驱动程序确定 NdisCoOidRequest 返回的NDIS_STATUS_XXX 代码,通常为以下值之一:
返回代码 | 说明 |
---|---|
|
请求操作已成功完成。 |
|
正在异步处理请求,NDIS 将调用调用方请求完成时的 ProtocolCoOidRequestComplete 函数。 |
|
在 OidRequest 参数的 NDIS_OID_REQUEST 结构的 Oid 成员中指定的 OID_XXX 代码无效或不受基础驱动程序支持。 |
|
在 OidRequest 处NDIS_OID_REQUEST结构化缓冲区的 InformationBufferLength 成员中指定的值与给定OID_XXX 代码的要求不匹配。 如果信息缓冲区太小,则当 NdisCoOidRequest 返回时,NDIS_OID_REQUEST 的 BytesNeeded 成员包含 InformationBufferLength 的正确值。 |
|
给定NDIS_OID_REQUEST结构中的 InformationBuffer 中提供的数据对于给定的 OID_XXX 代码无效。 |
|
基础驱动程序不支持请求的操作。 |
|
由于资源短缺,无法满足请求。 通常,此返回值表示尝试分配内存失败,但不一定指示同一请求(如果稍后提交)将因相同原因而失败。 |
|
基础驱动程序尝试了请求的操作(通常是设置的请求),但操作失败。 例如,尝试设置过多的多播地址可能会导致 NdisCoOidRequest 返回此值。 |
|
基础驱动程序使请求的操作失败,因为关闭操作正在进行中。 |
|
基础微型端口驱动程序目前无法满足请求,因为它当前正在重置受影响的 NIC。 调用方 ProtocolStatusEx 函数已调用或将结合NDIS_STATUS_RESET_START调用,以指示重置正在进行。 此返回值不一定指示同一请求(如果稍后提交)将因相同原因而失败。 |
|
此值通常是一个非特定默认值,当没有更具体的NDIS_STATUS_XXX 导致基础驱动程序请求失败时,将返回该值。 |
|
微型端口驱动程序已停止处理请求。 例如,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
根据 NdisAfHandle 参数的值,客户端和独立调用管理器调用 NdisCoOidRequest 以相互通信或与面向连接的基础微型端口驱动程序进行通信。
如果驱动程序为 NdisVcHandle 传递 NULL,则请求本质上是全局的,无论请求是定向到客户端、调用管理器还是微型端口驱动程序。 例如,如果调用方为 NdisVcHandle 提供非 NULL 值,则对面向基础连接的微型端口驱动程序的OID_GEN_CO_RCV_CRC_ERROR OID 请求将返回特定 VC 遇到的循环冗余检查 (CRC) 错误的数量。 对于 NdisVcHandle 为 NULL 的同一请求,基础微型端口驱动程序将返回所有 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) |