Freigeben über


Abrufen des ursprünglichen Quellpfads einer installierten INF-Datei

In diesem Thema wird beschrieben, wie Sie den ursprünglichen Quellpfad einer INF-Datei abrufen können, die im System-INF-Verzeichnis installiert ist. Obwohl es keine SetupAPI-Funktion gibt, um diesen Abruf direkt auszuführen, können Sie den Abruf indirekt durchführen, indem Sie Einträge in eine INF-Datei einschließen, sodass die SetupAPI-Funktionen, die auf INF-Dateieinträge zugreifen, verwendet werden können, um die ursprünglichen Quellpfadinformationen aus einer installierten INF-Datei abzurufen.

Diese Methode funktioniert nur für INF-Dateien, die im SYSTEM-INF-Dateiverzeichnis installiert sind. Sie können diese Methode nicht für INF-Dateien verwenden, die im Treiberspeicher vorhanden sind.

Das Co-Installationsprogramm, das mit dem Toasterbeispiel im Windows Driver Kit (WDK) bereitgestellt wird, verwendet diese Methode, und dieses Thema enthält Auszüge aus dem Toasterbeispiel, die diese Methode zeigen. Weitere Informationen zum Toasterbeispiel finden Sie unter toasterpkg.htm, das im Verzeichnis src\general\toaster des WDK bereitgestellt wird.

Gehen Sie wie folgt vor, um mit dieser Methode den ursprünglichen Quellpfad einer installierten INF-Datei abzurufen:

  1. Fügen Sie in die INF-Datei einen Abschnitt ein, der einen Eintrag enthält, dessen erstes Feld das Zeichenfolgenschlüsseltoken %1% ist. Standardmäßig stellt das Zeichenfolgenschlüsseltoken %1% den ursprünglichen Quellpfad der INF-Datei dar. Wenn Windows eine solche INF-Datei installiert, wird die ursprüngliche Quellpfadzeichenfolge mit der installierten Version der INF-Datei gespeichert. Beachten Sie, dass diese Methode nur funktioniert, wenn %1% wie in diesem Beispiel gezeigt verwendet wird. Im Allgemeinen ist das, was %1% in aufgelöst wird, kontextabhängig. Beispielsweise wird ein %1%-Feld in einem Add-Registry-Abschnittseintrag nicht in den ursprünglichen Quellpfad aufgelöst. stattdessen wird %1% in diesem Kontext in den Pfad der entsprechenden INF-Datei im Treiberspeicher aufgelöst.

  2. Verwenden Sie SetupOpenInfFile, SetupFindFirstLine und SetupGetStringField , um den ursprünglichen Quellpfad aus dem Eintrag abzurufen, der das Zeichenfolgenschlüsseltoken %1% enthält.

Beispielsweise enthält toasterpkg.inf den folgenden Abschnitt [ToasterCoInfo] mit einem benutzerdefinierten OriginalInfSourcePath-Eintrag, dessen erstes Feld das Zeichenfolgenschlüsseltoken %1% ist.

[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%

Wenn ein INF wie im Toasterbeispiel dargestellt konfiguriert ist, können Sie den ursprünglichen Quellpfad abrufen, nachdem Sie die INF-Datei im System-INF-Verzeichnis installiert haben. Um den ursprünglichen Quellpfad abzurufen, rufen Sie zuerst SetupOpenInfFile auf, um die installierte INF-Datei zu öffnen. Im folgenden Codebeispiel aus toastco.c wird beispielsweise die installierte Datei toasterpkg.inf geöffnet.

// 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
                        );

Rufen Sie nach dem Öffnen der installierten INF-Datei SetupFindFirstLine auf, um die erste Zeile des Abschnitts abzurufen, die den Eintrag enthält, dessen erstes Feld das Zeichenfolgenschlüsseltoken %1% ist. Rufen Sie als Nächstes SetupGetStringField auf, um das erste Feld dieses Eintrags abzurufen und den ursprünglichen Quellpfad der INF-Datei abzurufen. Das folgende Codebeispiel ruft beispielsweise aus toastco.c die Zeile ab, die den benutzerdefinierten OriginalInfSourcePath-Eintrag enthält, und ruft dann das erste Feld dieses Eintrags ab. Da das erste Feld im ursprünglichen INF das Zeichenfolgenschlüsseltoken %1% ist, gibt SetupGetStringField den ursprünglichen Quellpfad der INF-Datei zurück.

// 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;