PROTOCOL_CO_OID_REQUEST回调函数 (ndis.h)

ProtocolCoOidRequest 函数处理 CoNDIS 客户端或独立调用管理器通过调用 NdisCoOidRequest 函数发起的 OID 请求,或者微型端口调用管理器 (MCM) 驱动程序通过调用 NdisMCmOidRequest 函数启动。

注意 必须使用 PROTOCOL_CO_OID_REQUEST 类型声明函数。 有关详细信息,请参阅以下示例部分。
 

语法

PROTOCOL_CO_OID_REQUEST ProtocolCoOidRequest;

NDIS_STATUS ProtocolCoOidRequest(
  [in]      NDIS_HANDLE ProtocolAfContext,
  [in]      NDIS_HANDLE ProtocolVcContext,
  [in]      NDIS_HANDLE ProtocolPartyContext,
  [in, out] PNDIS_OID_REQUEST OidRequest
)
{...}

参数

[in] ProtocolAfContext

标识地址系列(AF)上下文区域的句柄。 如果驱动程序是客户端,则它在调用 时提供此句柄 NdisClOpenAddressFamilyEx 函数,以自行连接到调用管理器。 如果驱动程序是调用管理器,则从其 ProtocolCmOpenAf 函数中提供了此句柄。

[in] ProtocolVcContext

一个句柄,用于标识虚拟连接(VC),用于查询或设置有关的信息(如果请求特定于 VC)。 否则,此参数 NULL

[in] ProtocolPartyContext

一个句柄,用于标识要查询或设置信息的多点 VC 上的参与方(如果请求特定于群)。 否则,此参数 NULL

[in, out] OidRequest

指向 NDIS_OID_REQUEST 结构的指针,该结构包含要处理的目标驱动程序的缓冲区和请求数据包。 根据请求,驱动程序返回 OidRequest 指向的结构中请求的信息。

返回值

ProtocolCoOidRequest 可以返回以下项之一:

返回代码 描述
NDIS_STATUS_SUCCESS
客户端或调用管理器执行请求的作。
NDIS_STATUS_PENDING
客户端或调用管理器正在异步处理此请求,它将调用 NdisCoOidRequestComplete 函数或当请求的作完成时, NdisMCmOidRequestComplete 函数。
NDIS_STATUS_INVALID_LENGTH 或NDIS_STATUS_BUFFER_TOO_SHORT
驱动程序失败请求,因为 NdisCoOidRequestNdisMCmOidRequest 函数的调用方没有为给定请求的 NDIS_OID_REQUESTInformationBuffer 成员提供足够的值。 驱动程序将 OidRequest 参数缓冲区中NDIS_OID_REQUEST的 BytesNeeded 成员设置为执行请求的作所需的 InformationBufferLength 成员的 OID 特定值。
NDIS_STATUS_XXX
客户端或调用管理器由于某些驱动程序确定的原因(例如为集指定的输入数据无效)失败了请求。
NDIS_STATUS_NOT_SUPPORTED
客户端或调用管理器失败了此请求,因为它无法识别 NdisRequest缓冲区中 Oid 成员中的 OID_GEN_CO_XXX 代码。

言论

CoNDIS 客户端、呼叫经理和 MCM 需要 ProtocolCoOidRequest 函数。 ProtocolCoOidRequest 类似于微型端口驱动程序的 MiniportCoOidRequest 函数。

CoNDIS 客户端和调用管理器通过在调用 NdisCoOidRequest 函数时,在 NdisAfHandle 参数中指定非NULL 值来相互发送信息。 同样,MCM 调用 NdisMCmOidRequestNdisAfHandle 显式值,以便将信息传达给客户端。 NdisCoOidRequestNdisMCmOidRequest 此类调用会导致 NDIS 调用目标客户端、调用管理器或与指定 AF 句柄关联的 ProtocolCoOidRequest 函数。

若要将 protocolCoOidRequest 注册为客户端,驱动程序将初始化 NDIS_CO_CLIENT_OPTIONAL_HANDLERS 结构,并将其传递给 NdisSetOptionalHandlers 函数的 OptionalHandlers 参数。 若要 ProtocolCoOidRequest 注册为调用管理器,驱动程序将初始化 NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 结构,并将其传递给 OptionalHandlers 参数。

如果 NdisVcHandleNdisPartyHandleNdisCoOidRequestNdisMCmOidRequestNULL,则请求本质上是全局性的。 也就是说,NdisVcHandleNdisPartyHandle 的显式值 指示 ProtocolCoOidRequest 应分别满足每个 VC 或每方给定的请求。

OidRequest 参数的缓冲区是从非分页池分配的,因此在引发 IRQL 时可访问。 NdisCoOidRequest(或 NdisMCmOidRequest)的调用方必须释放此缓冲区和 InformationBufferNDIS_OID_REQUEST 结构 OidRequest 指向的内部缓冲区。

如果 ProtocolCoOidRequest 返回NDIS_STATUS_PENDING,驱动程序必须随后调用 NdisCoOidRequestComplete 函数或当驱动程序完成请求时, NdisMCmOidRequestComplete 函数。

示例

若要定义 ProtocolCoOidRequest 函数,必须先提供一个函数声明来标识要定义的函数的类型。 Windows 为驱动程序提供了一组函数类型。 使用函数类型声明函数有助于 驱动程序代码分析静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows作系统编写驱动程序的要求。

例如,若要定义名为“MyCoOidRequest”的 ProtocolCoOidRequest 函数,请使用 PROTOCOL_CO_OID_REQUEST 类型,如以下代码示例所示:

PROTOCOL_CO_OID_REQUEST MyCoOidRequest;

然后,按如下所示实现函数:

_Use_decl_annotations_
NDIS_STATUS
 MyCoOidRequest(
    NDIS_HANDLE  ProtocolAfContext,
    NDIS_HANDLE  ProtocolVcContext,
    NDIS_HANDLE  ProtocolPartyContext,
    PNDIS_OID_REQUEST  OidRequest
    )
  {...}

PROTOCOL_CO_OID_REQUEST 函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations 批注可确保使用应用于头文件中 PROTOCOL_CO_OID_REQUEST 函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数。

有关 Use_decl_annotations的信息,请参阅 批注函数行为

要求

要求 价值
最低支持的客户端 NDIS 6.0 及更高版本中受支持。
目标平台 窗户
标头 ndis.h (包括 Ndis.h)
IRQL <= DISPATCH_LEVEL

另请参阅

MiniportCoOidRequest

NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS NDIS_CO_CLIENT_OPTIONAL_HANDLERS

NDIS_OID_REQUEST

NdisClOpenAddressFamilyEx

NdisCoOidRequest

NdisCoOidRequestComplete

NdisMCmOidRequest

NdisMCmOidRequestComplete

NdisSetOptionalHandlers

ProtocolCmOpenAf