やること
C:\Windows\INF\usbser.infを参考にして、infファイルがどういう内容なのかを見る。
infファイルとは?
INFファイルは、以下のようなものである。
- Windowsデバイスドライバーのセットアップ情報ファイルのこと
- 情報=Information→infファイル
- Windowsで使われる設定ファイルで、特にデバイスドライバのインストールに使われる
- 「どのデバイスにどのドライバを入れるか」「どのファイルをコピーするか」「どんなレジストリ設定を追加するか」を細かく指示する役割を持っている
- 一言で言うと、「ドライバのインストールスクリプト」である
なので、テストのためにドライバを異常な状態にしようと思ったときには、、、
ということになる。
infファイルが使われるときの流れ
MS公式には、下記のようにある。
- 最初に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にどのようなものがあるかは、👇に書かれている。
※このページ上では、全部小文字で書かれているけど、実際の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 ディレクティブに入れる値であれば、以下のような予約語を入れる。
- $CHICAGO$ - Windows 95/98/ME用
- $WINDOWS NT$ - Windows NT系用(現在の標準)
参考: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