Partilhar 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 dois dispositivos diferentes usarem o mesmo driver, mas com seções de instalação diferentes, ou em alguns cenários de criação de imagens e implantação de drivers offline. Como vários arquivos de origem das diferentes seções DDInstall são copiados para o mesmo arquivo de destino único exato, os diferentes arquivos de origem de diferentes seções DDInstall substituem uns aos outros para que o último arquivo copiado seja o colocado no destino, o que pode não ser os resultados esperados.

Processos

Este documento fornece orientação sobre como atualizar a sintaxe antiga para métodos que removem o erro funcional para os seguintes casos. 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 do DDInstall renomeiam um arquivo de origem para ser copiado para um local de arquivo de destino acessado pelo driver ou por um aplicativo do Modo de Usuário

Diferentes secções DDInstall renomeiam um binário de serviço para um único 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 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 do DDInstall renomeiam um arquivo de origem para ser 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 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:

[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 do 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 numa secção de adicionar ao registo referenciada de uma secção INF DDInstall ou secçã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 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 Utilizador

Observação

Neste exemplo, o local de destino dos ficheiros INF não afeta a solução. No entanto, para usar as práticas recomendadas, o exemplo usa DIRID 13, uma vez que fornece instalações mais rápidas através de menos cópias de arquivos. Consulte "Usando DIRIDs" e "Executar a partir do armazenamento de drivers" para obter mais informações.

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

Detalhes de 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

Escolha 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: Renomear arquivos para que a seção DDInstall que está sendo instalada selecione 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 atualizar utilizando entradas AddReg HKR

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

A melhor prática é 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árias localizações de ficheiros de origem mapeadas para um valor do registo. Isso funciona porque HKR AddReg de uma seção DDInstall ou DDInstall.HW são armazenados nas definições do dispositivo. Quando um dispositivo é instalado com este pacote de drivers, ele usará apenas uma das seções DDInstall, então apenas um dos HKR AddReg será utilizado 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 sua própria localização para que não haja erros de funcionalidade e INF passa InfVerif.
Não use CopyFiles para renomear um arquivo para o qual DestinationDirs inclui Dirid 13.

Aceder à localização do ficheiro a partir do driver (pseudo-código)

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

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

Aceder à localização do ficheiro a partir do Modo de Utilizador

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

Consulte Executar a partir do repositório de controladores para saber como filtrar uma lista de dispositivos para localizar o seu dispositivo e abrir o identificador para a localização do registo em modo de utilizador, utilizando o Dirid 13 seguindo as melhores práticas.

Erros 1331 - 1333

Os erros 1331 - 1333 são todos o mesmo problema, mas relacionados com valores de registo, valores de registo dentro de serviços e os próprios serviços, respetivamente. Os exemplos na documentação para o erro 1330 abrangem técnicas para resolver os erros 1331 - 1333.