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 AddReg 指示詞,在 INF DDInstall 區段或 INF DDInstall.HW 區段中參考的 add-registry-section 中使用 HKR reg-root 專案。
由於登錄值會追蹤目標檔案,而不是單一目的地檔案位置,因此驅動程序必須以不同的方式存取這些檔案。 若要存取目標檔案,驅動程式現在必須呼叫下列其中一個 API 來開啟登錄值,並讓它傳回該來源檔案的位置:
Wdm
WDF
其他使用者模式程序代碼
注意
在此範例中,INF 承載檔案的目的地位置不會影響解決方案。 不過,為了使用最佳做法,此範例會使用 DIRID 13,因為它透過較少的檔案複本提供更快的安裝速度。 如需詳細資訊,請參閱<
下列範例程式代碼示範如何更新使用舊語法的 INF。
對應至一個目的地檔案之不同來源檔案的詳細數據
原始程式碼 | 註解 |
---|---|
[DestinationDirs]CopyFiles.A = 12 CopyFiles.B = 12 |
挑選手動移轉檔案的位置 |
[CopyFiles.A] DesiredFileName1,SourceFile1A ; HW Version A DesiredFileName2,SourceFile2A ; HW Version A |
檔案複製技術:重新命名檔案,以便安裝的 DDInstall 區段會挑選要複製到驅動程式所連結目的地檔案路徑的來源檔案。 在安裝之前,所有 DDInstall 區段的所有檔案都會複製過來,這無法運作。 |
使用 AddReg HKR 專案進行 Udating 的詳細數據
原始程式碼 | 註解 |
---|---|
[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” [B.AddReg] HKR、FileName1Path、“%13%\SourceFile1A” |
對應至一個登錄值的多個來源檔案位置。 這是因為 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 的技術。