Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
InfVerif-Fehler 1330 verhindert einen funktionsübergreifenden Fehler, bei dem eine Zieldatei von mehreren Quelldateien überschrieben wird. 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-Direktive in eine einzelne Zieldatei kopieren, könnten diese CopyFiles in Konflikt geraten, wenn die DDInstall-Abschnitte alle auf demselben System verarbeitet werden. Beispiele hierfür sind, wenn zwei verschiedene Geräte denselben Treiber, aber unterschiedliche Installationsabschnitte oder in einigen Szenarien für die Imageerstellung und Bereitstellung von Offlinetreibern verwenden. Da mehrere Quelldateien aus den verschiedenen DDInstall-Abschnitten in die gleiche genaue einzelne Zieldatei kopiert werden, überschreiben sich die verschiedenen Quelldateien aus unterschiedlichen DDInstall-Abschnitten gegenseitig, sodass die letzte kopierte Datei der am Ziel platzierte ist, was möglicherweise nicht die erwarteten Ergebnisse sein kann.
Fälle
Dieses Dokument enthält Anleitungen zum Aktualisieren der alten Syntax auf Methoden, die den Funktionsfehler für die folgenden Fälle entfernen. Nicht alle Fälle sind unten aufgeführt, da es andere Gründe für jeden INF geben könnte.
Verschiedene DDInstall-Abschnitte benennen eine Dienst-Binärdatei für einen Dienst um.
Verschiedene DDInstall-Abschnitte benennen eine Quelldatei um, damit sie an einen Zieldateispeicherort kopiert wird, auf den der Treiber oder eine Anwendung im Benutzermodus zugreift.
Verschiedene DDInstall-Abschnitte benennen eine Dienst-Binärdatei für einen Dienst um.
Der folgende Code ist ein Beispiel dafür, wie verschiedene DDInstall-Abschnitte eine Dienst-Binä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, damit sie an einem Zieldateispeicherort kopiert wird, auf den 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 von einer Einstellung auf dem Gerät abgerufen werden. Der Zieldateispeicherort wird von der INF in einem Registrierungswert gespeichert und über API-Aufrufe im Treiber abgerufen.
Verwenden Sie die INF-AddReg-Direktive mit HKR-Reg-Root-Einträgen in einem Add-Registry-Abschnitt, auf den von einem INF-DDInstall-Abschnitt oder INF-DDInstall.HW-Abschnitt verwiesen wird, um die Werte bereitzustellen.
Da Registrierungswerte die Zieldatei anstelle eines einzelnen Zieldateispeicherorts nachverfolgen, muss der Treiber auf diese Dateien anders zugreifen. Um auf die Zieldatei zuzugreifen, muss der Treiber jetzt einen der folgenden APIs aufrufen, um den Registrierungswert zu öffnen und den Speicherort dieser Quelldatei zurückzugeben:
WDM
WDF
Anderer Benutzermoduscode
Hinweis
In diesem Beispiel beeinflusst der Zielspeicherort der Dateien der INF-Nutzlasten die Lösung nicht. Um jedoch bewährte Methoden zu verwenden, verwendet das Beispiel DIRID 13, da es schnellere Installationen durch weniger Dateikopien bereitstellt. Weitere Informationen finden Sie unter "Verwenden von DIRIDs" und "Ausführen aus dem Treiberspeicher".
Im folgenden Beispielcode wird gezeigt, wie Sie eine INF aktualisieren, die alte Syntax verwendet.
Details zu verschiedenen Quelldateien, die einer Zieldatei zugeordnet sind
| Quellcode | Kommentar |
|---|---|
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12 |
Auswählen, wo Dateien manuell verschoben werden |
[CopyFiles.A] DesiredFileName1,SourceFile1A ; HW Version A DesiredFileName2,SourceFile2A ; HW Version A |
Dateikopietechnik: Umbenennen von Dateien, sodass der zu installierende DDInstall-Abschnitt die Quelldatei auswählt, um in den Zieldateipfad kopiert zu werden, mit dem der Treiber verknüpft ist. Dies funktioniert nicht, wenn alle Dateien für alle DDInstall-Abschnitte vor der Installation kopiert werden. |
Details zur Aktualisierung mithilfe von AddReg HKR-Einträge
| Quellcode | Kommentar |
|---|---|
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 |
Bewährte Methode besteht darin, alles im Treiberspeicherverzeichnis zu belassen (Dirid 13) |
[DDInstallSection_A] CopyFiles = CopyFiles.A |
Fügen Sie einen AddReg-Abschnitt für jeden DDInstall Section.HW hinzu, um die für diese Installation erforderlichen Dateien nachzuverfolgen. |
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A" |
Mehrere Quelldateispeicherorte, die einem Registrierungswert zugeordnet sind. Dies funktioniert, weil HKR AddReg aus einem DDInstall- oder DDInstall.HW-Abschnitt in den Geräteeinstellungen gespeichert wird. Wenn ein Gerät mit diesem Treiberpaket installiert wird, verwendet es nur einen der DDInstall-Abschnitte, sodass nur eins der HKR-AddReg verwendet wird und kein Konflikt vorliegt. |
[CopyFiles.A] SourceFile1A ; HW Version A SourceFile2A ; HW Version A |
Alle Dateien werden ihrem eigenen Speicherort zugeordnet, sodass keine Funktionalitätsfehler auftreten und INF InfVerif übergibt. 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)
Zugreifen 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 aus dem 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 für bewährte Methoden verwenden.
Fehler 1331 - 1333
Fehler 1331 - 1333 sind dasselbe Problem, beziehen sich jedoch auf registy-Werte, Registrierungswerte innerhalb von Diensten und Diensten. Die Beispiele in der Dokumentation für Fehler 1330 decken Techniken zum Beheben von Fehlern 1331 - 1333 ab.