Freigeben über


InfVerif-Fehler 1330–1333

InfVerif-Fehler 1330 verhindert einen Funktionsfehler, bei dem eine Zieldatei von mehreren Quelldateien überschrieben wird. Zum Beispiel:

[CopyFiles.A]
DesiredFileName1,SourceFile1A ; Used by DDInstallSection A

[CopyFiles.B]
DesiredFileName1,SourceFile1B ; Used by DDInstallSection B

Wenn mehrere DDInstall-Abschnitte verschiedene Quelldateien mithilfe der CopyFiles-Anweisung in eine einzige Zieldatei kopieren, könnten diese CopyFiles-Elemente in Konflikt geraten, wenn die DDInstall-Abschnitte alle auf demselben System verarbeitet werden. Dies ist z. B. der Fall, wenn zwei verschiedene Geräte denselben Treiber, aber unterschiedliche Installationsabschnitte verwenden, oder in einigen Szenarien der Imageerstellung und Bereitstellung von Offlinetreibern. Da mehrere Quelldateien aus den verschiedenen DDInstall-Abschnitten in genau dieselbe Zieldatei kopiert werden, überschreiben sich die verschiedenen Quelldateien aus den verschiedenen DDInstall-Abschnitten gegenseitig, sodass die zuletzt kopierte Datei diejenige ist, die in der Zieldatei platziert wird, was möglicherweise nicht den erwarteten Ergebnissen entspricht.

Fälle

Dieses Dokument enthält Anleitungen zur Aktualisierung der alten Syntax auf Methoden, die den Funktionsfehler in den folgenden Fällen beseitigen. Im Folgenden sind nicht alle Fälle aufgeführt, da es für jeden INF-Fehler andere Gründe geben kann.

  • Verschiedene DDInstall-Abschnitte benennen eine Dienstbinärdatei für einen Dienst um.

  • Verschiedene DDInstall-Abschnitte benennen eine Quelldatei um, die in eine Zieldatei kopiert werden soll, auf die der Treiber oder eine Anwendung im Benutzermodus zugreift.

Verschiedene DDInstall-Abschnitte benennen eine Dienstbinärdatei für einen Dienst um.

Der folgende Code ist ein Beispiel dafür, wie verschiedene DDInstall-Abschnitte eine Dienstbinärdatei für einen Dienst umbenennen können:

[DDInstallSection_A]
CopyFiles = CopyFiles.A

[DDInstallSection_B]
CopyFiles = CopyFiles.B

[CopyFiles.A]
ServiceBinaryFile, ServiceBinaryA

[CopyFiles.B]
ServiceBinaryFile, ServiceBinaryB

[DDInstallSection_A.Services]
AddService = ServiceName, 0x00000002, ServiceName_Install

[DDInstallSection_B.Services]
AddService = ServiceName, 0x00000002, ServiceName_Install

[ServiceName_Install]
ServiceType    = 1
StartType      = 3
ErrorControl   = 0
ServiceBinary  = %12%\ServiceBinaryFile

Um diesen Code zu aktualisieren, erstellen Sie unterschiedliche Dienstnamen für die verschiedenen Binärdateien:

[DDInstallSection_A]
CopyFiles = CopyFiles.A

[DDInstallSection_B]
CopyFiles = CopyFiles.B

[CopyFiles.A]
ServiceBinaryA

[CopyFiles.B]
ServiceBinaryB

[DDInstallSection_A.Services]
AddService = ServiceName1, 0x00000002, ServiceName1_Install

[DDInstallSection_B.Services]
AddService = ServiceName2, 0x00000002, ServiceName2_Install

[ServiceName1_Install]
ServiceType    = 1
StartType      = 3
ErrorControl   = 0
ServiceBinary  = %12%\ServiceBinaryA

[ServiceName2_Install]
ServiceType    = 1
StartType      = 3
ErrorControl   = 0
ServiceBinary  = %12%\ServiceBinaryB

Verschiedene DDInstall-Abschnitte benennen eine Quelldatei um, die in eine Zieldatei kopiert werden soll, auf die der Treiber oder eine Anwendung im Benutzermodus zugreift.

In diesem Fall greift der Treiber auf einen festen Dateispeicherort zu, der als dynamischer Dateispeicherort verwendet wird. Um eine dynamische Variable zu haben, die mehrere Quelldateien nachverfolgt, können Sie einen AddReg-HKR-Eintrag verwenden, um den Pfad zu speichern, der zur Laufzeit abgerufen werden kann. Dies funktioniert, da AddReg-HKR-Einträge relativ zu einem Gerät gespeichert werden.

Der AddReg-HKR-Eintrag gibt die Dateispeicherorte für Quelldateien an, anstatt eine einzelne Zieldatei auszuwählen, in die die Quelldateien kopiert werden sollen:

[A.AddReg]
HKR,, FileName1Path, "%13%\SourceFile1A"

[B.AddReg]
HKR,, FileName1Path, "%13%\SourceFile1B"

Anstatt auf einen festen Dateispeicherort zuzugreifen, kann der Speicherort der Zieldatei über eine Einstellung auf dem Gerät abgerufen werden. Der Speicherort der Zieldatei wird von INF in einem Registrierungswert gespeichert und über API-Aufrufe im Treiber abgerufen.

Zum Bereitstellen der Werte über eine INF-Datei verwenden Sie die INF-AddReg-Anweisung mit reg-root-HKR-Einträgen in einem add-registry-section-Element, auf den von einem INF DDInstall-Abschnitt oder INF DDInstall.HW-Abschnitt verwiesen wird.

Da Registrierungswerte die Zieldatei anstelle eines einzelnen Zieldateispeicherorts nachverfolgen, muss der Treiber auf diese Dateien anders zugreifen. Für den Zugriff auf die Zieldatei muss der Treiber nun eine der folgenden APIs aufrufen, um den Registrierungswert zu öffnen und den Speicherort der Quelldatei zurückzugeben:

WDM

WDF

Anderer Benutzermoduscode

Hinweis

In diesem Beispiel wirkt sich der Zielspeicherort der Dateien mit der INF-Nutzlast nicht auf die Lösung aus. Um jedoch bewährte Methoden anzuwenden, wird in diesem Beispiel DIRID 13 verwendet, weil damit durch weniger Dateikopien schnellere Installationen möglich sind. Weitere Informationen finden Sie unter „Verwenden von DIRIDs“ und „Ausführen über den Treiberspeicher“.

Im folgenden Beispielcode wird das Aktualisieren einer INF-Datei gezeigt, die alte Syntax verwendet.

Details für verschiedene Quelldateien, die einer Zieldatei zugeordnet sind

Quellcode Kommentar
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Speicherort der Dateien manuell auswählen
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; HW Version A
DesiredFileName2,SourceFile2A ; HW Version A
[CopyFiles.B] DesiredFileName1,SourceFile1B ; HW Version B DesiredFileName2,SourceFile2B ; HW Version B

Methode zum Kopieren von Dateien: Umbenennen von Dateien, sodass der zu installierende DDInstall-Abschnitt die Quelldatei auswählt, die in den Zieldateipfad kopiert wird, mit dem der Treiber verknüpft ist.

Dies funktioniert nicht, wenn alle Dateien für alle DDInstall-Abschnitte vor der Installation kopiert werden.

Details für die Aktualisierung mittels AddReg-HKR-Einträgen

Quellcode Kommentar
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

Die bewährte Methode besteht darin, alles im Treiberspeicherverzeichnis zu belassen (Dirid 13).
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Fügen Sie einen AddReg-Abschnitt für jedes DDInstall Section.HW-Element hinzu, um die für diese Installation erforderlichen Dateien nachzuverfolgen.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Mehrere Quelldateispeicherorte, die einem Registrierungswert zugeordnet sind. Dies funktioniert, da HKR AddReg-Einträge aus einem DDInstall- oder DDInstall.HW-Abschnitt in den Geräteeinstellungen gespeichert werden. Wenn ein Gerät mit diesem Treiberpaket installiert wird, verwendet es nur einen der DDInstall-Abschnitte, sodass nur einer der HKR AddReg-Einträge verwendet wird und kein Konflikt vorliegt.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Alle Dateien werden ihrem eigenen Speicherort zugeordnet, sodass keine Funktionalitätsfehler auftreten und INF InfVerif besteht.
Verwenden Sie CopyFiles nicht, um eine Datei umzubenennen, für die DestinationDirs Dirid 13 enthält.

Zugriff auf den Dateispeicherort über den Treiber (Pseudocode)

Before (Fixed Filename):
    OpenFile(Path\DesiredFileName1)

After (Dynamic Filename):
    OpenDeviceRegistryKey(Device, &KeyHandle)
    RegistryKeyQueryValue(KeyHandle, FileNamePath1, &SourceFile)
    OpenFile(SourceFile)

Zugriff auf den Dateispeicherort über den Benutzermodus

Wenn Sie über den Benutzermodus auf die Zieldatei zugreifen, verfügen Sie nicht über den Gerätekontext, über den ein Treiber verfügt. In diesem Fall müssen Sie einen zusätzlichen Schritt hinzufügen. Suchen Sie vor dem Öffnen des Schlüsselhandles das Gerät, das den Registrierungswert enthält, der angibt, welche Datei geladen werden soll.

Unter Ausführen über den Treiberspeicher erfahren Sie, wie Sie eine Geräteliste filtern, um Ihr Gerät zu finden und das Handle für den Registrierungsspeicher im Benutzermodus zu öffnen, indem Sie Dirid 13 als bewährte Methode verwenden.

Fehler 1331–1333

Bei den Fehlern 1331–1333 handelt es sich um das gleiche Problem, das sich jedoch auf Registrierungswerte, Registrierungswerte innerhalb von Diensten bzw. Dienste bezieht. Die Beispiele in der Dokumentation für Fehler 1330 decken Methoden zum Beheben der Fehler 1331–1333 ab.