Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ошибка 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 |
Выберите место, куда отправляются файлы вручную |
[CopyFiles.A] DesiredFileName1,SourceFile1A ; HW Version A DesiredFileName2,SourceFile2A ; HW Version A |
Метод копирования файлов: переименование файлов таким образом, чтобы раздел DDInstall определял исходный файл для копирования в целевой путь, с которым связан драйвер. Это не работает в том случае, если все файлы для всех разделов DDInstall копируются перед установкой. |
Сведения об обновлении с использованием записей AddReg HKR
| Исходный код | Комментарий |
|---|---|
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 |
Рекомендуется оставить все в каталоге хранилища драйверов (Dirid 13) |
[DDInstallSection_A] CopyFiles = CopyFiles.A |
Добавьте раздел AddReg для каждого DDInstall Section.HW, чтобы отслеживать файлы, необходимые для этой установки. |
[A.AddReg] HKR, FileName1Path, "%13%\SourceFile1A" HKR, FileName2Path, "%13%\SourceFile2A" [B.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" |
Несколько расположений исходного файла, сопоставленных с одним значением реестра. Это работает, так как надстройка HKR из раздела DDInstall или DDInstall.HW хранится в параметрах устройства. Если устройство установлено с этим пакетом драйвера, оно будет использовать только один из разделов DDInstall, поэтому будет использоваться только один из HKR AddReg, и не будет конфликтов. |
[CopyFiles.A] SourceFile1A ; HW Version A SourceFile2A ; HW Version A |
Все файлы сопоставляются с собственными расположениями, поэтому ошибок функциональности нет, и 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 являются одной и той же проблемой, но связаны со значениями реестра, значениями реестра в службах и самими службами соответственно. Примеры в документации по ошибкам 1330 охватывают методы устранения ошибок 1331 – 1333.