Compartilhar via


Erro InfVerif 1330 - 1333

O InfVerif Error 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 poderão entrar em conflito se as seções DDInstall forem processadas no mesmo sistema. Exemplos disso incluem situações em que dois dispositivos diferentes estão usando o mesmo driver, mas em seções de instalação diferentes, ou em alguns cenários de geração de imagens e implantação de driver offline. Como vários arquivos de origem das diferentes seções DDInstall são copiados para o mesmo arquivo de destino único exato, os arquivos de origem diferentes de diferentes seções DDInstall substituem uns aos outros para que o último arquivo copiado seja aquele colocado no destino, que pode não ser os resultados esperados.

Ocorrências

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

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

  • Diferentes seções DDInstall renomeiam um arquivo de origem para ser copiado para um local de arquivo de destino acessível ao driver ou a um aplicativo em Modo de Usuário.

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

O código a seguir é um exemplo de como seções DDInstall diferentes 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 nomes de serviço diferentes 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 que seja copiado para um local de arquivo de destino acessado pelo driver ou por um aplicativo do 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 mantenha o controle de vários arquivos de origem, você pode usar uma entrada HKR addreg para armazenar o caminho que pode ser recuperado em runtime. Isso funciona porque as entradas HKR do AddReg são armazenadas em relação a um dispositivo.

A entrada HKR do AddReg especifica os locais de arquivo para 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 à API no driver.

Para provisionar os valores por meio de um INF, use a diretiva INF AddReg com entradas reg-root do HKR em uma seção de adição ao registro referenciada a partir de uma seção INF DDInstall ou seção INF DDInstall.HW.

Como os valores do Registro mantêm o controle do arquivo de destino em vez de um único local de arquivo de destino, o driver terá que acessar esses arquivos de forma 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 que o INF carrega 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 por meio de menos cópias de arquivo. Consulte "Usando DIRIDs" e "Executar no repositório de driver" para obter mais informações.

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

Detalhes de arquivos de origem diferentes 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 manualmente para onde os arquivos vão
[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: Renomear arquivos para que a seção DDInstall a ser instalada selecione o arquivo de origem para ser copiado no caminho 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 ser realizada.

Detalhes para atualizar usando entradas HKR do AddReg

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

A melhor prática é deixar tudo no diretório do armazenamento de drivers (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 único valor de registro. Isso funciona porque o HKR AddReg de uma seção DDInstall ou DDInstall.HW é armazenado nas configurações do dispositivo. Quando um dispositivo é instalado com este pacote de driver, ele usará apenas uma das seções DDInstall, garantindo que somente um dos AddReg HKR seja utilizado, evitando assim qualquer 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 seus próprios locais, de modo que não ocorram erros de funcionalidade, e que o INF passe no InfVerif.
Não use CopyFiles para renomear um arquivo para o qual DestinationDirs inclui Dirid 13.

Acessando a localização 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 no Modo de Usuário

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

Consulte Executar do repositório de drivers para aprender a filtrar uma lista de dispositivos para localizar seu dispositivo e abrir o identificador para a localização do Registro no modo de usuário, utilizando o Dirid 13 como prática recomendada.

Erros 1331 – 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 erros 1331 a 1333.