Udostępnij przez


Błąd infVerif 1330 – 1333

Błąd InfVerif 1330 pomaga zapobiec błędowi funkcjonalnemu, w którym jeden plik docelowy jest zastępowany przez wiele plików źródłowych. Przykład:

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

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

Jeśli wiele sekcji DDInstall kopiuje różne pliki źródłowe do jednego pliku docelowego przy użyciu dyrektywy CopyFiles , te pliki CopyFiles mogą powodować konflikt, jeśli wszystkie sekcje DDInstall są przetwarzane w tym samym systemie. Przykładami jest sytuacja, gdy dwa różne urządzenia używają tego samego sterownika, ale różnych sekcji instalacji lub w niektórych scenariuszach tworzenia i wdrażania sterowników w trybie offline. Ponieważ wiele plików źródłowych z różnych sekcji DDInstall jest kopiowanych do tego samego samego pojedynczego pliku docelowego, różne pliki źródłowe z różnych sekcji DDInstall zastępują się tak, aby ostatni skopiowany plik został umieszczony w miejscu docelowym, co może nie być oczekiwanym wynikiem.

Przypadki

Ten dokument zawiera wskazówki dotyczące aktualizowania starej składni do metod, które usuwają błąd funkcjonalny w następujących przypadkach. Nie wszystkie przypadki są wymienione poniżej, ponieważ mogą istnieć inne przyczyny specyficzne dla każdego INF.

  • Różne sekcje DDInstall zmieniają nazwę pliku binarnego dla jednej usługi

  • Różne sekcje DDInstall zmieniają nazwę pliku źródłowego, aby plik został skopiowany do lokalizacji docelowej, do której uzyskuje dostęp sterownik lub aplikacja w trybie użytkownika.

Różne sekcje DDInstall zmieniają nazwę pliku binarnego usługi dla tej samej usługi

Poniższy kod to przykład sposobu, w jaki różne sekcje DDInstall mogą zmienić nazwę pliku binarnego usługi dla jednej usługi:

[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

Aby zaktualizować ten kod, utwórz różne nazwy usług dla różnych plików binarnych:

[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óżne sekcje DDInstall zmieniają nazwę pliku źródłowego, aby mogły zostać skopiowane do lokalizacji pliku docelowego dostępnej przez sterownik lub aplikację trybu użytkownika

W takim przypadku sterownik uzyskuje dostęp do stałej lokalizacji pliku, która jest używana jako dynamiczna lokalizacja pliku. Aby mieć jedną zmienną dynamiczną, która śledzi wiele plików źródłowych, możesz użyć wpisu AddReg HKR do przechowywania ścieżki, którą można pobrać w czasie wykonywania. Działa to, ponieważ wpisy AddReg HKR są przechowywane względem urządzenia.

Wpis AddReg HKR określa lokalizacje plików źródłowych zamiast wybierać pojedynczy plik docelowy, aby skopiować pliki źródłowe do:

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

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

Zamiast uzyskiwać dostęp do stałej lokalizacji pliku, lokalizację pliku docelowego można pobrać z ustawienia na urządzeniu. Lokalizacja pliku docelowego jest przechowywana w wartości rejestru przez INF i pobierana za pośrednictwem wywołań interfejsu API w sterowniku.

Aby skonfigurować wartości za pośrednictwem INF, użyj dyrektywy INF AddReg, korzystając z wpisów reg-root HKR w sekcji add-registry, odwołując się do sekcji INF DDInstall lub sekcji INF DDInstall.HW.

Ponieważ wartości rejestru śledzą plik docelowy zamiast pojedynczej lokalizacji pliku docelowego, sterownik będzie musiał uzyskać dostęp do tych plików w inny sposób. Aby uzyskać dostęp do pliku docelowego, sterownik musi teraz wywołać jeden z następujących interfejsów API, aby otworzyć wartość rejestru i zwrócić lokalizację tego pliku źródłowego:

WDM

WDF

Inny kod trybu użytkownika

Uwaga / Notatka

W tym przykładzie lokalizacja docelowa plików ładunków INF nie ma wpływu na rozwiązanie. Jednak aby użyć najlepszych rozwiązań, w przykładzie użyto diRID 13, ponieważ zapewnia szybsze instalowanie za pośrednictwem mniejszej liczby kopii plików. Aby uzyskać więcej informacji, zobacz "Używanie identyfikatorów DIRID" i "Uruchamianie z magazynu sterowników".

Poniższy przykładowy kod pokazuje, jak zaktualizować inf używający starej składni.

Szczegóły dotyczące różnych plików źródłowych zamapowanych na jeden plik docelowy

Kod źródłowy Komentarz
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Wybierz ręcznie miejsce docelowe dla plików
[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 kopiowania plików: zmiana nazwy plików, dzięki czemu instalowana sekcja DDInstall wybiera plik źródłowy, aby został skopiowany do ścieżki pliku docelowego, z którą jest połączony sterownik.

Nie działa to w przypadku, gdy wszystkie pliki dla wszystkich sekcji DDInstall są kopiowane przed zainstalowaniem.

Szczegóły dotyczące aktualizacji przy użyciu wpisów AddReg HKR

Kod źródłowy Komentarz
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

Najlepszym rozwiązaniem jest pozostawienie wszystkiego w katalogu magazynu sterowników (Dirid 13)
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Dodaj sekcję AddReg dla każdej sekcji DDInstall.HW, aby śledzić pliki wymagane do tej instalacji.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Wiele lokalizacji plików źródłowych mapowanych na jedną wartość rejestru. Działa to, ponieważ element HKR AddReg z sekcji DDInstall lub DDInstall.HW jest przechowywany w ustawieniach urządzenia. Po zainstalowaniu urządzenia z tym pakietem sterowników, będzie korzystać tylko z jednej sekcji DDInstall, więc zostanie użyty tylko jeden z HKR AddReg i nie będzie konfliktu.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Wszystkie pliki są mapowane do własnej lokalizacji, więc nie występują błędy funkcjonalności i INF przechodzi test InfVerif.
Nie używaj funkcji CopyFiles, aby zmienić nazwę pliku, w którym DestinationDirs zawiera Dirid 13.

Uzyskiwanie dostępu do lokalizacji pliku ze sterownika (pseudo-kod)

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

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

Uzyskiwanie dostępu do lokalizacji pliku z trybu użytkownika

Podczas uzyskiwania dostępu do pliku docelowego z trybu użytkownika nie będziesz mieć kontekstu urządzenia, który ma sterownik. W takim przypadku musisz dodać dodatkowy krok. Przed otwarciem klucza dostępu znajdź urządzenie zawierające wartość rejestru wskazującą, jaki plik należy załadować.

Zobacz Uruchamianie z magazynu sterowników, aby dowiedzieć się, jak filtrować listę urządzeń w celu znalezienia urządzenia i otworzyć dojście do lokalizacji rejestru w trybie użytkownika, używając Dirid 13 zgodnie z najlepszymi praktykami.

Błędy 1331 – 1333

Błędy 1331 - 1333 są tym samym problemem, ale odnoszą się odpowiednio do wartości rejestru, wartości rejestru w usługach i usług. Przykłady w dokumentacji błędu 1330 obejmują techniki rozwiązywania błędów 1331– 1333.