Поделиться через


Ошибка InfVerif 1330 – 1333

Ошибка InfVerif 1330 помогает предотвратить функциональную ошибку, при которой один целевой файл перезаписывается несколькими исходными файлами. Например:

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

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

Если несколько разделов DDInstall копируют разные исходные файлы в один целевой файл с помощью директивы CopyFiles , эти файлы CopyFiles могут конфликтовать, если разделы DDInstall все обрабатываются в одной системе. Примерами этого является использование одного и того же драйвера, но разных разделов установки или в некоторых сценариях автономного образа драйвера и развертывания. Так как несколько исходных файлов из разных разделов DDInstall копируются в один и тот же файл назначения, разные исходные файлы из разных разделов DDInstall перезаписывают друг друга, чтобы последний скопированный файл был помещен в место назначения, который может не быть ожидаемыми результатами.

Обращения

В этом документе приводятся рекомендации по обновлению старого синтаксиса методам, которые удаляют функциональную ошибку для следующих случаев. Не все случаи перечислены ниже, так как могут быть другие причины, относящиеся к каждому INF.

  • Разные разделы DDInstall переименовывает двоичный файл службы для одной службы.

  • Различные разделы DDInstall переименовывает исходный файл, чтобы получить копирование в расположение целевого файла, доступ к которым обращается драйвер или приложение в режиме пользователя

Разные разделы DDInstall переименовывает двоичный файл службы для одной службы.

Следующий код является примером того, как разные разделы DDInstall могут переименовать двоичный файл службы для одной службы:

[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

Чтобы обновить этот код, создайте разные имена служб для разных двоичных файлов:

[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

Различные разделы DDInstall переименовывает исходный файл, чтобы получить копирование в расположение целевого файла, доступ к которым обращается драйвер или приложение в режиме пользователя

В этом случае драйвер обращается к фиксированному расположению файла, используемому в качестве динамического расположения файлов. Чтобы иметь одну динамическую переменную, которая отслеживает несколько исходных файлов, можно использовать запись AddReg HKR для хранения пути, который можно получить во время выполнения. Это работает, так как записи AddReg HKR хранятся относительно устройства.

Запись AddReg HKR указывает расположения файлов для исходных файлов вместо выбора одного целевого файла для копирования исходных файлов в:

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

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

Вместо доступа к фиксированному расположению файла расположение целевого файла можно получить из параметра на устройстве. Расположение целевого файла хранится в значении реестра с помощью INF и извлекается с помощью вызовов API в драйвере.

Чтобы подготовить значения через INF, используйте директиву INF AddReg с помощью записей HKR reg-root в разделе надстройки, на который ссылается раздел INF DDInstall или INF DDInstall.HW.

Так как значения реестра отслеживают целевой файл вместо одного расположения целевого файла, драйвер должен будет получить доступ к этим файлам по-разному. Чтобы получить доступ к целевому файлу, драйвер должен вызвать один из следующих API, чтобы открыть значение реестра и вернуть расположение исходного файла:

WDM

WDF

Другой код пользовательского режима

Примечание.

В этом примере целевое расположение файлов полезных данных INF не влияет на решение. Однако для использования рекомендаций в примере используется DIRID 13, так как он обеспечивает более быструю установку с помощью меньшего количества копий файлов. Дополнительные сведения см. в разделе "Использование DIRID" и "Запуск из хранилища драйверов".

В следующем примере кода показано, как обновить INF-файл, использующий старый синтаксис.

Сведения о разных исходных файлах, сопоставленных с одним целевым файлом

Исходный код Комментарий
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_B] CopyFiles = CopyFiles.B

Выберите место, куда отправляются файлы вручную
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; HW Version A
DesiredFileName2,SourceFile2A ; HW Version A
[CopyFiles.B] DesiredFileName1,SourceFile1B ; HW Version B DesiredFileName2,SourceFile2B ; HW Version B

Метод копирования файлов: переименование файлов, поэтому установленный раздел DDInstall выбирает исходный файл, чтобы получить скопированный в путь к целевому файлу, к которому связан драйвер.

Это не работает в том случае, если все файлы для всех разделов DDInstall копируются перед установкой.

Сведения об использовании записей AddReg HKR

Исходный код Комментарий
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 

Рекомендуется оставить все в каталоге хранилища драйверов (Dirid 13)
[DDInstallSection_A] CopyFiles = CopyFiles.A
[DDInstallSection_A.HW] AddReg = A.AddReg
[DDInstallSection_B] CopyFiles = CopyFiles.B
[DDInstallSection_B.HW] AddReg = B.AddReg


Добавьте раздел AddReg для каждого DDInstall Section.HW, чтобы отслеживать файлы, необходимые для этой установки.
[A.AddReg] HKR, FileName1Path, "%13%\SourceFile1A" HKR, FileName2Path, "%13%\SourceFile2A" [B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A"
HKR,FileName2Path, "%13%\SourceFile2A"


Несколько расположений исходного файла, сопоставленных с одним значением реестра. Это работает, так как надстройка HKR из раздела DDInstall или DDInstall.HW хранится в параметрах устройства. Если устройство установлено с этим пакетом драйвера, оно будет использовать только один из разделов DDInstall, поэтому будет использоваться только один из HKR AddReg, и не будет конфликтов.
[CopyFiles.A]
SourceFile1A ; HW Version A
SourceFile2A ; HW Version A
[CopyFiles.B] SourceFile1B ; HW Version B SourceFile2B ; HW Version B

Все файлы сопоставляются с собственным расположением, поэтому ошибки функциональности и INF не передают InfVerif.
Не используйте CopyFiles для переименования файла, для которого DestinationDirs включает Dirid 13.

Доступ к расположению файла из драйвера (псевдокод)

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

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

Доступ к расположению файла из пользовательского режима

При доступе к целевому файлу из пользовательского режима у вас нет контекста устройства, который имеет драйвер. В этом случае необходимо добавить дополнительный шаг. Перед открытием дескриптора ключа найдите устройство, содержащее значение реестра, указывающее, какой файл нужно загрузить.

Ознакомьтесь с разделом "Запуск из хранилища драйверов", чтобы узнать, как отфильтровать список устройств, чтобы найти устройство и открыть дескриптор в расположении реестра в пользовательском режиме, используя Dirid 13 для получения рекомендаций.

Ошибки 1331 – 1333

Ошибки 1331 – 1333 являются одной и той же проблемой, но связаны с registy значениями, значениями реестра в службах и службах соответственно. Примеры в документации по ошибкам 1330 охватывают методы устранения ошибок 1331 – 1333.