Compartir a través de


Error de InfVerif 1330 - 1333

El error de InfVerif 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. Por ejemplo, si dos dispositivos diferentes utilizan 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, los distintos archivos de origen de diferentes secciones DDInstall se sobrescriben entre sí para que el último archivo copiado sea el que se coloque 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 eliminan 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 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 accede 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 de HKR AddReg 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 de HKR AddReg especifica las ubicaciones de los archivos de origen en lugar de elegir un único archivo de destino en el que copiar los archivos de origen:

[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 reg-root de HKR en una add-registry-section a la que se haga referencia desde una sección DDInstall de INF o DDInstall.HW de INF.

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 en modo de usuario

Nota:

En este ejemplo, la ubicación de destino de los archivos que carga el 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 "Uso de DIRID" y "Ejecución 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: cambia el nombre de los archivos para que la sección DDInstall que se está instalando elija el archivo de origen para que se copie en la ruta del archivo de destino al que está vinculado el controlador.

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

Detalles para actualizar mediante entradas de HKR 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


Añada una sección AddReg para cada Section.HW de DDInstall 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 AddReg de HKR de una sección DDInstall o DDInstall.HW se almacena en la configuración 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 AddReg de HKR 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 e INF aprueba 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 Ejecución desde el almacén de controladores para obtener información sobre cómo filtrar una lista de dispositivos para buscar el dispositivo y abrir el identificador en la ubicación del Registro en modo de usuario, mediante Dirid 13 para seguir los procedimientos recomendados.

Errores 1331-1333

Los errores 1331 - 1333 son todos los mismos problemas, 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 de 1331 a 1333.