Compartir a través de


Error de InfVerif 1330 - 1333

InfVerif Error 1330 ayuda a evitar un error funcional en el que varios archivos de origen sobrescriben un archivo de destino. Por ejemplo:

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

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

Cuando varias secciones DDInstall copian archivos de origen diferentes en un único archivo de destino mediante la directiva CopyFiles , estos CopyFiles podrían entrar en conflicto si todas las secciones DDInstall se procesan en el mismo sistema. Algunos ejemplos de esto son si dos dispositivos diferentes usan el mismo controlador, pero secciones de instalación diferentes, o en algunos escenarios de creación de imágenes e implementación de controladores sin conexión. Dado que se copian varios archivos de origen de las distintas secciones DDInstall en el mismo archivo de destino único exacto, las distintas secciones de DDInstall se sobrescriben entre sí para que el último archivo copiado sea el que se coloca en el destino, lo que puede no ser los resultados esperados.

Casos

En este documento se proporcionan instrucciones sobre cómo actualizar la sintaxis antigua a los métodos que quitan el error funcional de los casos siguientes. No todos los casos se enumeran a continuación, ya que podría haber otras razones específicas para cada INF.

  • Diferentes secciones DDInstall cambian el nombre de un binario de servicio para un servicio

  • Diferentes secciones DDInstall cambian el nombre de un archivo de origen para copiarse en una ubicación de archivo de destino a la que accede el controlador o una aplicación en modo de usuario

Diferentes secciones DDInstall cambian el nombre de un binario de servicio para un servicio

El código siguiente es un ejemplo de cómo diferentes secciones DDInstall pueden cambiar el nombre de un archivo binario de servicio para un servicio:

[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

Para actualizar este código, cree nombres de servicio diferentes para los distintos archivos binarios:

[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

Diferentes secciones DDInstall cambian el nombre de un archivo de origen para copiarse en una ubicación de archivo de destino a la que accede el controlador o una aplicación en modo de usuario

En este caso, el controlador tiene acceso a una ubicación de archivo fija que se usa como una ubicación de archivo dinámica. Para tener una variable dinámica que realice un seguimiento de varios archivos de origen, puede usar una entrada AddReg HKR para almacenar la ruta de acceso que se puede recuperar en tiempo de ejecución. Esto funciona porque las entradas de HKR AddReg se almacenan en relación con un dispositivo.

La entrada AddReg HKR especifica las ubicaciones de los archivos de origen en lugar de elegir un único archivo de destino para copiar los archivos de origen en:

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

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

En lugar de acceder a una ubicación de archivo fija, la ubicación del archivo de destino se puede recuperar de una configuración en el dispositivo. El INF almacena la ubicación del archivo de destino en un valor del Registro y se recupera a través de llamadas API en el controlador.

Para aprovisionar los valores a través de un INF, use la directiva AddReg de INF mediante entradas HKR reg-root en una sección add-registry a la que se hace referencia desde una sección INF DDInstall o una sección INF DDInstall.HW.

Dado que los valores del Registro realizan un seguimiento del archivo de destino en lugar de una sola ubicación de archivo de destino, el controlador tendrá que acceder a esos archivos de forma diferente. Para acceder al archivo de destino, el controlador ahora debe llamar a una de las siguientes API para abrir el valor del Registro y hacer que devuelva la ubicación de ese archivo de origen:

WDM

WDF

Otro código del modo de usuario

Nota:

En este ejemplo, la ubicación de destino de los archivos de las cargas útiles INF no afecta a la solución. Sin embargo, para usar los procedimientos recomendados, el ejemplo usa DIRID 13, ya que proporciona instalaciones más rápidas a través de menos copias de archivo. Consulte "Usar DIRID" y "Ejecutar desde el almacén de controladores" para obtener más información.

En el código de ejemplo siguiente se muestra cómo actualizar un INF que usa la sintaxis antigua.

Detalles de los distintos archivos de origen asignados a un archivo de destino

Código fuente Comentario
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Elegir dónde van los archivos manualmente
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; HW Version A
DesiredFileName2,SourceFile2A ; HW Version A
[CopyFiles.B] DesiredFileName1,SourceFile1B ; HW Version B DesiredFileName2,SourceFile2B ; HW Version B

Técnica de copia de archivos: Renombrar archivos de manera que la sección DDInstall que se está instalando seleccione el archivo de origen para copiarlo en la ruta de destino a la que está vinculado el controlador.

Esto no funciona en el caso de que todos los archivos de todas las secciones "DDInstall" se copien antes de la instalación.

Detalles para la actualización mediante entradas HKR de AddReg

Código fuente Comentario
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

El procedimiento recomendado es dejar todo en el directorio del almacén de controladores (Dirid 13)
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Agregue una sección AddReg para cada DDInstall Section.HW para realizar un seguimiento de los archivos necesarios para esa instalación.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Varias ubicaciones de archivo de origen asignadas a un valor del Registro. Esto funciona porque HKR AddReg de las secciones DDInstall o DDInstall.HW se almacena en las configuraciones del dispositivo. Cuando se instala un dispositivo con este paquete de controladores, solo se usará una de las secciones DDInstall, por lo que solo se usará una de las secciones HKR AddReg y no habrá ningún conflicto.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Todos los archivos se asignan a su propia ubicación, por lo que no hay errores de funcionalidad y INF pasa InfVerif.
No use CopyFiles para cambiar el nombre de un archivo para el que DestinationDirs incluye Dirid 13.

Acceso a la ubicación del archivo desde el controlador (pseudocódigo)

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

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

Acceso a la ubicación del archivo desde el modo de usuario

Al acceder al archivo de destino desde el Modo de Usuario, no tendrá el contexto del dispositivo que tiene un controlador. En este caso, debe agregar un paso adicional. Antes de abrir el identificador de clave, busque el dispositivo que contiene el valor del Registro que indica qué archivo se va a cargar.

Consulte Ejecutar desde el almacén de controladores para obtener información sobre cómo filtrar una lista de dispositivos para encontrar su dispositivo y abrir el identificador a la ubicación del registro en modo de usuario, utilizando Dirid 13 para seguir las mejores prácticas.

Errores 1331 - 1333

Los errores 1331 - 1333 son todos el mismo problema, pero relacionados con los valores del registro, los valores del registro dentro de los servicios y los servicios respectivamente. En los ejemplos de documentación del error 1330 se tratan técnicas para resolver los errores 1331 a 1333.