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 區段 的 add-registry-section 中,使用 HKR reg-root 項目 並使用 INF AddReg 指示詞。
因為登錄值會追蹤目標檔案,而不是單一目的地檔案位置,所以驅動程式必須以不同的方式存取這些檔案。 若要存取目標檔案,驅動程式現在必須呼叫下列其中一個 API 來開啟登錄值,並讓它傳回該來源檔案的位置:
WDM
WDF
其他使用者模式程式碼
備註
在此範例中,INF 承載檔案的目的地位置不會影響解決方案。 不過,若要使用最佳實務,此範例會使用 DIRID 13,因為它會透過較少的檔案複本提供更快的安裝速度。 如需詳細資訊,請參閱「使用 DIRID」和「從驅動程式存放區執行」。
下列範例程式碼示範如何更新使用舊語法的 INF。
對應至單一目的地檔案的各種來源檔案詳細資訊
| 原始程式碼 | 評論 |
|---|---|
[目的地目錄]CopyFiles.A = 12 CopyFiles.B = 12 |
手動選擇文件的位置 |
[CopyFiles.A] DesiredFileName1,SourceFile1A ; HW Version A DesiredFileName2,SourceFile2A ; HW Version A |
檔案複製技術:重新命名檔案,讓正在安裝的 DDInstall 區段挑選來源檔案,以複製到驅動程式所連結的目的地檔案路徑。 如果在安裝之前複製所有 DDInstall 區段的所有檔案,則這不起作用。 |
使用 AddReg HKR 項目進行更新的詳細資料
| 原始程式碼 | 評論 |
|---|---|
[目的地目錄]CopyFiles.A = 13 CopyFiles.B = 13 |
最佳做法是將所有內容保留在驅動程式存放區目錄中 (Dirid 13) |
[DDInstallSection_A]CopyFiles = CopyFiles.A |
為每個 DDInstall Section.HW 新增 AddReg 區段,以追蹤該安裝所需的檔案。 |
[A.新增註冊] 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 都是相同的問題,但分別與登錄值、服務內的登錄值和服務有關。 錯誤 1330 檔中的範例涵蓋解決錯誤 1331 - 1333 的技術。