皆さん、お久しぶりです。なおきお~です。
以前、私よりドライバをビルドする方法をご案内いたしました。
今回は、ビルドしたドライバをインストールするためのINFファイルの記述方法をご案内したいと思います。
また、前回と同様 toasterのbusドライバを例にしたいと思います。
まず、ドライバのインストールでは、INF ファイルが必要であり、toasterのbusドライバのINFファイルは、%BASEDIR%\src\general\toaster\infにCPUの種別ごとに格納されており、例えば、x64の場合、%BASEDIR%\src\general\toaster\inf\amd64\bus.infになります。
このINFファイルをメモ帳などで、オープンしますと、最初に[Version]セクションが記述されています。
[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}
Provider=%MSFT%
DriverVer=09/21/2006,6.0.5736.1
CatalogFile=toaster.cat
[Version]セクションには、Signature は、OS の種類を記述しますが、以下のように、Overviewなので、通常は、サンプル通り、$Windows NT$のままでよいと思います。
$Windows NT$: NT-based operating systems
$Windows 95$: Windows 9x/Me
$Chicago$: All Windows operating systems
ClassやClassGuidは、デバイスのクラス (種類) になります。また、システム定義のデバイス クラスは、以下の通り色々あり、開発するデバイスの種類に合わせて、変更する必要があります。もし、システム定義には、該当するデバイス クラスがない場合、独自のデバイスのクラスを定義することもできます。
System-Supplied Device Setup Classes
http://msdn.microsoft.com/en-us/library/ms791134.aspx
次にProviderは、ドライバを提供するメーカを記述するので、サンプル コードから、適宜 変更する必要があります。まあ、サンプル コードのように、%<Keyword>%と"%"で囲むと[String]セクションに定義した文字列を参照するようにできます。
最後に、オプションになりますが、DriverVerとCatalogFileは、ドライバのバージョンとカタログ ファイルの指定します。
カタログ ファイルは、INFファイルに記述するドライバセットに対して、ドライバ署名がされている必要があり、Windows Vista 以降のドライバでは、x64 で必須になっています。また、署名をするためには、商用の CA証明書ベンダから署名用の証明書を取得するか、サーバを構築して証明書サーバーを使用するか、makecert.exe を使用するかの、何れかになります。
コード署名証明書を取得する
http://technet.microsoft.com/ja-jp/library/cc732597.aspx
ドライバの開発時には、三つの方法のうち、makecert.exe を使用して、テスト署名を行うのが、一番 容易だと思いますので、64 ビットの Windows Vista を例にmakecert.exeで、ドライバ署名を行う方法をお見せします。
① 管理者モードでコマンド プロンプトを起動
② 証明書ファイルの作成(使用例)Makecert.exe -r -pe -ss TestCert -n "CN= TestCert " TestCert.cer
③ 証明書ファイルの登録(使用方法)certmgr.exe -add TestCert.cer -s -r localMachine rootcertmgr.exe -add TestCert.cer -s -r localMachine trustedpublisher
④ INFファイルからカタログ ファイルを作成(使用例)Inf2cat.exe /driver:bus.inf /os:Vista_X64
⑤ 上記②で作成した証明書で署名(使用例)SignTool sign /v /s TestCert /n TestCert /t http://timestamp.verisign.com/scripts/timestamp.dll toaster.cat
⑥ テスト モードに移行bcdedit.exe /set TESTSIGNING ON
⑦ Windows Vista を再起動shutdown.exe -r
[Version]セクションの次は、インストール先やインストール元のセクションです。
[DestinationDirs]
DefaultDestDir = 12
[SourceDisksNames]
1 = %DiskId1%,,,""
[SourceDisksFiles]
busenum.sys = 1,,
[DestinationDirs]セクションは、インストール先で、少なくともデフォルト(DefaultDestDir) を指定する必要があり、Printer のような例外を除いて、ほとんど 12 (%windir%\system32\drivers) になります。
Using Dirids
http://msdn.microsoft.com/en-us/library/ms790174.aspx
また、[SourceDisksNames] セクションは、ドライバディスクの名前になり、ドライバのインストール中に表示されるディスクの要求ダイアログで表示されます。しかし、ドライバを適切に署名して、PnP でインストールするように適切にセットアップしてお���ば、ダイアログは表示されません。
[SourceDisksFiles] セクションは、ドライバセットのファイルが、どこに格納されているかを記述します。比較的 よく記述する方法として、x86やx64のように複数のCPUのドライバを一つのINFファイルにまとめるときに以下のように記述します。
readme.txt = 1
[SourceDisksFiles.x86]
busenum.sys = 1,\x86
[SourceDisksFiles.amd64]
busenum.sys = 1,\ amd64
[SourceDisksFiles.ia64]
busenum.sys = 1,\ ia64
[SourceDisksFiles] セクションのSuffixは、なし・".x86"・".amd64"・". ia64" の何れかになり、Suffixがない場合は、全て条件に適用されます。
また、サンプル コードでは、複数のINFファイルになっているので、試しに、一つのINFファイルにまとめみるのもいいと思います。
インストール先やインストール元のセクションの次は、[Manufacturer] セクションとモデルセクションです。
[Manufacturer]
%StdMfg%=Standard,NTamd64
[Standard.NTamd64]
%ToasterBus.DeviceDesc%=ToasterBus_Device, root\busenum
[Manufacturer]セクションには、"ドライバ提供メーカ名=モデルセクション名" と記述し、複数のCPUのドライバを一つのINFファイルにする場合は、,NTx86, NTamd64, NTia64 という具合にカンマ"," で区切ります。
また、CPU種別のみならず、Windows OS のバージョンやエディションなども指定できるので、ClientのWindows OS専用のドライバを提供することが可能です。
INF Manufacturer Section
http://msdn.microsoft.com/en-us/library/ms794359.aspx
モデルセクションは、[Manufacturer] で指定したモデルセクション名にSuffixとして、CPU種別やWindowsOSのバージョンを付記します。複数のCPUを一つのINFファイルに指定する場合は、それぞれのモデルセクションが必要となります。
そして、モデルセクションは、"デバイス名=インストールセクション名, Hardware ID" を記述します。また、ここで指定するHardware ID が、マッチングしないと、PnPでは、デバイスを検知することができないので、注意してください。
インストールセクションでは、ファイルをコピーしたり、レジストリを追加するなどの指定ができます。また、"インストールセクション+.Service" のようにサービスの追加もできます。
また、インストールセクションは、デバイス クラスによって、それぞれ特徴があるので、同じデバイス クラスのサンプル コードを参照してください。
INF Sections
http://msdn.microsoft.com/en-us/library/dd445200.aspx
なお、INFファイルを記述し、ドライバ署名もしたら、pnputil.exe <INF file>と実行すれば、PnPが発生したら、サイレントでインストールをするようにセットアップします。
ただし、toasterのbusドライバは、仮想busドライバなので、手動でインストールをする必要があります。
それでは、また。