WinUSB で USB デバイスと通信 2 - ファンクションドライバのインストール

Posted Sun Sep 16 2012

今回は WinUsb.sys をデバイスのファンクションドライバとしてインストールします.作業をすすめるにあたって, WDK がインストールしてある必要があります.まだインストールがすんでいない場合には, WDF をあらかじめインストールしてください.

仕組みとしては次回紹介する WinUSB API から WInUsb.sys にメッセージを発行し, WinUsb.sys が実際にデバイスと通信を行う,そんな感じだったと思います.

この作業は非常に簡単で, インストールした WDF から必要な DLL を持ってきて INF ファイルというテキストファイルを書くだけで OK です.

このインストールが完了すると, USB 機器を接続した時に”不明なデバイス”として警告が出されなくなります(OS にデバイスが認識されるようになります).

まず,下記のようなファイル構成でドライバのインストールパッケージを作成します.INF ファイル以外は WDK のインストールフォルダから必要な物を取ってくるだけです.INF ファイルは通信を行うデバイスに合わせて,書き換える必要があります.

driver - amd64 - WdfCoInstaller01009.dll
       |       |- winusbcoinstaller2.dll
       |
       |- ia64 - WdfCoInstaller01009.dll
       |      |- winusbcoinstaller2.dll
       |
       |- x86 - WdfCoInstaller01009.dll
       |      - winusbcoinstaller2.dll
       |
       |- example.inf
       |- dpinst.exe (この exe に関しては後で記載します)

上記 DLL などのインストール場所:

  • WdfCoInstaller01009.dll: WinDDK\BuildNumber\redist\wdf\CPUArch
  • winusbcoinstaller2.dll: WinDDK\BuildNumber\redist\winusb\CPUArch
  • dpinst.exe: WinDDK\BuildNumber\redist\DIFx\dpinst\MultiLin\CPUArch

※ CPUArch は ia32, amd64, x86 とかです.

INF ファイルの作成

最低限,ファイルの下記の項目を変更するだけで OK です.その他の部分は接続した時に,デバイスマネージャーに表示される名前とかに影響する部分なので,認識させるだけなら変更の必要はないです.

  1. [Manufacturer]セクションの VID&PID は通信するデバイス固有の値を入れます.

    • デバイスを接続して,デバイスマネージャーのプロパティから調べることができる.
  2. [WinUSB_Install]セクションの KmdfLibraryVersion -> 使用している WDF のバージョンに一致させる.
  3. [Dev_AddReg]セクションの GUID -> SetupDiGetClassDevs() API の引数として与える
  4. [CoInstallers_AddReg]セクションの WdfCoInstaller01009.dll のバージョン
  5. [SourceDisksNames]セクション -> CPU の Archtecture ごとに DLL を入れてフォルダとして指定
  6. その他の部分はデバイスマネージャーに表示される項目だったりするので,変更しなくとも動きます.

    • 必要に合わせて変更して下さい.
[Version]
Signature = "$Windows NT$"
Class = MyDeviceClass
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider = %ManufacturerName%
CatalogFile=MyCatFile.cat
DriverVer=09/16/2012,1.0.0.0

; ================== Class section ==================
[ClassInstall32]
Addreg=MyDeviceClassReg

[MyDeviceClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,-1

; ========== Manufacturer/Models sections ===========
; VIDとPIDをデバイスに合わせて変更する
[Manufacturer]
%ManufacturerName% = Standard,NTx86,NTamd64,NTia64

[Standard.NTx86]
%DeviceName% =USB_Install, USB\VID_1234&PID_1234

[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_1234&PID_1234

[Standard.NTia64]
%DeviceName% =USB_Install, USB\VID_1234&PID_1234

; =================== Installation ===================

[USB_Install]
Include=winusb.inf
Needs=WINUSB.NT

[USB_Install.Services]
Include=winusb.inf
AddService=WinUsb,0x00000002,WinUsb_ServiceInstall

[WinUsb_ServiceInstall]
DisplayName = %WinUsb_SvcDesc%
ServiceType = 1
StartType = 3
ErrorControl= 1
ServiceBinary = %12%\WinUSB.sys

[USB_Install.Wdf]
KmdfService=WINUSB, WinUsb_Install

[WinUsb_Install]
KmdfLibraryVersion=1.9

[USB_Install.HW]
AddReg=Dev_AddReg

[Dev_AddReg]
; デバイス側とGUIDを合わせる
HKR,,DeviceInterfaceGUIDs,0x10000,"{4CB642FB-45E2-4B5B-9ED9-37D0E35A2C2C}"

[USB_Install.CoInstallers]
AddReg=CoInstallers_AddReg
CopyFiles=CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"

[CoInstallers_CopyFiles]
WinUsbCoInstaller2.dll
WdfCoInstaller01009.dll

[DestinationDirs]
CoInstallers_CopyFiles=11

; ================= Source Media Section =====================

[SourceDisksNames]
1 = %DiskName%,,,\x86
2 = %DiskName%,,,\amd64
3 = %DiskName%,,,\ia64

[SourceDisksFiles.x86]
WinUsbCoInstaller2.dll=1
WdfCoInstaller01009.dll=1

[SourceDisksFiles.amd64]
WinUsbCoInstaller2.dll=2
WdfCoInstaller01009.dll=2

[SourceDisksFiles.ia64]
WinUsbCoInstaller2.dll=3
WdfCoInstaller01009.dll=3

; =================== Strings ===================

[Strings]
ManufacturerName="ManufacturerName"
ClassName="Samples"
DiskName="USB Installation Disk"
WinUsb_SvcDesc="WinUSB Driver"
DeviceName="MyDeviceClass"

WinUsb.sys のインストール

上記の INF ファイルと DLL をコピーしたフォルダ構成ができたら,実際に USB 機器を接続してインストールします. OS に認識されない状態だと不明なデバイスと表示されたり,ウィザードが出てくると思います.

このウィザードでデバイスドライバの場所として上記 INF ファイルがある場所を指定します. INF ファイルが正しく記述できていれば,インストールされ不明なデバイスという警告が なくなるはずです.また正しくインストールできれば,デバイスマネージャーから認識したデバイスを確認できます.INF ファイルに設定した名前が表示されるはずです.適宜必要に合わせて,変更してください.デバイスマネージャーのドライバ更新からもいけます.