Partager via


Erreurs InfVerif 1330 à 1333

L’erreur InfVerif 1330 permet d’éviter une erreur fonctionnelle où un fichier de destination est 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 fichier de destination unique à 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 différentes, ou dans certains scénarios de déploiement et d’imagerie de pilotes hors connexion. Étant donné que plusieurs fichiers sources des différentes sections DDInstall sont copiés dans le même fichier de destination unique exact, les différents fichiers sources de différentes sections DDInstall se remplacent mutuellement afin que le dernier fichier copié soit celui placé dans la destination, ce qui peut ne pas être les résultats attendus.

Incidents

Ce document fournit des conseils sur la mise à jour de l’ancienne syntaxe aux méthodes qui suppriment l’erreur fonctionnelle dans les cas suivants. Tous les cas ne sont pas répertoriés ci-dessous, car il peut y avoir d’autres raisons spécifiques à chaque INF.

  • Différentes sections DDInstall renomment le fichier binaire d'un service.

  • Différentes sections DDInstall renomment un fichier source pour être copié vers un emplacement de fichier de destination destiné au pilote ou à une application en mode utilisateur.

Différentes sections DDInstall renomment un fichier binaire de service pour un seul service.

Le code suivant est un exemple de la façon dont différentes sections DDInstall peuvent renommer un fichier 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 fichiers 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

Différentes sections DDInstall renomment un fichier source afin d'être copiées vers un emplacement de destination de fichier accessible par le pilote ou une application en mode User

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

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

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

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

Au lieu 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 l’INF et récupéré par le biais d’appels d’API dans le pilote.

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

Étant donné que les valeurs de Registre suivent le 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 maintenant appeler l’une des API suivantes pour ouvrir la valeur de Registre et renvoyer l’emplacement de ce fichier source :

WDM

WDF

Autre code en mode utilisateur

Remarque

Dans cet exemple, l'emplacement de destination des fichiers des charges utiles INF n'affecte pas la solution. Toutefois, pour utiliser les meilleures pratiques, l’exemple utilise DIRID 13, car il fournit des installations plus rapides via moins de copies de fichiers. Pour plus d'informations, consultez « Utilisation de DIRIDs » et « Exécution depuis le 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

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

Choisir l’emplacement des fichiers manuellement
[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 : renommage des fichiers afin que la section DDInstall installée sélectionne le fichier source pour être copié dans le chemin d’accès du fichier de destination auquel le pilote est lié.

Cela ne fonctionne pas dans le cas où tous les fichiers de toutes les sections DDInstall sont copiés avant l’installation.

Détails de la mise à jour à l'aide des entrées AddReg HKR

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

La meilleure pratique consiste à laisser tout 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 pour suivre les fichiers nécessaires à 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. Cela fonctionne, car 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 addReg HKR soit utilisé et qu’il n’y a 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 afin qu'il n'y ait aucune erreur de fonctionnalité et que la vérification InfVerif des fichiers INF soit réussie.
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 n’aurez pas le contexte d’appareil qu’un pilote possède. Dans ce cas, vous devez ajouter une étape supplémentaire. Avant d’ouvrir la poignée de clé, recherchez l’appareil qui contient la valeur de registre indiquant quel fichier charger.

Consultez Run from the driver store pour apprendre à filtrer une liste de périphériques afin de trouver votre appareil et ouvrir le handle vers l'emplacement du registre en mode utilisateur, en utilisant Dirid 13 pour les meilleures pratiques.

Erreurs 1331 - 1333

Les erreurs 1331 - 1333 concernent toutes le même problème, mais en relation avec les valeurs de Registre, les valeurs de Registre au sein des services, et les services respectivement. Les exemples de la documentation relative à l’erreur 1330 couvrent les techniques de résolution des erreurs 1331 - 1333.