.infファイルを読み解く

やること

C:\Windows\INF\usbser.infを参考にして、infファイルがどういう内容なのかを見る。

infファイルとは?

INFファイルは、以下のようなものである。

  • Windowsデバイスドライバーのセットアップ情報ファイルのこと
    • 情報=Information→infファイル
  • Windowsで使われる設定ファイルで、特にデバイスドライバのインストールに使われる
  • 「どのデバイスにどのドライバを入れるか」「どのファイルをコピーするか」「どんなレジストリ設定を追加するか」を細かく指示する役割を持っている
  • 一言で言うと、「ドライバのインストールスクリプト」である

なので、テストのためにドライバを異常な状態にしようと思ったときには、、、

  • どのファイルを消すと、どのデバイスが動かなくなるかがわかる
  • どのレジストリを消すと、どのデバイスが動かなくなるかがわかる

ということになる。

infファイルが使われるときの流れ

MS公式には、下記のようにある。

MS公式
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/general-syntax-rules-for-inf-files

  • 最初にINFバージョン セクションが検索され、INFファイルの有効性が確認されます。
  • 次に、Manufacturerセクションを見つけてインストールを開始します。
    • このセクションには、INF モデル セクションへのディレクティブが含まれており、 このセクションでは、インストールされているデバイスのハードウェア ID に基づいて、 さまざまな INF DDInstall セクションにつながるディレクティブを提供します。

また、「Looking at an INF File」のページには、以下のような図がある。

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/looking-at-an-inf-file

infは、まずはこのManufacturerセクションから読み始めればよいっぽい。

セクション

INFファイルの [ と ]で囲まれた部分はセクション(Section)と呼ばれる。

セクションの中には、そのセクションにかかわる設定や命令が書かれる。

特定の名前(Versionなど)が決まっており、それぞれに意味と役割がある。
セクションの一覧は下記にある。

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/summary-of-inf-sections

Manufacturerセクション

[Manufacturer]
%MSFT% = Standard, NTamd64

のような内容。

=の左辺に、製造元名が書かれる。
これが、デバマネ等で、製造元の名前として表示される。

=の右辺に、モデルズセクション名、ターゲットOSバージョン1、ターゲットOSバージョン2、、、、と続く。

このManufacturerセクションの値をもとに、以下のようにモデルズセクション名が書かれることになる。

[モデルズセクション名.ターゲットOSバージョン1]
[モデルズセクション名.ターゲットOSバージョン2]

ターゲットOSにどのようなものがあるかは、👇に書かれている。

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/creating-inf-files-for-multiple-platforms-and-operating-systems

※このページ上では、全部小文字で書かれているけど、実際のINFファイルでは大体大文字で書かれている??

2025年時点で、一般的なデスクトップPC、ノートPCはほぼすべてx64(AMD64アーキテクチャらしいので、ほとんどのINFでは、NTamd64 が指定されているっぽい?

Surface Pro XやApple silicon(ただしWindowsではない)、Snapdragon搭載Windows PCなど一部で増えつつあるので、そこ向けの場合はNTarm64も使われる。

参考:

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-manufacturer-section

Modelsセクション

[Standard.NTamd64]
%UsbSerial.DeviceDesc% = UsbSerial_Install, USB\Class_02&SubClass_02&Prot_01
%UsbSerial.DeviceDesc% = UsbSerial_Install, USB\Class_02&SubClass_02

バイスの識別(ハードウェアID)と、そのデバイスに使うインストール方法(DDInstallセクション)を組み合わせるためのセクション。

Manufacturerセクションで定義した「モデルズセクション名」と「ターゲットOSバージョン」と、ここで定義する「インストール(DDInstall)セクション名」、さらにデバイスのIDを使う。

=の左辺に、インストールするデバイスのDescriptionが書かれる。

これが、デバマネ等のDescriptionに出てくる(と思われる)

=の右辺に、インストールセクション名、ハードウェアID、と書かれる。

このデバイスのDescriptionに紐づくハードウェアIDはこれで、このインストールセクションに従ってインストールするよ、ということ。

※infでは、Manufacturerセクションやこのセクションのように、=の左辺に、なんというかそのセクションへの「設定値」が書かれてるっぽい。

違和感すごい、、、

イメージ的に、=は代入ではなくて、左辺の設定値に、右辺を関連付ける矢印「→」みたいなものかも。。。

参考:

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-models-section

Installセクション(DDInstallセクション)

DDInstallは、DeviceDriverInstall、のこと。

[UsbSerial_Install.NT]
CopyFiles   = UsbSerial_CopyFiles
AddReg      = UsbSerial_AddReg
AddProperty = UsbSerial_AddProperty

のような内容。

UsbSerial_Install

の、UsbSerial_Installはインストールセクション名で、
NTはManufacturerセクションと同じ「ターゲットOSバージョン」の表記。

usbser.infでここが「NT」なのは、プラットフォームがNTamd64でもNTX86でも、どちらの場合でも[UsbSerial_Install.NT]のDDInstallセクションが使われるようにするため。

AIによると、以下の優先順位で、DDInstallセクションは選ばれる。

64ビット(NTamd64)の場合
[UsbSerial_Install.NTamd64]   ←最優先で探す
[UsbSerial_Install.NT]        ← なければこれを使う
[UsbSerial_Install]           ←それもなければ拡張なしを使う

32ビット(NTx86)の場合
[UsbSerial_Install.NTx86]     ←最優先で探す
[UsbSerial_Install.NT]       ←なければこれを使う
[UsbSerial_Install]          ←それもなければ拡張なしを使う

今回の例だと、このセクションには以下の3つのディレクティブが含まれている。

  • CopyFiles
    →ファイルをコピーするためのもの。右辺(ここでは UsbSerial_CopyFiles セクションにある内容に沿って、コピー処理をする)
  • AddReg
    レジストリキーや値を追加・変更するためのもの。右辺(ここでは UsbSerial_AddReg セクションにある内容に沿って、レジストリ変更処理をする)
  • AddProperty
    →デバイスのプロパティを設定する(Windows Vista以降)ためのもの。右辺(ここでは UsbSerial_AddProperty セクションにある内容に沿って、プロパティ作成処理をする)

※現時点で「デバイスのプロパティ」が何なのか?よくわからん。。。

CopyFiles = セクション名と書くと、右辺のセクション名が「file-list-section」であるという扱いになり、そこにコピーしたいファイルを書いておけば、コピーが行われる、という仕組み。

ディレクティブ

INFファイルの各セクションに書かれる、命令/指示のこと。

セクションごとに持っているディレクティブが異なる。

ディレクティブの一覧は👇にある。

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/summary-of-inf-directives

CopyFileディレクティブとそのセクション

[UsbSerial_Install.NT]
CopyFiles=UsbSerial_CopyFiles
[UsbSerial_CopyFiles]
usbser.sys,,,0x100

その辺の仕様は、👇に書かれている。

INF CopyFiles ディレクティブ
https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-copyfiles-directive

コピーする元ファイル名、コピー先ファイル名(同じ場合は省略可)、どういうコピーするかを決めるフラグ、を指定するとのこと。 ※このフラグ、0x100が指定されているが、々の公式docにも、0x100がなんなのか、記載がなかった。
(WDKに含まれる「setupapi.h」を見ればわかるかも?)

AddRegディレクティブとそのセクション

[UsbSerial_Install.NT]
AddReg=UsbSerial_AddReg
[UsbSerial_AddReg]
HKR,, PortSubClass, %REG_BINARY%, 02
HKR,, EnumPropPages32, 0, "msports.dll,SerialPortPropPageProvider"

仕様は下記。

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-addreg-directive

インストールが行われる際にレジストリの値を編集する。

レジストリのルート、サブキー、バリューエントリー名、フラグ、値の形になる。

レジストリのルートに指定できる値は、公式ドキュメントにある通り。(よく見る「HKLM HKEY_LOCAL_MACHINE」などのアレ。)

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-addreg-directive

AddPropertyディレクティブとそのセクション

[UsbSerial_Install.NT]
AddProperty = UsbSerial_AddProperty
[UsbSerial_AddProperty]
GenericDriverInstalled,,,1

仕様は下記。

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-addproperty-directive

そもそも「デバイスのプロパティ」が何なのかをよくわかってないので、この設定もよくわからなかった。。。。

※内容を見るに、デバマネの各デバイスのプロパティの中の「詳細」タブで見れるアレっぽいのか。。。?

アレがここで設定されていた???

Installセクションのサブセクション

[UsbSerial_Install.NT.Hw]

のような内容。

※今回のusbserial.infだと、このセクションは空っぽだった。

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/summary-of-inf-sections

でいうところの、下記あたりがそれにあたるらしい。

DDInstall.Services Section
DDInstall.HW Section
DDInstall.Events Section
DDInstall.Components Section
DDInstall.Software Section
DDInstall.Interfaces Section

サブセクションによって、役割がちがう。

DDInstall.Servicesだったら、サービスの作成と設定を行う。

DDInstall.HWだったら、デバイス固有の情報(レジストリなど)を扱ったりする。

Stringsセクション

要するに、文字列の変数をつくるところ。(文字列トークンと言うらしい)

ここで定義した文字列トークンを、ほかのセクションで「%」で挟んで使うと、そこはここで定義した文字列に置き換えられる。

多言語対応のために、ここがあるらしい。

usbser.infには出てこなかったが、多言語対応する場合は下記のようにするらしい。(AIによる説明。未検証)

[Strings]
; デフォルト(英語)
MSFT = "Microsoft"
UsbSerial.DeviceDesc = "USB Serial Device"
UsbSerialModem.DeviceDesc = "USB Serial Modem Device"
UsbSerial.DriverDesc = "Microsoft USB Serial Driver"

[Strings.0411]
; 日本語(0411=ja-JP)
MSFT = "Microsoft"
UsbSerial.DeviceDesc = "USB シリアル デバイス"
UsbSerialModem.DeviceDesc = "USB シリアル モデム デバイス"
UsbSerial.DriverDesc = "Microsoft USB シリアル ドライバー"

[Strings.0407]
; ドイツ語(0407=de-DE)
MSFT = "Microsoft"
UsbSerial.DeviceDesc = "USB-Serielles Gerät"
UsbSerialModem.DeviceDesc = "USB-Serielles Modem Gerät"
UsbSerial.DriverDesc = "Microsoft USB-Serieller Treiber"

システム予約語

[Version]
Signature = "$WINDOWS NT$"

に出てくるような「$」で囲まれた部分は、システムで定義済みの、意味のある予約語であることを示す。

例えば Signature ディレクティブに入れる値であれば、以下のような予約語を入れる。

参考:INF Version Section - Microsoft Docs

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-version-section

コメント

「;」ではじまる部分はコメント。

情報源

Windows ドライバの INF ファイルの文法

https://qiita.com/mmake/items/7a3699227cc234020b50

公式(INF ファイルの概要)

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/overview-of-inf-files

公式(セクションの種類)

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/summary-of-inf-sections

公式(infファイルの紹介?)

→各セクションの関連図がある。イメージがわかりやすいかも

https://learn.microsoft.com/en-us/windows-hardware/drivers/install/looking-at-an-inf-file

ClassGuidに出てくるGUID

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/install/system-defined-device-setup-classes-available-to-vendors