Что означает код HRESULT 0x80090028 (NTE_BUFFER_TOO_SMALL)?

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

NTE_BUFFER_TOO_SMALL

NTE_BUFFER_TOO_SMALL указывает на сбой на этапе определения размера вывода. Целевой буфер не вмещает результат или значение свойства; обычно это происходит, если вызывающая сторона пропустила запрос требуемого размера или использовала устаревшую длину после изменения параметров. Диагностируйте определение размера вывода в первом компоненте, вернувшем значение, а не в последнем слое интерфейса: последующая очистка и резервные попытки могут породить другие вторичные ошибки.

Читайте результат на правильном уровне

При этом результате многие криптографические API Windows используют предоставленные вызывающей стороной байтовые буферы со строгими правилами размеров и aliasing. Ёмкость, единицы байт/символ, двухпроходные запросы размера, увеличение из-за padding и допустимые схемы in-place входят в контракт вызова. Исследуйте диапазоны адресов и длины, а не только равенство указателей или номинальный размер массива.

Сформируйте запись инцидента

  • Базовые адреса входного и выходного буферов, длины в байтах и занимаемые каждым диапазоны
    Вызовите API в документированном режиме запроса размера и сохраните возвращённое число байтов.
    Для этого результата это позволяет отличить недостаточную ёмкость от перекрытия диапазонов памяти.
  • Размер, возвращённый проходом запроса размера, и все параметры, изменённые перед проходом с данными
    Различайте количество символов и байтов и учитывайте завершающие символы только там, где это требует API.
    При этом результате это выявляет устаревшие значения длины после изменения параметров или состояния ключа.
  • Алгоритм, режим, padding, tag, свойства и специфичные для поставщика правила in-place
    Не предполагайте, что размер прежнего ciphertext, подписи, key blob или свойства остаётся верным для нового алгоритма или ключа.
    При этом результате это показывает, поддерживает ли поставщик предлагаемую схему in-place.

Сохраните цепочку доказательств

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

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

Используйте две оси сравнения

При этом результате выделите отдельные входной и выходной буферы по последнему размеру, возвращённому с тем же ключом и набором параметров. Сохраните исходный ввод, выполните операцию один раз и сравните сообщённые длины. Поведение in-place проверяйте только если API явно его документирует.

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

Не смешивайте с соседним кодом

В отличие от NTE_BUFFERS_OVERLAP, этот результат относится к ёмкости, а не к aliasing диапазонов источника и назначения. Больший буфер не устраняет запрещённое перекрытие, а раздельные буферы не исправляют недостаточную ёмкость. Не меняйте обе гипотезы одновременно в одном тесте.

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

Проверка после изменения

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

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

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


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