InfVerif 오류 1330 - 1333
InfVerif 오류 1330은 하나의 대상 파일을 여러 원본 파일로 덮어쓰는 기능 오류를 방지하는 데 도움이 됩니다. 예시:
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; Used by DDInstallSection A
[CopyFiles.B]
DesiredFileName1,SourceFile1B ; Used by DDInstallSection B
여러 DDInstall 섹션에서 CopyFiles 지시문을 사용하여 여러 원본 파일을 단일 대상 파일에 복사하는 경우 DDInstall 섹션이 모두 동일한 시스템에서 처리될 경우 이러한 CopyFiles가 충돌할 수 있습니다. 이러한 예는 두 개의 서로 다른 디바이스가 동일한 드라이버를 사용하지만 다른 설치 섹션을 사용하거나 일부 오프라인 드라이버 이미징 및 배포 시나리오에서 사용하는 경우입니다. 서로 다른 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 DDInstall 섹션 또는 INF DDInstall.HW 섹션에서 참조하는 추가 레지스트리 섹션에서 HKR reg-root 항목을 사용하여 INF AddReg 지시문을 사용합니다.
레지스트리 값은 단일 대상 파일 위치 대신 대상 파일을 추적하므로 드라이버는 해당 파일에 다르게 액세스해야 합니다. 대상 파일에 액세스하려면 이제 드라이버가 다음 API 중 하나를 호출하여 레지스트리 값을 열고 해당 원본 파일의 위치를 반환하도록 해야 합니다.
WDM
Wdf
기타 사용자 모드 코드
참고 항목
이 예제에서는 INF 페이로드가 솔루션에 영향을 주지 않는 파일의 대상 위치입니다. 그러나 모범 사례를 사용하려면 더 적은 수의 파일 복사본을 통해 더 빠른 설치를 제공하기 때문에 이 예제에서는 DIRID 13을 사용합니다. 자세한 내용은 "DIRID 사용" 및 "드라이버 저장소에서 실행"을 참조하세요.
다음 예제 코드는 이전 구문을 사용하는 INF를 업데이트하는 방법을 보여줍니다.
하나의 대상 파일에 매핑된 다른 원본 파일에 대한 세부 정보
소스 코드 | Comment(설명) |
---|---|
[DestinationDirs] CopyFiles.A = 12 CopyFiles.B = 12 |
파일이 수동으로 이동하는 위치 선택 |
[CopyFiles.A] DesiredFileName1,SourceFile1A ; HW Version A DesiredFileName2,SourceFile2A ; HW Version A |
파일 복사 기술: 설치 중인 DDInstall 섹션이 원본 파일을 선택하여 드라이버가 연결된 대상 파일 경로로 복사되도록 파일 이름을 바꿉니다. 설치하기 전에 모든 DDInstall 섹션의 모든 파일이 복사되는 경우에는 작동하지 않습니다. |
AddReg HKR 항목을 사용하여 업데이트에 대한 세부 정보
소스 코드 | Comment(설명) |
---|---|
[DestinationDirs] CopyFiles.A = 13 CopyFiles.B = 13 |
드라이버 저장소 디렉터리에 모든 항목을 두는 것이 가장 좋습니다(Dirid 13). |
[DDInstallSection_A] CopyFiles = CopyFiles.A |
각 DDInstall Section.HW에 대한 AddReg 섹션을 추가하여 해당 설치에 필요한 파일을 추적합니다. |
[A.AddReg] HKR,, FileName1Path, "%13%\SourceFile1A" HKR,, FileName2Path, "%13%\SourceFile2A" |
하나의 레지스트리 값에 매핑된 여러 원본 파일 위치입니다. 이는 DDInstall 또는 DDInstall.HW 섹션의 HKR AddReg가 디바이스 설정에 저장되기 때문에 작동합니다. 이 드라이버 패키지와 함께 디바이스를 설치하면 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은 모두 동일한 문제이지만, 각각 Registy 값, 서비스 내의 레지스트리 값 및 서비스와 관련이 있습니다. 오류 1331 - 1333 오류를 해결하기 위한 오류 1330 표지 기술에 대한 설명서의 예제입니다.