Рекомендации по использованию SetupAPI

Ниже приведены рекомендации по использованию общих функций установки (SetupXxx) и функций установки устройств (SetupDiXxx), предоставляемых Программой установкиAPI.

  • Никогда не предполагайте, что содержимое файла установки не содержит ошибок или что указанный файл установки не был изменен злоумышленником. Поэтому всегда проверяйте все сведения, полученные от функций SetupAPI. Убедитесь, что строки имеют допустимую длину, буферы допустимого размера и что значения индекса находятся в допустимом диапазоне.

  • При написании приложений установки для установок в Системах Microsoft Windows XP и более поздних версий можно вызвать setupVerifyInfFile (описанный в документации по Windows SDK), который проверяет, не был ли изменен INF-файл с цифровой подписью.

  • Всегда проверяйте возвращаемое значение каждой функции SetupAPI. Если функция завершается сбоем, код должен вызвать GetLastError , чтобы получить код ошибки, который идентифицирует сбой. Возвращаемые коды ошибок можно определить в Winerror.h или Setupapi.h. Перед вызовом FormatMessage с FORMAT_MESSAGE_FROM_SYSTEM для создания текстового отображения всегда используйте макрос HRESULT_FROM_SETUPAPI (определенный в Winerror.h) для преобразования возвращаемого значения в значение HRESULT. Если функция SetupAPI возвращает успешно, код не должен вызывать GetLastError. (Функции GetLastError и FormatMessage вместе с кодами системных ошибок описаны в документации windows SDK.)

  • Если функция SetupAPI возвращает дескриптор, код должен проверка возвращаемого значения INVALID_HANDLE_VALUE. Такие функции не возвращают значение NULL.

  • Имейте в виду следующее различие между функциями SetupDiXxx и SetupXxx , которые позволяют вызывающему объекту запрашивать требуемый размер буфера.

    • Если вызывающий объект функции SetupDiXxx создает такой запрос, GetLastError всегда возвращает ERROR_INSUFFICIENT_BUFFER.

    • Если вызывающий объект функции SetupXxx создает такой запрос, GetLastError возвращает NO_ERROR, если длина буфера не указана, или ERROR_INSUFFICIENT_BUFFER, если буфер был указан слишком маленьким.