Обеспечение безопасного чтения для коллекции 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 файла. Когда драйвер обрабатывает запрос на закрытие, он уменьшает число безопасных операций чтения для коллекции на число безопасного чтения для закрываемого файла.