PROTOCOL_DIRECT_OID_REQUEST_COMPLETE回调函数 (ndis.h)

ProtocolDirectOidRequestComplete 函数完成协议驱动程序发起的直接 OID 请求的处理,NdisDirectOidRequest 函数NDIS_STATUS_PENDING返回该请求。

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

语法

PROTOCOL_DIRECT_OID_REQUEST_COMPLETE ProtocolDirectOidRequestComplete;

void ProtocolDirectOidRequestComplete(
  [in] NDIS_HANDLE ProtocolBindingContext,
  [in] PNDIS_OID_REQUEST OidRequest,
  [in] NDIS_STATUS Status
)
{...}

参数

[in] ProtocolBindingContext

协议驱动程序分配的上下文区域的句柄,协议驱动程序在其中维护每个绑定的运行时状态。 驱动程序在调用 NdisOpenAdapterEx 函数时提供了此句柄。

[in] OidRequest

指向协议驱动程序提供的 NDIS_OID_REQUEST 结构的指针,该结构以前传递给 NdisDirectOidRequest 函数。

[in] Status

请求的最终状态。 基础驱动程序或 NDIS 确定此最终状态。 此参数确定 ProtocolDirectOidRequestCompleteOidRequest 中的信息执行的操作。

返回值

备注

ProtocolDirectOidRequestComplete 是一个可选函数。 如果协议驱动程序不使用直接 OID 请求,它可以在调用 时将此函数的入口点设置为 NULL NdisRegisterProtocolDriver 函数。

ProtocolDirectOidRequestComplete 使用 Status 参数的输入值,如下所示:

  • 如果 Status 为NDIS_STATUS_SUCCESS,则 NDIS 或基础驱动程序已设置 NDIS_OID_REQUEST 结构的 BytesReadBytesWritten 成员。 这些值指定在设置操作中,从 InformationBuffer 的缓冲区传输到 NIC 的协议驱动程序提供的信息量,或者为响应查询操作在 InformationBuffer 中返回的信息量。

    如果协议驱动程序进行了查询, ProtocolDirectOidRequestComplete 可以协议驱动程序确定的任何方式使用 InformationBuffer 中返回的数据,具体取决于 Oid 成员的值。

    例如,如果协议驱动程序最初启动 OID_GEN_MAXIMUM_SEND_PACKETS 查询, ProtocolDirectOidRequestComplete 可能会在 ProtocolBindingContext 区域中设置状态变量,以限制驱动程序将为后续调用 设置的未完成发送数 NdisSendNetBufferLists 函数。

  • 如果 Status 为NDIS_STATUS_INVALID_LENGTH或NDIS_STATUS_BUFFER_TOO_SHORT, 则 BytesNeeded 成员指定执行所请求操作所需的 InformationBufferLength 成员的 OID 特定值。

    在这些情况下, ProtocolDirectOidRequestComplete 可以为请求分配足够的缓冲区空间,使用所需的 InformationBufferLength 值和相同的 Oid 值设置另一个NDIS_OID_REQUEST结构,然后重试对 NdisDirectOidRequest 函数的调用。

    ProtocolDirectOidRequestComplete 也可以重试某些其他NDIS_STATUS_ Xxx 参数的请求,如 NdisDirectOidRequest 中所述。

  • 如果 Status 是一个NDIS_STATUS_ Xxx 值,这是一个不可恢复的错误, 则 ProtocolDirectOidRequestComplete 应释放为NDIS_OID_REQUEST结构分配的内存,并确定驱动程序是应关闭绑定还是调整其特定于绑定的状态信息以处理绑定上的持续网络 I/O 操作。
在协议驱动程序有时间检查 NdisDirectOidRequest 在 Status 返回的状态代码之前,可以调用 ProtocolDirectOidRequestComplete

NDIS 在 IRQL <= DISPATCH_LEVEL 调用 ProtocolDirectOidRequestComplete

示例

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

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

PROTOCOL_DIRECT_OID_REQUEST_COMPLETE MyDirectOidRequestComplete;

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

_Use_decl_annotations_
VOID
 MyDirectOidRequestComplete(
    NDIS_HANDLE  ProtocolBindingContext,
    PNDIS_OID_REQUEST  OidRequest,
    NDIS_STATUS  Status
    )
  {...}

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

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

要求

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

另请参阅

NDIS_OID_REQUEST

NdisDirectOidRequest

NdisMDirectOidRequestComplete

NdisOpenAdapterEx

NdisRegisterProtocolDriver

OID_GEN_MAXIMUM_SEND_PACKETS