EVT_SERCX2_CONTROL回调函数 (sercx.h)

EvtSerCx2Control 事件回调函数由串行框架扩展版本 2 (SerCx2) 调用,以处理串行 I/O 控制请求。

语法

EVT_SERCX2_CONTROL EvtSercx2Control;

NTSTATUS EvtSercx2Control(
  [in] WDFDEVICE Device,
  [in] WDFREQUEST Request,
  [in] size_t OutputBufferLength,
  [in] size_t InputBufferLength,
  [in] ULONG IoControlCode
)
{...}

参数

[in] Device

表示串行控制器的框架设备对象的 WDFDEVICE 句柄。 串行控制器驱动程序在其 EvtDriverDeviceAdd 回调函数中创建此对象。 有关详细信息,请参阅 SerCx2InitializeDevice

[in] Request

表示串行 I/O 控制请求的框架请求对象的 WDFREQUEST 句柄。

[in] OutputBufferLength

Request 参数指定的串行 I/O 控制请求的输出缓冲区的长度(以字节为单位)。

[in] InputBufferLength

Request 参数指定的串行 I/O 控制请求的输入缓冲区的长度(以字节为单位)。

[in] IoControlCode

请求 参数指定的串行 I/O 控件请求中指定 I/O 控件代码(IOCTL)。 串行 I/O 控制请求的 IOCTL 在 Ntddser.h 头文件中定义。 有关详细信息,请参阅“备注”。

返回值

如果调用成功,EvtSerCx2Control 函数将返回STATUS_SUCCESS。 否则,它将返回适当的错误状态代码。

言论

串行控制器驱动程序必须实现此函数。 驱动程序在调用 SerCx2InitializeDevice 方法中注册函数,该方法完成串行控制器的框架设备对象的初始化。

EvtSerCx2Control 函数允许驱动程序处理 SerCx2 无法处理的某些串行 I/O 控制请求。 SerCx2 处理 Ntddser.h 头文件中定义的串行 IOCTL 子集的所有处理。 但是,SerCx2 依赖于驱动程序来处理串行 I/O 控制请求来执行依赖于硬件的操作。

当 SerCx2 收到只能由串行控制器驱动程序处理的串行 I/O 控制请求时,SerCx2 调用 EvtSerCx2Control 函数,以便将 I/O 控制请求移交给驱动程序。 驱动程序负责完成此请求。 未实现对特定 I/O 控制请求的支持的驱动程序应使用STATUS_NOT_SUPPORTED错误状态代码完成此 I/O 控制请求。

若要完成 I/O 控制请求,驱动程序通常会调用 WdfRequestComplete 方法并提供输入参数、Request 参数值和状态值来指示请求是否成功。 此状态值将写入请求的状态块。

EvtSerCx2Control 函数的返回值应始终与此函数写入到 I/O 控件请求的状态块的状态值匹配。 SerCx2 的当前实现将忽略此返回值。

SerCx2 调用 EvtSerCx2Control 函数来处理下表中显示的 IOCTL。 表右侧的列指示是否需要 EvtSerCx2Control 函数来实现对特定 IOCTL 的支持。

I/O 控制请求名称 必需或可选
IOCTL_SERIAL_CLR_DTR 自选
IOCTL_SERIAL_CLR_RTS 必填
IOCTL_SERIAL_GET_BAUD_RATE 必填
IOCTL_SERIAL_GET_COMMSTATUS 必填
IOCTL_SERIAL_GET_DTRRTS 必填
IOCTL_SERIAL_GET_HANDFLOW 必填
IOCTL_SERIAL_GET_LINE_CONTROL 必填
IOCTL_SERIAL_GET_MODEM_CONTROL 必填
IOCTL_SERIAL_GET_MODEMSTATUS 必填
IOCTL_SERIAL_GET_PROPERTIES 必填
IOCTL_SERIAL_SET_BAUD_RATE 必填
IOCTL_SERIAL_SET_BREAK_OFF 必填
IOCTL_SERIAL_SET_BREAK_ON 必填
IOCTL_SERIAL_SET_DTR 自选
IOCTL_SERIAL_SET_FIFO_CONTROL 自选
IOCTL_SERIAL_SET_HANDFLOW 必填
IOCTL_SERIAL_SET_LINE_CONTROL 必填
IOCTL_SERIAL_SET_MODEM_CONTROL 必填
IOCTL_SERIAL_SET_RTS 必填
 

上表列出了 SerCx2 向 EvtSerCx2Control 函数呈现的所有串行 IOCTL。 对于不在此列表中的任何 IOCTL,SerCx2 会处理 IOCTL,或者立即失败 IOCTL 并将请求状态设置为STATUS_NOT_SUPPORTED。 SerCx2 处理 IOCTL_SERIAL_APPLY_DEFAULT_CONFIGURATION 请求,但在处理此类请求期间调用 EvtSerCx2ApplyConfig 事件回调函数。 SerCx2 处理 IOCTL_SERIAL_PURGE 请求,但在处理此类请求期间,可能会调用 EvtSerCx2PurgeFifos 事件回调函数。 SerCx 对 IOCTL_SERIAL_SET_WAIT_MASK 请求进行初步处理,但调用 EvtSerCx2SetWaitMask 事件回调函数(如果已实现)来完成处理此类请求。 有关对串行 IOCTL 的 SerCx2 支持的详细信息,请参阅 串行 I/O 请求接口

IOCTL_SERIAL_CLR_DTR和IOCTL_SERIAL_SET_DTR

如果串行控制器驱动程序中的 EvtSerCx2Control 函数支持 IOCTL_SERIAL_SET_DTR 请求,则此函数还应支持 IOCTL_SERIAL_CLR_DTR 请求,反之亦然。 如果驱动程序不支持这两个请求,则 IOCTL_SERIAL_GET_DTRRTS 请求的驱动程序处理程序应将此请求的输出值中的SERIAL_DTR_STATE标志位设置为零。

IOCTL_SERIAL_GET_DTRRTS

串行控制器驱动程序中的 EvtSerCx2Control 函数必须支持 IOCTL_SERIAL_GET_DTRRTS 请求,但此请求的驱动程序处理程序仅支持此请求的输出值中的SERIAL_RTS_STATE标志位。 作为选项,驱动程序还可以额外支持SERIAL_DTR_STATE标志位。 如果不支持SERIAL_DTR_STATE标志位,请将此位设置为零。

IOCTL_SERIAL_GET_COMMSTATUS

串行控制器驱动程序中的 EvtSerCx2Control 函数必须支持 IOCTL_SERIAL_GET_COMMSTATUS 请求,但此请求的驱动程序处理程序仅支持此请求使用的 SERIAL_STATUS 结构的以下成员:

  • 错误
  • HoldReasons
作为选项,驱动程序还可以额外支持此结构的任何其他成员。 将所有不受支持的成员设置为零。

IOCTL_SERIAL_GET_PROPERTIES

串行控制器驱动程序中的 EvtSerCx2Control 函数必须支持 IOCTL_SERIAL_GET_PROPERTIES 请求。 此请求的驱动程序处理程序应将此请求使用的 SERIAL_COMMPROP 结构的 MaxBaud 成员设置为每秒以位(bps)表示的最大支持的波特率。 例如,如果串行控制器支持最特率为 115,200 bps,驱动程序将 MaxBaud = 115200。

IOCTL_SERIAL_GET_MODEMSTATUS

串行控制器驱动程序中的 EvtSerCx2Control 函数必须支持 IOCTL_SERIAL_GET_MODEMSTATUS 请求。 此请求的驱动程序处理程序应将请求的输出值设置为从串行控制器硬件读取的原始调制解调器状态寄存器值。

IOCTL_SERIAL_GET_HANDFLOW和IOCTL_SERIAL_SET_HANDFLOW

串行控制器驱动程序中的 EvtSerCx2Control 函数必须支持 IOCTL_SERIAL_GET_HANDFLOWIOCTL_SERIAL_SET_HANDFLOW 请求,但需要仅支持为这些请求定义的标志位的子集。 为 ControlHandShakeFlowReplace 这些请求使用的 SERIAL_HANDFLOW 结构的成员定义标志位。

驱动程序必须支持 ControlHandshake 成员中的以下标志位:

  • SERIAL_CTS_HANDSHAKE
作为选项,驱动程序可以支持为 ControlHandshake 成员定义的任何其他标志位。

驱动程序必须支持 FlowReplace 成员中的以下标志位:

  • SERIAL_RTS_CONTROL
  • SERIAL_RTS_HANDSHAKE
作为选项,驱动程序可以支持为 FlowReplace 成员定义的任何其他标志位。 但是,这些其他标志位很少(如果需要)并且Microsoft建议不支持它们。

ControlHandShakeFlowReplace 成员中不支持特定标志位的驱动程序应在 IOCTL_SERIAL_GET_HANDFLOW 请求的输出值中将此标志位设置为零。 如果 IOCTL_SERIAL_SET_HANDFLOW 请求指定驱动程序不支持的 ControlHandshakeFlowReplace 标志位,则 EvtSerCx2Control 函数应失败请求并返回STATUS_INVALID_PARAMETER。

作为一个选项,驱动程序可以支持 XonLimitXoffLimitSERIAL_HANDFLOW 结构的成员。 但是,这些成员很少(如果有的话)需要,Microsoft建议反对支持这些成员。 不支持 XonLimitXoffLimit 成员的驱动程序应在 IOCTL_SERIAL_GET_HANDFLOW 请求的输出值中将这些成员设置为零。 如果 IOCTL_SERIAL_SET_HANDFLOW 请求指定非零 XonLimitXoffLimit 成员,并且驱动程序不支持这些成员,则 EvtSerCx2Control 函数应失败请求并返回STATUS_NOT_IMPLEMENTED。

例子

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

例如,若要定义名为 MyControl 回调函数,请使用 EVT_SERCX2_CONTROL 函数类型,如以下代码示例所示:

EVT_SERCX2_CONTROL  MyControl;

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

_Use_decl_annotations_
NTSTATUS
  MyControl(
    WDFDEVICE  Device,
    WDFREQUEST  Request,
    size_t  OutputBufferLength,
    size_t  InputBufferLength,
    ULONG  IoControlCode
    )
  {...}

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

要求

要求 价值
最低支持的客户端 从Windows 8.1开始可用。
目标平台 桌面
标头 sercx.h
IRQL 在 IRQL <调用 = DISPATCH_LEVEL。

另请参阅

EvtDriverDeviceAdd

EvtSerCx2ApplyConfig

EvtSerCx2PurgeFifos

EvtSerCx2SetWaitMask

SERIAL_COMMPROP

SERIAL_EV_XXX

SERIAL_HANDFLOW

SERIAL_STATUS

SerCx2InitializeDevice