Рекомендации по блокировке и разблокировке
Блокировка части драйвера WIA с ИППП требует особого внимания. Несмотря на то, что приложение может напрямую обращаться к опубликованным интерфейсам STI, такой прямой доступ к устройству можно использовать неправильно. Методы блокировки, которые реализованы неправильно, могут оставить устройство открытым для атак типа "отказ в обслуживании" (DoS).
Для приложений STI
В следующем списке приведены меры предосторожности и рекомендации, которые следует соблюдать при использовании приложений ИППП.
Не удерживайте блокировки в течение длительного периода времени.
Если вам не нужен прямой доступ к устройству, можно получить те же сведения с помощью методов интерфейса WIA. Это предпочтительнее, так как служба WIA затем управляет блокировкой.
Драйверы TWAIN, использующие STI, используют метод IStiUSD::LockDevice для управления доступом к устройству. Когда драйвер TWAIN использует STI, драйвер TWAIN отвечает за управление временем блокировки.
Его можно создать таким образом, чтобы он реализовыв только методы интерфейса IStiUSD . Недостаток этого подхода заключается в том, что приложение может вызывать IStiUSD::LockDevice напрямую, тем самым блокируя устройство для монопольного использования приложением. Лаборатория качества оборудования Windows не сертифицировать драйверы, использующие этот метод; такие драйверы можно установить только как неподписанные драйверы.
Для драйверов WIA
В следующем списке приведены меры предосторожности и рекомендации, которые следует соблюдать при работе с драйверами WIA.
Мониторинг активности устройства во время длительных периодов блокировки. Если действия отсутствуют, драйвер должен разблокировать устройство и разрешить подключение другим клиентам. Драйвер не должен разблокировать устройство, например, если он сканирует очень большое изображение или если получение изображения занимает необычно много времени. Это прерывает текущий сеанс. В зависимости от устройства и автобуса, на которой оно работает, очень большое изображение может быть от 10 мегабайт до более чем гигабайт, а длительный период времени может составлять от 500 миллисекунд до более чем за минуту. Вы должны тестировать свое устройство и шину, на которой оно работает, чтобы вы знали, какие именно эти значения для вашего устройства.
Приложения, использующие WIA, не обращаются к методам блокировки драйвера IWiaMiniDrv::d rvLockWiaDevice и IWiaMiniDrv::d rvUnLockWiaDevice. Только служба WIA вызывает эти методы блокировки, а служба WIA распространяет вызовы блокировки в IStiUSD с помощью метода IStiUSD::LockDevice .
Если приложение блокирует устройство WIA исключительно с помощью метода IStiUSD::LockDevice , служба WIA не сможет получить доступ к устройству, пока это приложение не вызовет метод IStiUSD::UnLockDevice . Если служба WIA не может заблокировать устройство, устройство будет недоступно ни для приложений, ни для драйверов, использующих службу WIA.
Метод IWiaMiniDrv::d rvLockWiaDevice должен всегда вызывать метод IStiDevice::LockDevice , а метод IWiaMiniDrv::d rvUnLockWiaDevice должен всегда вызывать метод IStiDevice::UnLockDevice . Это гарантирует, что служба WIA выполняет надлежащее управление блокировкой для устройства. Интерфейс IStiDevice передается драйверу в вызовах метода IWiaMiniDrv::d rvInitializeWia . Этот интерфейс следует кэшировать и использовать для вызова метода IStiDevice::LockDevice . Этот метод вызывает метод IStiUSD::LockDevice вашего драйвера.
Если для управления блокировкой используется значение BOOL, защитите это значение от нескольких потоков. Если два драйвера пытаются заблокировать одно устройство одновременно, только один драйвер может быть успешным.