Применение безопасного чтения для коллекции HID
В этой статье описывается, как приложение в пользовательском режиме или драйвер в режиме ядра может применять безопасное чтение для коллекции HID верхнего уровня.
Если для коллекции включена безопасная чтение, только доверенные клиенты (с привилегиями SeTcbPrivilege) могут получить входные данные из открытого файла коллекции. Драйверы режима ядра имеют привилегии SeTcbPrivilege по умолчанию, но приложения в режиме пользователя не выполняются. Сведения о получении привилегий системы в пользовательском режиме см. в документации по авторизации в пакете SDK для Microsoft Windows.
Этот механизм предоставляется в первую очередь таким образом, чтобы системные компоненты режима пользователя "доверенные" могли запретить приложениям в режиме пользователя без привилегий 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 файла. Когда драйвер обрабатывает запрос закрытия, он уменьшает безопасное число операций чтения для коллекции с помощью безопасного количества операций чтения для закрытого файла.