Compartilhar via


Erro InfVerif 1330 - 1333

O Erro InfVerif 1330 ajuda a evitar um erro funcional em que um arquivo de destino é substituído por vários arquivos de origem. Por exemplo:

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

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

Quando várias seções DDInstall copiam arquivos de origem diferentes para um único arquivo de destino usando a diretiva CopyFiles, esses CopyFiles podem entrar em conflito se todas as seções DDInstall forem processadas no mesmo sistema. Exemplos disso são se dois dispositivos diferentes estiverem usando o mesmo driver, mas seções de instalação diferentes, ou em alguns cenários de implantação e imagem de driver offline. Como vários arquivos de origem das diferentes seções DDInstall são copiados para o mesmo arquivo de destino único, os diferentes arquivos de origem de diferentes seções DDInstall sobrescrevem uns aos outros para que o último arquivo copiado seja aquele colocado no destino, o que pode não ser o resultado esperado.

Ocorrências

Este documento fornece orientações sobre como atualizar a sintaxe antiga para métodos que removem o erro funcional nos casos a seguir. Nem todos os casos estão listados abaixo, pois pode haver outros motivos específicos para cada INF.

  • Diferentes seções DDInstall renomeiam um binário de serviço para um serviço

  • Diferentes seções DDInstall renomeiam um arquivo de origem para ser copiado para um local de arquivo de destino acessado pelo driver ou por um aplicativo de Modo de usuário

Diferentes seções DDInstall renomeiam um binário de serviço para um serviço

O código a seguir é um exemplo de como diferentes seções DDInstall podem renomear um binário de serviço para um serviço:

[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 atualizar esse código, crie diferentes nomes de serviço para os diferentes binários:

[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 seções DDInstall renomeiam um arquivo de origem para ser copiado para um local de arquivo de destino acessado pelo driver ou por um aplicativo de Modo de usuário

Nesse caso, o driver está acessando um local de arquivo fixo que está sendo usado como um local de arquivo dinâmico. Para ter uma variável dinâmica que mantém o controle de vários arquivos de origem, você pode usar uma entrada AddReg HKR para armazenar o caminho que pode ser recuperado em tempo de execução. Isso funciona porque as entradas AddReg HKR são armazenadas em relação a um dispositivo.

A entrada AddReg HKR especifica os locais dos arquivos de origem em vez de escolher um único arquivo de destino para copiar os arquivos de origem para:

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

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

Em vez de acessar um local de arquivo fixo, o local do arquivo de destino pode ser recuperado de uma configuração no dispositivo. O local do arquivo de destino é armazenado em um valor de registro pelo INF e recuperado por meio de chamadas de API no driver.

Para provisionar os valores por meio de um INF, use a diretiva INF AddReg usando entradas reg-root HKR em um add-registry-section referenciada em uma seção INF DDInstall ou seção INF DDInstall.HW.

Como os valores do registro controlam o arquivo de destino em vez de um único local de arquivo de destino, o driver terá que acessar esses arquivos de maneira diferente. Para acessar o arquivo de destino, o driver agora precisa chamar uma das seguintes APIs para abrir o valor do registro e fazer com que ele retorne o local desse arquivo de origem:

WDM

WDF

Outro código do modo de usuário

Observação

Neste exemplo, o local de destino dos arquivos das cargas INF não afeta a solução. No entanto, para usar as práticas recomendadas, o exemplo usa DIRID 13, pois fornece instalações mais rápidas com menos cópias de arquivos. Consulte "Usando DIRIDs" e "Executar a partir do repositório de drivers" para obter mais informações.

O código de exemplo a seguir mostra como atualizar um INF que usa sintaxe antiga.

Detalhes para diferentes arquivos de origem mapeados para um arquivo de destino

Código-fonte Comentário
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Escolher para onde os arquivos vão 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 cópia de arquivo: renomeando arquivos para que a seção DDInstall que está sendo instalada escolha o arquivo de origem para ser copiado para o caminho do arquivo de destino ao qual o driver está vinculado.

Isso não funciona no caso de todos os arquivos de todas as seções DDInstall serem copiados antes da instalação.

Detalhes para atualização usando entradas AddReg HKR

Código-fonte Comentário
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

A prática recomendada é deixar tudo no diretório de armazenamento do driver (Dirid 13)
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Adicione uma seção AddReg para cada DDInstall Section.HW para acompanhar os arquivos necessários para essa instalação.
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"
[B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A"


Vários locais de arquivos de origem mapeados para um valor de registro. Isso funciona porque HKR AddReg de uma seção DDInstall ou DDInstall.HW são armazenados nas configurações do dispositivo. Quando um dispositivo é instalado com este pacote de driver, ele usará apenas uma das seções DDInstall, portanto, apenas um dos HKR AddReg será usado e não haverá conflito.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Todos os arquivos são mapeados para seu próprio local, portanto, não há erros de funcionalidade e o INF passa no InfVerif.
Não use CopyFiles para renomear um arquivo para o qual DestinationDirs inclui Dirid 13.

Acessando o local do arquivo a partir do driver (pseudocódigo)

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

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

Acessando o local do arquivo a partir do Modo de usuário

Ao acessar o arquivo de destino no Modo de usuário, você não terá o contexto de dispositivo que um driver tem. Neste caso, você precisa adicionar uma etapa adicional. Antes de abrir o identificador de chave, encontre o dispositivo que contém o valor do registro que indica qual arquivo carregar.

Consulte Executar a partir do armazenamento de drivers para saber como filtrar uma lista de dispositivos para localizar seu dispositivo e abrir o identificador para o local do registro no modo de usuário, usando o Dirid 13 para obter as práticas recomendadas.

Erros 1331 a 1333

Os erros 1331 - 1333 são todos o mesmo problema, mas relacionados a valores de registro, valores de registro dentro de serviços e serviços, respectivamente. Os exemplos na documentação do erro 1330 abrangem técnicas para resolver os erros 1331 - 1333.