InfVerif エラー 1330 - 1333
InfVerif エラー 1330 は、1 つの宛先ファイルが複数のソース ファイルによって上書きされる機能エラーを防ぐのに役立ちます。 次に例を示します。
[CopyFiles.A]
DesiredFileName1,SourceFile1A ; Used by DDInstallSection A
[CopyFiles.B]
DesiredFileName1,SourceFile1B ; Used by DDInstallSection B
複数の DDInstall セクション が CopyFiles ディレクティブを使用して異なるソース・ファイルを 1 つの宛先ファイルにコピーする場合、 DDInstall セクション がすべて同じシステムで処理されると、これらの CopyFiles が競合する可能性があります。 この例は、2 つの異なるデバイスが同じドライバーを使用しているが、インストール セクションが異なる場合、または一部のオフライン ドライバー イメージングと展開シナリオの場合です。 異なる DDInstall セクション の複数のソース ファイルが同じ単一のコピー先ファイルにコピーされるため、異なる DDInstall セクション の異なるソース ファイルが互いに上書きされ、コピー先に最後にコピーされたファイルがコピー先に配置され、予期した結果にならない可能性があります。
ケース
このドキュメントでは、次の場合に機能エラーを削除するメソッドに古い構文を更新する方法について説明します。 各 INF に固有のその他の理由が考えられるため、すべてのケースを以下に示すわけではありません。
DDInstall セクション ごとに、 1 つのサービスのサービス バイナリの名前を変更する
異なる DDInstall セクション では、 ソース ファイルの名前を変更して、ドライバーまたはユーザー モード アプリケーションによってアクセスされる宛先ファイルの場所にコピーされます。
DDInstall セクション ごとに、 1 つのサービスのサービス バイナリの名前を変更する
次のコードは、 DDInstall セクション が 1 つのサービスのサービス バイナリの名前を変更する方法の例です。
[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 セクション では、 ソース ファイルの名前を変更して、ドライバーまたはユーザー モード アプリケーションによってアクセスされる宛先ファイルの場所にコピーされます。
この場合、ドライバーは、動的なファイルの場所として使用されている固定ファイルの場所にアクセスしています。 複数のソース ファイルを追跡する 1 つの動的変数を使用するには、 AddReg HKR エントリを使用して、実行時に取得できるパスを格納できます。 これは、 AddReg HKR エントリがデバイスに対して相対的に格納されるために機能します。
AddReg HKR エントリは、ソース ファイルをコピーする 1 つのコピー先ファイルを選択する代わりに、ソース ファイルのファイルの場所を指定します。
[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 ディレクティブ を使用します。
レジストリ値は 1 つの宛先ファイルの場所ではなくターゲット ファイルを追跡するため、ドライバーはそれらのファイルに異なる方法でアクセスする必要があります。 ターゲット ファイルにアクセスするには、ドライバーが次のいずれかの API を呼び出してレジストリ値を開き、そのソース ファイルの場所を返す必要があります。
WDM
WDF
その他のユーザー モード コード
Note
この例では、INF ペイロードがソリューションに影響を与えないファイルの宛先の場所。 ただし、ベスト プラクティスを使用するために、この例では DIRID 13 を使用します。これは、ファイル コピーの数が少ないほど高速なインストールが提供されるためです。 詳細については、「DIRID の使用」および「ドライバー ストアから実行する」を参照してください。
次のコード例は、古い構文を使用する INF を更新する方法を示しています。
1 つの宛先ファイルにマップされたさまざまなソース ファイルの詳細
ソース コード | コメント |
---|---|
[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" |
1 つのレジストリ値にマップされた複数のソース ファイルの場所。 これは、DDInstall または DDInstall.HW セクションの HKR AddReg がデバイス設定に格納されるために機能します。 デバイスがこのドライバー パッケージと共にインストールされると、DDInstall セクションの 1 つだけが使用されるため、HKR AddReg の 1 つだけが使用され、競合は発生しません。 |
[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 を解決するための手法が説明されています。