EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START回调函数 (sercx.h)
EvtSerCx2CustomReceiveTransactionStart 事件回调函数由串行框架扩展版本 2(SerCx2)调用,以启动自定义接收事务。
语法
EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START EvtSercx2CustomReceiveTransactionStart;
void EvtSercx2CustomReceiveTransactionStart(
[in] SERCX2CUSTOMRECEIVETRANSACTION CustomReceiveTransaction,
[in] WDFREQUEST Request,
[in] PMDL Mdl,
[in] ULONG Offset,
[in] ULONG Length
)
{...}
参数
[in] CustomReceiveTransaction
自定义接收事务对象的 SERCX2CUSTOMRECEIVETRANSACTION 句柄。 串行控制器驱动程序以前调用 SerCx2CustomReceiveTransactionCreate 方法来创建此对象。
[in] Request
与自定义接收事务关联的框架请求对象的句柄。 驱动程序负责完成此请求。 此请求可能不是客户端发送的 IRP_MJ_READ 请求,因此串行控制器驱动程序不应尝试使用此请求来访问读取缓冲区。 此请求主要用于取消、完成和队列转发(如果需要)。 若要访问客户端读取请求的读取缓冲区,请使用 Mdl、Offset和 Length 参数。
[in] Mdl
指向 MDL 的指针,该指针描述自定义接收事务的读取缓冲区跨越的内存页。 数据传输的散点/收集列表将使用由 偏移量 和 长度 参数指定的此内存区域。
[in] Offset
数据传输的起始偏移量。 此参数是 MDL 描述的缓冲区区域的开头的字节偏移量。 如果 MDL 指定缓冲区空间的总 N 个字节,则 偏移量 的可能值介于 0 到 N–1 之间。
[in] Length
数据传输的大小(以字节为单位)。 如果 MDL 指定缓冲区空间的总 N 个字节,则 长度 的可能值在 1 到 N 到 N-偏移量范围内。
返回值
没有
言论
如果串行控制器驱动程序创建自定义接收事务对象,则必须实现此函数。 驱动程序在创建此对象的 SerCx2CustomReceiveTransactionCreate 调用中注册函数。
SerCx2 调用 EvtSerCx2CustomReceiveTransactionStart 函数后,串行控制器驱动程序通过编程自定义数据传输机制启动事务,以便将数据从串行控制器硬件中的接收 FIFO 移动到读取请求中的缓冲区。 除非可以立即完成请求,否则在 EvtSerCx2CustomReceiveTransactionStart 函数返回之前,驱动程序必须调用 WdfRequestMarkCancelableEx 等方法将请求标记为可取消。
EvtSerCx2CustomReceiveTransactionStart 函数启动事务后,SerCx2 会定期调用 EvtSerCx2CustomReceiveTransactionQueryProgress 事件回调函数,以监视串行控制器驱动程序执行此事务时的进度。 事务完成后,驱动程序完成挂起的读取请求后,如果驱动程序实现此函数,SerCx2 将调用 EvtSerCx2CustomReceiveTransactionCleanup 事件回调函数。
如果串行控制器驱动程序实现 EvtSerCx2CustomReceiveTransactionInitialize 事件回调函数,则 SerCx2 在调用 EvtSerCx2CustomReceiveTransactionStart 函数之前调用此函数。 就在 EvtSerCx2CustomReceiveTransactionStart 调用之前,在 EvtSerCx2CustomReceiveTransactionInitialize 调用返回后,SerCx2 启动检测读取请求是否超时的计时器。有关详细信息,请参阅 SERIAL_TIMEOUTS中总超时的讨论。
如果自定义数据传输机制是总线主 DMA 设备, EvtSerCx2CustomReceiveTransactionStart 函数可以调用 WdfDmaTransactionInitializeUsingOffset 等方法,以启动使用 Mdl、Offset和 Length 参数描述的读取缓冲区的 DMA 事务。
如果 Request 参数标识的请求对象包含专用上下文的存储,则当串行控制器驱动程序首次访问上下文时,此存储可能未初始化。 首次访问时,驱动程序通常应使用零填充上下文,然后根据需要,在需要非零初始值的上下文中显式设置任何字段。
有关详细信息,请参阅 SerCx2 Custom-Receive 事务。
例子
若要定义 EvtSerCx2CustomReceiveTransactionStart 回调函数,必须首先提供一个函数声明,用于标识要定义的回调函数的类型。 Windows 为驱动程序提供一组回调函数类型。 使用回调函数类型声明函数有助于 驱动程序代码分析、静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows 操作系统编写驱动程序的要求。
例如,若要定义名为 的 MyCustomReceiveTransactionStart
回调函数,请使用 EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 函数类型,如以下代码示例所示:
EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START MyCustomReceiveTransactionStart;
然后,按如下所示实现回调函数:
_Use_decl_annotations_
VOID
MyCustomReceiveTransactionStart(
SERCX2CUSTOMRECEIVETRANSACTION CustomReceiveTransaction,
WDFREQUEST Request,
PMDL Mdl,
ULONG Offset,
ULONG Length
)
{...}
EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 函数类型在 Sercx.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations 批注可确保使用应用于头文件中 EVT_SERCX2_CUSTOM_RECEIVE_TRANSACTION_START 函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 KMDF 驱动程序的函数角色类型声明函数。 有关 Use_decl_annotations的详细信息,请参阅 批注函数行为。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从Windows 8.1开始可用。 |
目标平台 | 桌面 |
标头 | sercx.h |
IRQL | 在 IRQL <调用 = DISPATCH_LEVEL。 |
另请参阅
SERCX2CUSTOMRECEIVETRANSACTION
SerCx2CustomReceiveTransactionCreate