ロックおよびロック解除のベスト プラクティス
WIA ドライバーの STI 部分のロックには、特別な注意が必要です。 アプリケーションは公開されている STI インターフェイスに直接アクセスすることが可能ですが、当該デバイスへの直接アクセスが誤用される可能性があります。 ロック技術が正しく実装されていないと、デバイスがサービス拒否 (DoS) 攻撃にさらされる可能性があります。
STI アプリケーションの場合
STI アプリケーションを使用する際には、次の注意事項とガイドラインの一覧に従ってください。
長時間ロックを保持しないでください。
デバイスに直接アクセスする必要がない場合は、WIA インターフェイスのメソッドを使用することで、同じ情報を得られる可能性があります。 WIA サービスがロックを制御するため、この方法が推奨されます。
STI を使用する TWAIN ドライバーは、IStiUSD::LockDevice メソッドを使用してデバイスへのアクセスを制御します。 TWAIN ドライバーが STI を使う場合、ロック時間の管理は TWAIN ドライバー側で行う必要があります。
IStiUSD インターフェイス メソッドのみを実装するように作成できます。 この方法の欠点は、アプリケーションが直接 IStiUSD::LockDevice を呼び出すことができ、その結果、アプリケーションによってデバイスが排他的に使用されるようにロックされてしまうことです。 この手法を使うドライバーは、Windows ハードウェア品質ラボの認定を受けられないため、署名されていないドライバーとしてインストールする必要があります。
WIA ドライバーの場合
WIA ドライバーを使用する際には、次の注意事項とガイドラインの一覧に従ってください。
長いロック期間中にデバイスのアクティビティを監視します。 アクティビティがない場合、ドライバーはデバイスのロックを解除して、他のアプリケーションが接続できるようにする必要があります。 ドライバーは、たとえば非常に大きな画像をスキャンしている場合や、画像の取得に異常に時間がかかっている場合は、デバイスのロックを解除しないようにする必要があります。 これにより、現在のセッションが中断されます。 使用するデバイスやそのデバイスが動作するバス環境によっては、極めて大容量の画像が 10 メガバイトから 1 ギガバイトを超える規模になる可能性があります。また、長期間の処理に要する時間が 500 ミリ秒を下回ることもあれば、1 分を超えるケースもあり得ます。 デバイスとその動作するバスのベンチマーク テストを実施することで、デバイス固有の具体的な値を把握することができます。
WIA を使用するアプリケーションは、ドライバーのロック方法である IWiaMiniDrv::drvLockWiaDevice および IWiaMiniDrv::drvUnLockWiaDevice にアクセスしません。 これらのロック方法は 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 値を使用する場合は、この値を複数のスレッドから保護する必要があります。 2 つのドライバーが同時に同じデバイスをロックしようとしても、成功できるのは 1 つのドライバーのみです。