インストール済みの INF ファイルの元のソース パスの取得
このトピックでは、システム INF ディレクトリにインストールされている INF ファイルの元のソース パスを取得する方法について説明します。 この取得を直接実行する SetupAPI 関数はありませんが、INF ファイルのエントリにアクセスする SetupAPI 関数を使用して、インストールされている INF ファイルから元のソース パス情報を取得できるように、INF ファイルにエントリを含めることで間接的に取得を実行できます。
この方法は、システム INF ファイル ディレクトリにインストールされている INF ファイルに対してのみ機能します。 ドライバー ストアに存在する INF ファイルには、この方法を使用できません。
Windows Driver Kit (WDK) のトースター サンプルに付属する共同インストーラーでは、この方法を使用します。このトピックには、この方法を示すトースター サンプルからの抜粋が含まれています。 トースター のサンプルの詳細については、WDK の src\general\toaster ディレクトリに用意されているtoasterpkg.htmを参照してください。
この方法を使用して、インストールされている INF ファイルの元のソース パスを取得するには、次の操作を行います。
INF ファイルに、最初のフィールドが %1% 文字列キー トークンであるエントリを含むセクションを含めます。 既定では、%1% 文字列キー トークンは INF ファイルの元のソース パスを表します。 Windows は、このような INF ファイルをインストールすると、インストールされているバージョンの INF ファイルと共に元のソース パス文字列を保存します。 この方法は、この例に示すように %1% が使用されている場合にのみ機能します。 一般に、%1% が解決する内容はコンテキストに依存します。 たとえば、追加レジストリ セクション エントリの %1% フィールドは元のソース パスに解決されません。代わりに、このコンテキストの %1% はドライバー ストア内の対応する INF ファイルのパスに解決されます。
SetupOpenInfFile、SetupFindFirstLine、SetupGetStringField を使用して、%1% 文字列キー トークンを含むエントリから元のソース パスを取得します。
たとえば、toasterpkg.inf には、次の [ToasterCoInfo] セクションと、最初のフィールドが %1% 文字列キー トークンであるカスタム OriginalInfSourcePath エントリが含まれています。
[ToastCoInfo]
; Used by the toaster co-installer to figure out where the original media is
; located (so it can start value-added setup programs).
OriginalInfSourcePath = %1%
トースター のサンプルに示すように INF が構成されている場合は、システム INF ディレクトリに INF ファイルをインストールした後、元のソース パスを取得できます。 元のソース パスを取得するには、まず SetupOpenInfFile を呼び出して、インストールされている INF ファイルを開きます。 たとえば、toastco.c の次のコード例では、インストールされている toasterpkg.inf ファイルを開きます。
// Since the INF is already in %SystemRoot%\Inf, we need to find out where it
// originally came from. There is no direct way to ascertain an INF's
// path of origin, but we can indirectly determine it by retrieving a field
// from our INF that uses a string substitution of %1% (DIRID_SRCPATH).
//
hInf = SetupOpenInfFile(DriverInfoDetailData->InfFileName,
NULL,
INF_STYLE_WIN4,
NULL
);
インストールされている INF ファイルを開いた後、SetupFindFirstLine を呼び出して、最初のフィールドが %1% 文字列キー トークンであるエントリを含むセクションの最初の行を取得します。 次に、SetupGetStringField を呼び出して、このエントリの最初のフィールドを取得し、INF ファイルの元のソース パスを取得します。 たとえば、toastco.c の次のコード例では、カスタム OriginalInfSourcePath エントリを含む行を取得し、このエントリの最初のフィールドを取得します。 元の INF の最初のフィールドは %1% 文字列キー トークンであるため、 SetupGetStringField は INF ファイルの元のソース パスを返します。
// Contained within our INF should be a [ToastCoInfo] section with the
// following entry:
//
// OriginalInfSourcePath = %1%
//
// If we retrieve the value (i.e., field 1) of this line, we'll get the
// full path where the INF originally came from.
//
if(!SetupFindFirstLine(hInf, L"ToastCoInfo", L"OriginalInfSourcePath", &InfContext)) {
goto clean0;
}
if(!SetupGetStringField(&InfContext, 1, *MediaRootDirectory, MAX_PATH, &PathLength) ||
(PathLength <= 1)) {
goto clean0;