Delen via


InfVerif-fout 1330 - 1333

InfVerif-fout 1330 helpt een functionele fout te voorkomen waarbij één doelbestand wordt overschreven door meerdere bronbestanden. Voorbeeld:

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

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

Wanneer meerdere DDInstall-secties verschillende bronbestanden naar één doelbestand kopiëren met behulp van de instructie CopyFiles , kunnen deze CopyFiles conflicteren als de DDInstall-secties allemaal op hetzelfde systeem worden verwerkt. Voorbeelden hiervan zijn als twee verschillende apparaten hetzelfde stuurprogramma gebruiken, maar verschillende installatiesecties of in sommige scenario's voor het maken en implementeren van offlinestuurprogramma's. Omdat meerdere bronbestanden uit de verschillende DDInstall-secties naar hetzelfde exacte doelbestand worden gekopieerd, overschrijven de verschillende bronbestanden van verschillende DDInstall-secties elkaar, zodat het laatste gekopieerde bestand het bestand is dat in de bestemming is geplaatst, wat mogelijk niet de verwachte resultaten is.

Gevallen

Dit document bevat richtlijnen voor het bijwerken van de oude syntaxis naar methoden waarmee de functionele fout voor de volgende gevallen wordt verwijderd. Niet alle gevallen worden hieronder vermeld, omdat er andere redenen kunnen zijn die specifiek zijn voor elke INF.

  • In verschillende DDInstall-secties wordt de naam van een binair servicebestand voor één service gewijzigd

  • In verschillende DDInstall-secties wordt de naam van een bronbestand gewijzigd om gekopieerd te worden naar een doelbestandslocatie die wordt geopend door het stuurprogramma of een gebruikersmodustoepassing

In verschillende DDInstall-secties wordt de naam van een binair servicebestand voor één service gewijzigd

De volgende code is een voorbeeld van hoe verschillende DDInstall-secties de naam van een binaire service voor één service kunnen wijzigen:

[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

Als u deze code wilt bijwerken, maakt u verschillende servicenamen voor de verschillende binaire bestanden:

[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

In verschillende DDInstall-secties wordt de naam van een bronbestand gewijzigd om gekopieerd te worden naar een doelbestandslocatie die wordt geopend door het stuurprogramma of een gebruikersmodustoepassing

In dit geval heeft het stuurprogramma toegang tot een vaste bestandslocatie die wordt gebruikt als een dynamische bestandslocatie. Als u één dynamische variabele wilt hebben die meerdere bronbestanden bijhoudt, kunt u een AddReg HKR-vermelding gebruiken om het pad op te slaan dat tijdens runtime kan worden opgehaald. Dit werkt omdat AddReg HKR-vermeldingen worden opgeslagen ten opzichte van een apparaat.

De addReg HKR-vermelding geeft de bestandslocaties voor bronbestanden op in plaats van één doelbestand te kiezen om de bronbestanden te kopiëren naar:

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

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

In plaats van toegang te krijgen tot een vaste bestandslocatie, kan de locatie van het doelbestand worden opgehaald uit een instelling op het apparaat. De locatie van het doelbestand wordt opgeslagen in een registerwaarde door de INF en opgehaald via API-aanroepen in het stuurprogramma.

Als u de waarden wilt toevoegen via een INF, gebruikt u de INF AddReg-instructie met behulp van HKR reg-root-vermeldingen in een add-registry-sectie waarnaar wordt verwezen vanuit een INF DDInstall-sectie of INF DDInstall.HW-sectie.

Omdat registerwaarden het doelbestand bijhouden in plaats van één doelbestandslocatie, moet het stuurprogramma deze bestanden op een andere manier openen. Voor toegang tot het doelbestand moet het stuurprogramma nu een van de volgende API's aanroepen om de registerwaarde te openen en de locatie van dat bronbestand te laten retourneren:

WDM

WDF

Andere gebruikersmoduscode

Opmerking

In dit voorbeeld heeft de doellocatie van de bestanden die de INF-nettoladingen bevatten geen invloed op de oplossing. Als u echter aanbevolen procedures wilt gebruiken, gebruikt het voorbeeld DIRID 13 omdat het sneller wordt geïnstalleerd via minder bestandskopieën. Zie 'DiRID's gebruiken' en 'Uitvoeren vanuit het stuurprogrammaarchief' voor meer informatie.

In de volgende voorbeeldcode ziet u hoe u een INF bijwerkt die gebruikmaakt van een oude syntaxis.

Details voor verschillende bronbestanden die zijn toegewezen aan één doelbestand

Broncode Opmerking
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Kies handmatig waar bestanden naartoe gaan
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; HW Version A
DesiredFileName2,SourceFile2A ; HW Version A
[CopyFiles.B] DesiredFileName1,SourceFile1B ; HW Version B DesiredFileName2,SourceFile2B ; HW Version B

Bestandskopieertechniek: Het hernoemen van bestanden zodat de DDInstall-sectie die wordt geïnstalleerd, het bronbestand selecteert om te kopiëren naar het doelbestandspad waaraan het stuurprogramma is gekoppeld.

Dit werkt niet in het geval dat alle bestanden voor alle DDInstall-secties worden gekopieerd voordat ze worden geïnstalleerd.

Details voor het updaten met behulp van AddReg HKR-vermeldingen

Broncode Opmerking
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

De beste praktijk is om alles in de driver store directory (Dirid 13) te laten staan
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Voeg een AddReg-sectie toe voor elke DDInstall Section.HW om de bestanden bij te houden die nodig zijn voor die installatie.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Meerdere bronbestandslocaties die zijn toegewezen aan één registerwaarde. Dit werkt omdat HKR AddReg van een DDInstall- of DDInstall.HW-sectie wordt opgeslagen in apparaatinstellingen. Wanneer een apparaat met dit stuurprogrammapakket is geïnstalleerd, wordt slechts een van de DDInstall-secties gebruikt, zodat slechts één van de HKR AddReg wordt gebruikt en er geen conflict is.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Alle bestanden worden toegewezen aan hun eigen locatie, zodat er geen functionaliteitsfouten zijn en INF InfVerif doorgeeft.
Gebruik CopyFiles niet om de naam van een bestand te wijzigen waarvoor DestinationDirs Dirid 13 bevat.

Toegang tot de bestandslocatie vanuit het stuurprogramma (pseudocode)

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

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

Toegang tot de bestandslocatie vanuit de gebruikersmodus

Wanneer u het doelbestand opent vanuit de gebruikersmodus, beschikt u niet over de apparaatcontext die een stuurprogramma heeft. In dit geval moet u een extra stap toevoegen. Voordat u de sleutelgreep opent, zoekt u het apparaat met de registerwaarde die aangeeft welk bestand moet worden geladen.

Zie Uitvoeren vanuit het stuurprogrammaarchief voor informatie over het filteren van een apparaatlijst om uw apparaat te vinden en de ingang te openen naar de registerlocatie in de gebruikersmodus, met behulp van Dirid 13 voor aanbevolen procedures.

Fouten 1331 - 1333

Fouten 1331 - 1333 zijn allemaal hetzelfde probleem, maar hebben betrekking op respectievelijk de registratiewaarden, registerwaarden binnen services en services. De voorbeelden in de documentatie voor fout 1330 hebben betrekking op technieken om fouten 1331 - 1333 op te lossen.