強制執行 HID 集合的安全讀取
本文說明使用者模式應用程式或內核模式驅動程式如何強制執行最上層 HID 集合的安全讀取。
如果為集合啟用安全讀取,則只有「信任」用戶端(具有 SeTcbPrivilege 許可權的用戶端)可以從集合的開啟檔案取得輸入。 核心模式驅動程序預設具有 SeTcbPrivilege 許可權,但使用者模式應用程式不會。 如需如何在使用者模式中取得系統許可權的資訊,請參閱 Microsoft Windows SDK 檔中的授權相關信息。
此機制主要是提供,讓「受信任的」使用者模式系統元件可防止使用者模式應用程式在重要系統作業期間從集合取得輸入,而不需要 SeTcbPrivilege 許可權。 例如,「受信任的」使用者模式系統元件可以防止使用者模式應用程式沒有 SeTcbPrivilege 許可權,而無法取得使用者在登入作業期間提供的機密資訊。
「信任」用戶端會使用IOCTL_HID_ENABLE_SECURE_READ和IOCTL_HID_DISABLE_SECURE_READ要求來啟用和停用集合的安全讀取。 如果沒有 SeTcbPrivilege 許可權的用戶端使用這些要求,要求不會變更集合的安全讀取狀態,而 HID 類別驅動程式會傳回狀態值 STATUS_PRIVILEGE_NOT_HELD。
啟用和停用集合的安全讀取的運作方式如下:
HID 類別驅動程式會針對集合的每個開啟檔案維護檔案特定的安全讀取計數。 HID 類別驅動程式也會維護集合的安全讀取計數,這是檔案特定安全讀取計數的總和。 建立集合時,集合的安全讀取計數會初始化為零,而開啟檔案時,檔案的安全讀取計數會初始化為零。
當 HID 類別驅動程式收到檔案的啟用要求時,它會遞增 1 檔案的安全讀取計數(並將集合的安全讀取計數遞增 1。
當 HID 類別驅動程式收到檔案的停用要求時:
- 如果檔案的安全讀取計數大於零,驅動程式會將檔案的安全讀取計數遞減 1(並將集合的安全讀取計數遞減 1)。
- 如果檔案的安全讀取計數等於零,驅動程式就不會變更安全讀取計數。
如果集合的安全讀取計數大於零,HID 類別驅動程式會強制執行集合的安全讀取。 否則,驅動程式不會強制執行集合的安全讀取。
客戶端應該使用停用要求來取消對應的啟用要求。 不過,如果用戶端未這麼做,HID 類別驅動程式會在處理 檔案IRP_MJ_CLOSE 要求時,適當地遞減集合的安全讀取計數。 當驅動程式處理關閉要求時,它會將關閉檔案的安全讀取計數遞減集合的安全讀取計數。