EVT_SPB_CONTROLLER_LOCK回调函数 (spbcx.h)

SPB 控制器驱动程序的 EvtSpbControllerLock 事件回调函数锁定 SPB 控制器,以便访问总线上的单个目标设备。

语法

EVT_SPB_CONTROLLER_LOCK EvtSpbControllerLock;

void EvtSpbControllerLock(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST LockRequest
)
{...}

参数

[in] Controller

表示 SPB 控制器的 框架设备对象的 WDFDEVICE 句柄。

[in] Target

此 I/O 请求的目标的 SPBTARGET 句柄。 目标是连接到总线的外围设备或端口。 SPB 框架扩展 (SpbCx) 以前将此句柄分配给了打开与目标的连接的 EvtSpbTargetConnect 回调中的目标。

[in] LockRequest

I/O 控制请求的 SPBREQUEST 句柄,用于锁定控制器。 SPB 控制器驱动程序必须通过执行请求的操作或返回错误状态来完成此请求。 有关更多信息,请参见备注

返回值

备注

SpbCx 管理 SPB 控制器的 I/O 队列。 如果 SPB 控制器驱动程序注册 EvtSpbControllerLock 回调函数,则当客户端 (控制器的外设驱动程序) 向总线上的目标发送 IOCTL_SPB_LOCK_CONTROLLER 请求时,SpbCx 会调用此函数。 LockRequest 参数值是封装此请求的句柄。

EvtSpbControllerLockEvtSpbControllerUnlock 函数执行补充操作。 这两个函数都是可选的。 如果 SPB 控制器驱动程序实现 EvtSpbControllerUnlock 函数,则驱动程序不需要实现 EvtSpbControllerLock 函数,但可能这样做。 但是,如果 SPB 控制器驱动程序实现 EvtSpbControllerLock 函数,则它还必须实现 EvtSpbControllerUnlock 函数。 有关详细信息,请参阅 SPB_CONTROLLER_CONFIG 中的备注。

锁定生效时,控制器不得允许访问总线上的目标,但 LockRequest 参数指定的目标除外。

如果 SPB 控制器驱动程序需要更改其控制器的模式以临时替代常规目标选择机制,则可以在 EvtSpbControllerLock 回调期间执行此操作。 如果此模式更改涉及较长的延迟或要求驱动程序等待设备中断,则驱动程序应启动模式更改,然后从回调中立即返回。 稍后,驱动程序可以在计时器 DPC 或中断 DPC 中完成锁定操作。

如果锁定操作在 DPC 中完成,SPB 控制器驱动程序之前应已分配锁定操作所需的所有资源。

EvtSpbControllerLock 回调必须避免锁定请求失败。 如果启用了驱动程序验证程序,则此类故障将触发验证程序陷阱,该陷阱将向即插即用管理器报告控制器已失败。 SpbCx 会忽略锁定请求的失败,并且不会尝试处理或缓解故障。

EvtSpbControllerLock 函数不返回值。 相反,SPB 控制器驱动程序在由 LockRequest 参数标识的 I/O 请求的完成状态中指示锁定操作的状态。 将完成状态设置为STATUS_SUCCESS。

SpbCx 调用 EvtSpbControllerUnlock 事件回调函数来解锁以前被 EvtSpbControllerLock 回调锁定的控制器。

若要注册 EvtSpbControllerLock 回调函数,请调用 SpbDeviceInitialize 方法。

有关 EvtSpbControllerLock 函数的详细信息,请参阅 处理 Client-Implemented 序列

示例

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

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

EVT_SPB_CONTROLLER_LOCK  MyEvtSpbControllerLock;

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

_Use_decl_annotations_
VOID
  MyEvtSpbControllerLock(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST LockRequest
    )
{ ... }

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

要求

要求
最低受支持的客户端 支持从Windows 8开始。
目标平台 桌面
标头 spbcx.h
IRQL 在 IRQL <= DISPATCH_LEVEL 调用。

另请参阅