Procedimientos recomendados para bloquear y desbloquear
El bloqueo de la parte STI de un controlador WIA necesita especial atención. Aunque una aplicación puede acceder directamente a las interfaces STI publicadas, este acceso directo al dispositivo se puede usar incorrectamente. Las técnicas de bloqueo que se implementan incorrectamente pueden dejar un dispositivo abierto a un ataque por denegación de servicio (DoS).
Para aplicaciones STI
La lista siguiente contiene precauciones y directrices que debe seguir al usar aplicaciones STI:
No mantenga bloqueos durante largos períodos de tiempo.
Si no necesita acceso directo al dispositivo, es posible obtener la misma información mediante métodos de interfaz WIA. Esto es preferible porque el servicio WIA controla el bloqueo por usted.
Los controladores TWAIN que usan STI usan el método IStiUSD::LockDevice para controlar el acceso al dispositivo. Cuando un controlador TWAIN usa STI, el controlador TWAIN es responsable de controlar los tiempos de bloqueo.
Puede crearlo para que implemente solo los métodos de interfaz IStiUSD . La desventaja de este enfoque es que una aplicación puede llamar directamente a IStiUSD::LockDevice , lo que bloquea el dispositivo para su uso exclusivo por parte de la aplicación. El Laboratorio de calidad de hardware de Windows no certifica los controladores que usan esta técnica; estos controladores solo se pueden instalar como controladores sin firmar.
Para controladores WIA
La siguiente lista contiene precauciones y directrices que debe seguir al trabajar con controladores WIA:
Supervise la actividad del dispositivo durante largos períodos de bloqueo. Si no hay ninguna actividad, el controlador debe desbloquear el dispositivo y permitir que otros clientes se conecten. El controlador no debe desbloquear el dispositivo, por ejemplo, si está examinando una imagen muy grande o si tarda mucho tiempo en adquirir una imagen. Esto interrumpe la sesión actual. Dependiendo del dispositivo y del bus en el que opera, una imagen muy grande podría estar en cualquier lugar de 10 megabytes a más de un gigabyte, y un largo período de tiempo podría estar en cualquier lugar de 500 milisegundos a más de un minuto. Debe realizar pruebas comparativas del dispositivo y el bus en el que opera para saber cuáles son estos valores específicos para el dispositivo.
Las aplicaciones que usan WIA no acceden a los métodos de bloqueo del controlador, IWiaMiniDrv::d rvLockWiaDevice e IWiaMiniDrv::d rvUnLockWiaDevice. Solo el servicio WIA llama a estos métodos de bloqueo, el servicio WIA propaga las llamadas de bloqueo a IStiUSD mediante el método IStiUSD::LockDevice.
Si una aplicación bloquea exclusivamente un dispositivo WIA mediante el método IStiUSD::LockDevice , el servicio WIA no puede acceder al dispositivo hasta que esa aplicación llame al método IStiUSD::UnLockDevice . Si el servicio WIA no puede bloquear el dispositivo, el dispositivo no estará disponible para ninguna aplicación o controlador que dependa del servicio WIA.
El método IWiaMiniDrv::d rvLockWiaDevice siempre debe llamar al método IStiDevice::LockDevice y el método IWiaMiniDrv::d rvUnLockWiaDevice siempre debe llamar al método IStiDevice::UnLockDevice . Esto garantiza que el servicio WIA realice una administración de bloqueo adecuada para el dispositivo. La interfaz IStiDevice se pasa al controlador en llamadas al método IWiaMiniDrv::d rvInitializeWia . Esta interfaz debe almacenarse en caché y usarse para llamar al método IStiDevice::LockDevice . Este método llama al método IStiUSD::LockDevice del controlador.
Si se usa un valor BOOL para controlar el bloqueo, proteja este valor de varios subprocesos. Cuando dos controladores intentan bloquear un único dispositivo al mismo tiempo, solo un controlador puede realizarse correctamente.