Partager via


Erreurs InfVerif 1330 à 1333

L’erreur InfVerif 1330 permet d’éviter une erreur fonctionnelle où un fichier de destination serait remplacé par plusieurs fichiers sources. Par exemple :

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

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

Lorsque plusieurs sections DDInstall copient des fichiers sources différents dans un même fichier de destination à l’aide de la directive CopyFiles, ces CopyFiles peuvent entrer en conflit si les sections DDInstall sont toutes traitées sur le même système. Par exemple : si deux appareils différents utilisent le même pilote mais des sections d’installation distinctes, ou dans certains scénarios de déploiement et de création d'image de pilote hors connexion. Étant donné que plusieurs fichiers sources provenant des différentes sections DDInstall sont copiés exactement dans le même fichier de destination, les différents fichiers sources provenant de différentes sections DDInstall se remplacent mutuellement de sorte que le dernier fichier copié soit celui placé dans la destination, ce qui peut ne pas être le résultat attendu.

Incidents

Ce document fournit des conseils sur la mise à jour de l’ancienne syntaxe vers des méthodes permettant de supprimer l’erreur fonctionnelle dans les cas suivants. Tous les cas ne sont pas répertoriés ci-dessous car il peut exister d’autres raisons propres à chaque INF.

  • Différentes sections DDInstall renomment un binaire de service pour un service

  • Plusieurs sections DDInstall renomment un fichier source à copier vers un emplacement de fichier de destination accessible par le pilote ou une application en mode utilisateur

Différentes sections DDInstall renomment un binaire de service pour un service

Le code suivant est un exemple qui montre comment différentes sections DDInstall peuvent renommer un binaire de service pour un service :

[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

Pour mettre à jour ce code, créez différents noms de service pour les différents binaires :

[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

Plusieurs sections DDInstall renomment un fichier source à copier vers un emplacement de fichier de destination accessible par le pilote ou une application en mode utilisateur

Dans ce cas, le pilote accède à un emplacement de fichier fixe qui est utilisé comme emplacement de fichier dynamique. Pour obtenir une variable dynamique assurant le suivi de plusieurs fichiers sources, vous pouvez utiliser une entrée HKR AddReg pour stocker le chemin d’accès qui peut être récupéré au moment de l’exécution. Cette méthode fonctionne car les entrées HKR AddReg sont stockées en lien avec un appareil.

L’entrée HKR AddReg spécifie les emplacements des fichiers sources au lieu de choisir un fichier de destination unique pour copier les fichiers sources :

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

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

Plutôt que d’accéder à un emplacement de fichier fixe, l’emplacement du fichier cible peut être récupéré à partir d’un paramètre sur l’appareil. L’emplacement du fichier cible est stocké dans une valeur de registre par INF et récupéré via des appels d’API dans le pilote.

Pour provisionner les valeurs via un INF, utilisez la directive INF AddReg à l'aide d'entrées HKR reg-root dans une add-registry-section référencée à partir d'une section INF DDInstall ou d'une section INF DDInstall.HW.

Étant donné que les valeurs de registre assurent un suivi du fichier cible au lieu d’un emplacement de fichier de destination unique, le pilote devra accéder à ces fichiers différemment. Pour accéder au fichier cible, le pilote doit désormais lancer un appel dans une des API suivantes pour ouvrir la valeur de registre et lui demander de renvoyer l’emplacement de ce fichier source :

WDM

WDF

Autre code en mode utilisateur

Remarque

Dans cet exemple, l’emplacement de destination des fichiers dans les charges utiles INF n’affecte pas la solution. Toutefois, pour appliquer les meilleures pratiques, l’exemple utilise DIRID 13 car il assure des installations plus rapides avec moins de copies de fichiers. Pour plus d’informations, consultez les articles « Utilisation de DIRIDs » et « Exécution à partir du magasin de pilotes ».

L’exemple de code suivant montre comment mettre à jour un INF qui utilise l’ancienne syntaxe.

Détails des différents fichiers sources mappés à un fichier de destination

Source Code Commentaire
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Choisissez manuellement l’emplacement des fichiers
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; HW Version A
DesiredFileName2,SourceFile2A ; HW Version A
[CopyFiles.B] DesiredFileName1,SourceFile1B ; HW Version B DesiredFileName2,SourceFile2B ; HW Version B

Technique de copie de fichiers : renommer les fichiers afin que la section DDInstall en cours d'installation sélectionne le fichier source à copier au chemin d’accès du fichier de destination auquel le pilote est lié.

Cette méthode ne fonctionne pas si tous les fichiers pour toutes les sections DDInstall sont copiés avant l’installation.

Détails de mise à jour à l’aide d’entrées HKR AddReg

Source Code Commentaire
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

La bonne pratique consiste à tout laisser dans le répertoire du magasin de pilotes (Dirid 13)
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Ajoutez une section AddReg pour chaque DDInstall Section.HW afin d'assurer le suivi des fichiers nécessaires pour cette installation.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Plusieurs emplacements de fichier source mappés à une valeur de registre. Cette méthode fonctionne car les HKR AddReg à partir d’une section DDInstall ou DDInstall.HW sont stockés dans les paramètres de l’appareil. Lorsqu’un appareil est installé avec ce package de pilotes, il n’utilise qu’une des sections DDInstall afin qu’un seul des HKR addReg soit utilisé et qu’il n’y ait pas de conflit.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Tous les fichiers sont mappés à leur propre emplacement pour éviter toute erreur de fonctionnalité et INF passe InfVerif.
N’utilisez pas CopyFiles pour renommer un fichier pour lequel DestinationDirs inclut Dirid 13.

Accès à l’emplacement du fichier à partir du pilote (pseudo-code)

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

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

Accès à l’emplacement du fichier à partir du mode utilisateur

Lorsque vous accédez au fichier cible à partir du mode utilisateur, vous ne disposez pas du contexte d’appareil que le pilote possède. Dans ce cas, vous devez ajouter une étape supplémentaire. Avant d’ouvrir le handle de clé, recherchez l’appareil qui contient la valeur de registre indiquant le fichier à charger.

Consultez Exécution à partir du magasin de pilotes pour apprendre à filtrer une liste d'appareils afin de trouver votre appareil et d'ouvrir le handle de l'emplacement du registre en mode utilisateur à l'aide de Dirid 13 pour les bonnes pratiques.

Erreurs 1331 -1333

Les erreurs 1331 à 1333 portent toutes sur le même problème, mais concernent respectivement les valeurs de registre, les valeurs de registre dans les services et les services. Les exemples de la documentation sur l’erreur 1330 couvrent les techniques de résolution des erreurs 1331 à 1333.