PROTOCOL_CO_OID_REQUEST回调函数 (ndis.h)
ProtocolCoOidRequest 函数处理 CoNDIS 客户端或独立调用管理器通过调用 NdisCoOidRequest 函数发起的 OID 请求,或者微型端口调用管理器 (MCM) 驱动程序通过调用 NdisMCmOidRequest 函数启动。
语法
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 可以返回以下项之一:
返回代码 | 描述 |
---|---|
|
客户端或调用管理器执行请求的作。 |
|
客户端或调用管理器正在异步处理此请求,它将调用 NdisCoOidRequestComplete 函数或当请求的作完成时, NdisMCmOidRequestComplete 函数。 |
|
驱动程序失败请求,因为 NdisCoOidRequest 或 NdisMCmOidRequest 函数的调用方没有为给定请求的 NDIS_OID_REQUESTInformationBuffer 成员提供足够的值。 驱动程序将 OidRequest 参数缓冲区中NDIS_OID_REQUEST的 BytesNeeded 成员设置为执行请求的作所需的 InformationBufferLength 成员的 OID 特定值。 |
|
客户端或调用管理器由于某些驱动程序确定的原因(例如为集指定的输入数据无效)失败了请求。 |
|
客户端或调用管理器失败了此请求,因为它无法识别 NdisRequest缓冲区中 Oid 成员中的 OID_GEN_CO_XXX 代码。 |
言论
CoNDIS 客户端、呼叫经理和 MCM 需要 ProtocolCoOidRequest 函数。 ProtocolCoOidRequest 类似于微型端口驱动程序的 MiniportCoOidRequest 函数。
CoNDIS 客户端和调用管理器通过在调用 NdisCoOidRequest 函数时,在 NdisAfHandle 参数中指定非NULL 值来相互发送信息。 同样,MCM 调用 NdisMCmOidRequest,NdisAfHandle 显式值,以便将信息传达给客户端。 NdisCoOidRequest 或 NdisMCmOidRequest 此类调用会导致 NDIS 调用目标客户端、调用管理器或与指定 AF 句柄关联的 ProtocolCoOidRequest 函数。
若要将 protocolCoOidRequest 注册为客户端,驱动程序将初始化 NDIS_CO_CLIENT_OPTIONAL_HANDLERS 结构,并将其传递给 NdisSetOptionalHandlers 函数的 OptionalHandlers 参数。 若要 ProtocolCoOidRequest 注册为调用管理器,驱动程序将初始化 NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS 结构,并将其传递给 OptionalHandlers 参数。
如果 NdisVcHandle 和 NdisPartyHandleNdisCoOidRequest 或 NdisMCmOidRequestNULL,则请求本质上是全局性的。 也就是说,NdisVcHandle 或 NdisPartyHandle 的显式值 指示 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 |