SetupAPI の使用に関するガイドライン

SetupAPI によって提供される一般的なセットアップ関数 (SetupXxx) とデバイス インストール関数 (SetupDiXxx) を使用するためのガイドラインを次に示します。

  • インストール ファイルの内容にエラーがない、または指定したインストール ファイルが悪意を持って変更されていないと思い込まないでください。 そのため、SetupAPI 関数から受信したすべての情報を常に検証します。 文字列が有効な長さであること、バッファーが有効なサイズであること、およびインデックス値が有効な範囲内にあることを確認します。

  • Microsoft Windows XP 以降のシステムでのインストール用のインストール アプリケーションを記述する場合は、SetupVerifyInfFile (Windows SDK ドキュメントに記載) を呼び出して、デジタル署名された INF ファイルが変更されていないことを確認できます。

  • 各 SetupAPI 関数の戻り値を常にテストします。 関数が失敗した場合、コードは GetLastError を呼び出して、エラーを識別するエラー コードを取得する必要があります。 返されるエラー コードは、Winerror.h または Setupapi.h で定義できます。 FORMAT_MESSAGE_FROM_SYSTEMで FormatMessage を呼び出してテキスト表示を作成する前に、必ず 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 を返します。