锁定和解锁最佳做法

WIA 驱动程序的 STI 部分的锁定需要特别注意。 即使应用程序可以直接访问已发布的 STI 接口,这种对设备的直接访问也可能会被滥用。 未正确实现的锁定技术可能会使设备受到拒绝服务 (DoS) 攻击。

对于 STI 应用程序

以下列表包含使用 STI 应用程序时应遵循的预防措施和准则:

  • 不要长时间保留锁。

  • 如果不需要直接访问设备,则可能可以使用 WIA 接口方法获取相同的信息。 最好这样做,因为 WIA 服务随后会为你控制锁定。

  • 使用 STI 的 TWAIN 驱动程序使用 IStiUSD::LockDevice 方法来控制对设备的访问。 当 TWAIN 驱动程序使用 STI 时,TWAIN 驱动程序负责控制锁定时间。

  • 可以创建它,以便它仅实现 IStiUSD 接口方法。 此方法的缺点是应用程序可以直接调用 IStiUSD::LockDevice ,从而锁定设备供应用程序独占使用。 Windows 硬件质量实验室不认证使用此技术的驱动程序;此类驱动程序只能作为未签名的驱动程序进行安装。

对于 WIA 驱动程序

以下列表包含使用 WIA 驱动程序时应遵循的预防措施和指南:

  • 在长时间锁定期间监视设备的活动。 如果没有活动,驱动程序应解锁设备,并允许其他客户端连接。 驱动程序不应解锁设备,例如,如果它正在扫描非常大的图像,或者它花费了异常长的时间来获取图像。 这会中断当前会话。 根据设备及其运行的总线,非常大的映像可能从 10 兆字节到超过 1 GB,较长的时间可能从 500 毫秒到超过一分钟。 你应该对设备及其运行的总线进行基准测试,以便知道这些特定值适用于你的设备。

  • 使用 WIA 的应用程序无法访问驱动程序的锁定方法 IWiaMiniDrv::d rvLockWiaDeviceIWiaMiniDrv::d rvUnLockWiaDevice。 只有 WIA 服务调用这些锁定方法,WIA 服务使用 IStiUSD::LockDevice 方法将锁定调用传播到 IStiUSD。

  • 如果应用程序使用 IStiUSD::LockDevice 方法以独占方式锁定 WIA 设备,则在该应用程序调用 IStiUSD::UnLockDevice 方法之前,WIA 服务无法访问该设备。 如果 WIA 服务无法锁定设备,则设备将不适用于依赖于 WIA 服务的任何应用程序或驱动程序。

  • IWiaMiniDrv::d rvLockWiaDevice 方法应始终调用 IStiDevice::LockDevice 方法,IWiaMiniDrv::d rvUnLockWiaDevice 方法应始终调用 IStiDevice::UnLockDevice 方法。 这可确保 WIA 服务对设备执行正确的锁管理。 IStiDevice 接口在调用 IWiaMiniDrv::d rvInitializeWia 方法时传递给驱动程序。 此接口应缓存并用于调用 IStiDevice::LockDevice 方法。 此方法调用驱动程序的 IStiUSD::LockDevice 方法。

  • 如果使用 BOOL 值来控制锁定,请保护此值免受多个线程的阻止。 当两个驱动程序尝试同时锁定单个设备时,只有一个驱动程序可以成功。