Sdílet prostřednictvím


Chyba InfVerif 1330 – 1333

InfVerif Chyba 1330 pomáhá zabránit funkční chybě, kdy se jeden cílový soubor přepíše více zdrojovými soubory. Například:

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

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

Pokud několik oddílů DDInstall kopíruje různé zdrojové soubory do jednoho cílového souboru pomocí direktivy CopyFiles, může dojít ke konfliktu, pokud se všechny oddíly DDInstall zpracovávají ve stejném systému. Příkladem je situace, kdy dvě různá zařízení používají stejný ovladač, ale liší se oddíly instalace nebo v některých scénářích nasazení offline ovladačů. Vzhledem k tomu, že se několik zdrojových souborů z různých oddílů DDInstall zkopíruje do stejného přesného cílového souboru, přepíšou se různé zdrojové soubory z různých oddílů DDInstall tak, aby poslední zkopírovaný soubor byl umístěn v cíli, což nemusí být očekávané výsledky.

Případy

Tento dokument obsahuje pokyny, jak aktualizovat starou syntaxi na metody, které odeberou funkční chybu v následujících případech. Ne všechny případy jsou uvedené níže, protože můžou existovat další důvody specifické pro jednotlivé INF.

  • Různé oddíly DDInstall přejmenují binární soubor služby pro jednu službu.

  • Různé oddíly DDInstall přejmenují zdrojový soubor, aby se zkopíroval do cílového umístění souboru, ke které přistupuje ovladač nebo aplikace v uživatelském režimu.

Různé oddíly DDInstall přejmenují binární soubor služby pro jednu službu.

Následující kód je příkladem toho, jak různé oddíly DDInstall mohou přejmenovat binární soubor služby pro jednu službu:

[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

Pokud chcete tento kód aktualizovat, vytvořte pro různé binární soubory různé názvy služeb:

[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

Různé oddíly DDInstall přejmenují zdrojový soubor, aby se zkopíroval do cílového umístění souboru, ke které přistupuje ovladač nebo aplikace v uživatelském režimu.

V tomto případě ovladač přistupuje k určenému umístění souboru, které je využíváno jako dynamické umístění souboru. Pokud chcete mít jednu dynamickou proměnnou, která sleduje více zdrojových souborů, můžete k uložení cesty, kterou je možné načíst za běhu, použít položku AddReg HKR. To funguje, protože položky AddReg HKR jsou uložené vzhledem k zařízení.

Položka AddReg HKR určuje umístění souborů pro zdrojové soubory místo výběru jednoho cílového souboru ke zkopírování zdrojových souborů do:

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

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

Místo přístupu k pevnému umístění souboru je možné umístění cílového souboru načíst z nastavení v zařízení. Cílové umístění souboru je uloženo v hodnotě registru INF a získáno prostřednictvím rozhraním API v ovladači.

Pokud chcete zřídit hodnoty prostřednictvím INF, použijte direktivu INF AddReg pomocí položek registru HKR v oddílu add-registry odkazovaném z oddílu INF DDInstall nebo INF DDInstall.HW oddílu.

Vzhledem k tomu, že hodnoty registru sledují cílový soubor místo jednoho cílového umístění souboru, bude muset ovladač přistupovat k těmto souborům jinak. Pro přístup k cílovému souboru teď ovladač potřebuje zavolat do jednoho z následujících rozhraní API, aby otevřel hodnotu registru a vrátil umístění tohoto zdrojového souboru:

model WDM

WDF

Jiný kód uživatelského režimu

Poznámka:

V tomto příkladu nemají cílové umístění pro soubory datové části INF vliv na řešení. Pro použití osvědčených postupů však příklad používá dirid 13, protože poskytuje rychlejší instalace prostřednictvím méně kopií souborů. Další informace najdete v tématech Použití DIRID a Spustit z úložiště ovladačů.

Následující příklad kódu ukazuje, jak aktualizovat INF, který používá starou syntaxi.

Podrobnosti o různých zdrojových souborech mapovaných na jeden cílový soubor

Zdrojový kód Komentář
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Vyberte umístění souborů ručně
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; HW Version A
DesiredFileName2,SourceFile2A ; HW Version A
[CopyFiles.B] DesiredFileName1,SourceFile1B ; HW Version B DesiredFileName2,SourceFile2B ; HW Version B

Technika kopírování souborů: Přejmenování souborů tak, aby probíhající instalace oddílu DDInstall vybrala zdrojový soubor k zkopírování do cílové cesty souboru, na kterou je ovladač propojený.

To nefunguje v případě, že se všechny soubory pro všechny oddíly DDInstall zkopírují před instalací.

Podrobnosti o aktualizaci pomocí položek AddReg HKR

Zdrojový kód Komentář
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

Osvědčeným postupem je nechat všechno v adresáři úložiště ovladačů (Dirid 13).
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Přidejte oddíl AddReg pro každý oddíl DDInstall Section.HW, abyste měli přehled o souborech potřebných pro danou instalaci.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Více umístění zdrojových souborů namapovaných na jednu hodnotu registru. To funguje, protože HKR AddReg z oddílu DDInstall nebo DDInstall.HW je uložen v nastavení zařízení. Když je zařízení instalováno s tímto balíčkem ovladačů, bude používat pouze jeden z oddílů DDInstall, takže se použije pouze jeden ze záznamů HKR AddReg a nedojde ke konfliktu.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Všechny soubory se mapují na vlastní umístění, což znamená, že nedochází k žádným chybám funkčnosti a INF úspěšně projde InfVerif.
Nepoužívejte CopyFiles k přejmenování souboru, pro který destinationDirs obsahuje Dirid 13.

Přístup k umístění souboru z ovladače (pseudokód)

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

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

Přístup k umístění souboru z uživatelského režimu

Při přístupu k cílovému souboru z uživatelského režimu nebudete mít kontext zařízení, který má ovladač. V takovém případě potřebujete přidat další krok. Před otevřením popisovače klíče najděte zařízení, které obsahuje hodnotu registru označující, jaký soubor se má načíst.

Podívejte se na Spuštění z úložiště ovladačů, kde se dozvíte, jak filtrovat seznam zařízení, najít své zařízení a otevřít popisovač umístění v registru v uživatelském režimu, s použitím Dirid 13 jako osvědčeného postupu.

Chyby 1331 – 1333

Chyby 1331 – 1333 jsou všechny stejné problémy, ale týkají se hodnot registru, hodnot registru ve službách a samotných služeb. Příklady v dokumentaci k chybě 1330 zahrnují techniky řešení chyb 1331 – 1333.