Что означает код HRESULT 0x80090026 (NTE_INVALID_HANDLE)?

 
Предыдущий Следующий
NTE_FIXEDPARAMETER NTE_INVALID_PARAMETER

NTE_INVALID_HANDLE

NTE_INVALID_HANDLE следует интерпретировать на границе срока жизни криптографического handle . Handle поставщика, ключа, hash или секрета устарел, относится к другому семейству API, уже закрыт либо используется в недопустимом состоянии. Полезный диагностический вопрос — какой конкретный объект и операция заставили Windows выбрать этот HRESULT, а не работает ли в целом некий ключ, сертификат, учётная запись, файл или устройство.

Найдите первую сбойную границу

При этом результате криптографические handle являются типизированными ссылками с состоянием. Числовое значение может оставаться ненулевым после освобождения объекта, принадлежать другому семейству API или быть недопустимым в другом пути владения. Отслеживайте создание и уничтожение, а не считайте любое значение, похожее на handle, действующим поставщиком, ключом, hash или secret.

Полезные наблюдения вместо общих журналов

ЗапишитеПочему это важно для данного кода
API, создавший handle, и API, который должен его использоватьПри этом результате это устанавливает тип объекта и владельца ссылки.
передача владения, дублирование, передача между потоками, порядок очистки и очистка в ветвях ошибокПри этом результате это выявляет использование после закрытия, двойную очистку и применение handle из другого семейства API.
является ли значение HCRYPT*, BCRYPT_* handle или NCRYPT_* handleПри этом результате это подтверждает, что сохранённый ключевой материал независим от ошибки срока жизни handle.

Проверки, специфичные для кода:

  • Отслеживайте создание, дублирование, передачу владения и уничтожение handle между потоками и во всех ветвях ошибок.
  • Проверьте, не смешиваются ли значения CryptoAPI HCRYPT* с handle CNG BCRYPT_* или NCRYPT_*.
  • Используйте Application Verifier или целевое журналирование срока жизни, чтобы обнаружить использование после закрытия и двойное закрытие.

Сопоставьте сбой с изменениями состояния

Для NTE_INVALID_HANDLE, сопоставьте последнюю успешную операцию с установкой или обновлением поставщика, созданием или обновлением ключа, изменениями профиля или сеанса, подключением и отключением устройства, обновлением политик и первым неудачным вызовом. При исследовании срока жизни handle порядок важен: ошибка сразу после миграции ключа указывает на другую границу, чем сбой после смены учётной записи службы.

  • Для этого результата подготовьте минимальный пример с именем API, поставщика, ключа или контейнера, флагами и размерами нечувствительных входных данных.
  • Для этого пути сохраните события поставщика, устройства, профиля и ОС за период от последнего успеха до первого сбоя.
  • Для этого пути сохраните заведомо исправный контрольный результат с той же идентичностью, архитектурой и выбором поставщика.

Воспроизведение без разрушительной очистки

Повторите операцию с заново полученным handle, весь срок жизни которого находится в одной небольшой области видимости. Если это работает, постепенно верните исходное совместное использование, кэширование и очистку. Такой тест информативнее открытия другого ключа и предположения о повреждении сохранённого объекта.

ТестИнтерпретация
Тот же ввод, заведомо исправный путьДля срока жизни криптографического handle успех переносит внимание на выбранного поставщика, политику, устройство, контекст или состояние транзакции.
Заведомо исправный ввод, сбойный путьДля срока жизни криптографического handle сбой указывает, что среда или выбранный объект самостоятельно не способны выполнить операцию.
Исходный путь после одного изолированного измененияДля срока жизни криптографического handle это сравнение показывает, устраняет ли предложенное исправление исходное условие.

Чем это отличается от похожих сбоев

Этот результат не доказывает повреждение ключевого материала; обычно проблема относится к ссылке на объект, которой владеет вызывающая сторона. Не записывайте только сырое значение handle: повторное использование значений средой выполнения может сделать разные объекты визуально одинаковыми во времени. Сопоставляйте значение с последовательным номером создания и типом объекта.

Для срока жизни криптографического handle также сохраняйте исходное числовое значение: соседние константы могут требовать существенно разного восстановления, даже если приложение показывает их все как ошибку аутентификации, сертификата или безопасности.

Регрессионная проверка

Для этого результата исправление подтверждено, когда владение handle явно определено, очистка выполняется один раз и в правильном порядке, а то же семейство API стабильно выполняет исходную операцию под нагрузкой и при внедрении сбоев. Для NTE_INVALID_HANDLE, сохраните регрессионный тест с нечувствительными идентификаторами и ожидаемыми результатами, включая один отрицательный контроль, который должен по-прежнему завершаться ошибкой.

Технические ссылки

Для NTE_INVALID_HANDLE, эти источники определяют HRESULT и соответствующий интерфейс, протокол или формат данных срока жизни криптографического handle.


Нужно найти другой код? Найти другой код состояния или ошибки.