鎖定和解除鎖定最佳做法
WIA 驅動程式的 STI 部分鎖定需要特別注意。 雖然應用程式可以直接存取已發佈的 STI 介面,但這類直接存取裝置可能會誤用。 不正確地實作的鎖定技術可能會讓裝置開放給拒絕服務, (DoS) 攻擊。
針對 STI 應用程式
下列清單包含使用 STI 應用程式時應遵循的預防措施和指導方針:
不要長時間保留鎖定。
如果您不需要直接存取裝置,可能可以使用 WIA 介面方法來取得相同的資訊。 這是較佳的,因為 WIA 服務接著會為您控制鎖定。
使用 STI 的 TWAIN 驅動程式會使用 IStiUSD::LockDevice 方法來控制裝置的存取。 當 TWAIN 驅動程式使用 STI 時,TWAIN 驅動程式會負責控制鎖定時間。
您可以建立它,使其只實作 IStiUSD 介面方法。 此方法的缺點是應用程式可以直接呼叫 IStiUSD::LockDevice ,藉此鎖定裝置以供應用程式獨佔使用。 Windows 硬體品質實驗室不會認證使用這項技術的驅動程式;這類驅動程式只能安裝為未簽署的驅動程式。
適用于 WIA 驅動程式
下列清單包含使用 WIA 驅動程式時應遵循的預防措施和指導方針:
在長時間鎖定期間監視裝置的活動。 如果沒有活動,驅動程式應該解除鎖定裝置,並允許其他用戶端連線。 例如,如果驅動程式正在掃描非常大的影像,或擷取影像所花費的時間異常長,則驅動程式不應該解除鎖定裝置。 這會中斷目前的會話。 視裝置及其運作所在的匯流排而定,非常大的映射可能位於 10 MB 到超過 GB 的任何位置,而且很長的時間可能會從 500 毫秒到超過一分鐘。 您應該對裝置及其運作所在的匯流排進行基準測試,以便知道這些特定值適用于您的裝置。
使用 WIA 的應用程式不會存取驅動程式的鎖定方法 IWiaMiniDrv::d rvLockWiaDevice 和 IWiaMiniDrv::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 值來控制鎖定,請保護此值免于多個執行緒。 當兩個驅動程式嘗試同時鎖定單一裝置時,只有一個驅動程式可以成功。