SerCx2 Custom-Transmit 事务
某些串行控制器硬件可能实现 PIO 或系统 DMA 以外的数据传输机制,以便将数据写入串行控制器。 串行控制器驱动程序可以支持自定义传输事务,使此数据传输机制可供 SerCx2 使用。
为了启动自定义传输事务,SerCx2 调用驱动程序的 EvtSerCx2CustomTransmitTransactionStart 事件回调函数,并提供写入 (IRP_MJ_WRITE) 请求以及事务写入缓冲区的说明。 在此调用中, 函数启动事务并返回 。 然后,驱动程序负责完成事务并完成写入请求。
创建自定义传输对象
在 SerCx2 可以调用串行控制器驱动程序的任何 EvtSerCx2CustomTransmitTransactionXxx** 函数之前,驱动程序必须调用 SerCx2CustomTransmitTransactionCreate 方法,以便向 SerCx2 注册这些函数。 此方法接受指向 SERCX2_CUSTOM_TRANSMIT_TRANSACTION_CONFIG 结构的指针作为输入参数,该结构包含指向驱动程序的 EvtSerCx2CustomTransmitTransmitTransactionXxx** 函数的指针。
驱动程序必须实现以下函数:
作为选项,驱动程序可以实现以下一个或两个函数:
SerCx2CustomTransmitTransactionCreate 方法创建一个自定义传输对象,并为调用驱动程序提供此对象的 SERCX2CUSTOMTRANSMITTRANSACTION 句柄。 驱动程序的 EvtSerCx2CustomTransmitTransactionXxx** 函数均将此句柄作为其第一个参数。 以下 SerCx2 方法将此句柄作为其第一个参数:
硬件初始化和清理
某些串行控制器驱动程序可能需要在自定义传输事务开始时初始化串行控制器硬件,或者在事务结束时清理串行控制器的硬件状态。
如果驱动程序实现 EvtSerCx2CustomTransmitTransactionInitialize 事件回调函数,则 SerCx2 调用此函数以在启动事务之前初始化串行控制器。 如果实现, EvtSerCx2CustomTranstomTransmitTransactionInitialize 函数必须调用 SerCx2CustomTransmitTransactionInitializeComplete 方法,以在驱动程序完成串行控制器初始化时通知 SerCx2。
如果驱动程序实现 EvtSerCx2CustomTransmitTransactionCleanup 事件回调函数,则 SerCx2 调用此函数以在事务结束后清理硬件状态。 如果实现, EvtSerCx2CustomTransmitTransmitTransactionInitialize 函数必须调用 SerCx2CustomTransmitTransactionCleanupComplete 方法,以在驱动程序完成清理串行控制器时通知 SerCx2。
访问请求对象
为了启动自定义传输事务,SerCx2 调用驱动程序的 EvtSerCx2CustomTransmitTransactionStart 函数,并将封装在 WDFREQUEST 对象句柄 () 的关联写入请求作为参数传递给此函数。 驱动程序负责调用 WdfRequestComplete 等方法,以便在事务完成时完成此请求。 除非请求可以立即完成,否则在 EvtSerCx2CustomTransmitTransactionStart 函数返回之前,驱动程序必须调用 WdfRequestMarkCancelableEx 等方法来将请求标记为可取消。
串行控制器驱动程序不得使用 WdfRequestRetrieveInputBuffer 等方法来访问写入请求中的数据缓冲区。 相反,驱动程序应使用传递给 EvtSerCx2CustomTransmitTransactionStart 函数的 Mdl、Offset 和 Length 参数值来访问此缓冲区。
在自定义传输事务期间,驱动程序可能需要在附加到请求对象的上下文中存储有关事务的信息。 如果是这样,驱动程序的 EvtDriverDeviceAdd 事件回调函数可以调用 WdfDeviceInitSetRequestAttributes 方法,以设置要用于请求对象的属性。 这些属性包括用于请求上下文的名称和分配大小。 此调用中指定的请求属性必须与驱动程序在 调用 SerCx2InitializeDevice 方法中指定的请求属性匹配。 这些属性在驱动程序传递给 SerCx2InitializeDevice 的 SERCX2_CONFIG 结构的 RequestAttributes 成员中指定。 有关详细信息,请参阅 SERCX2_CONFIG。
对于串行控制器驱动程序在自定义传输事务开始时收到的写入请求,驱动程序框架分配的请求上下文未初始化。 作为最佳做法,驱动程序应调用 RtlZeroMemory 例程,以将此请求上下文初始化为所有零。