ドライバのビルド方法

なおきお~です。

 

昨日のお約束通り、WDK/DDK のお話をしたいと思います。

私は、以前DDK/WDK の入手方法とインストールを紹介しました。今回は、その続きとして、ドライバのビルド方法を紹介したと思います。

 

まず、ビルドをするには、スタートメニューから [Windows Driver Kits] → [WDK 6001.18002] → [Build Environments] をオープンすると各 OS のフォルダから適宜 ビルド環境を選択します。また、ビルド環境は、コマンドラインベースで、ショートカット名は、以下のルールで名前が決まっています。

 

" [OS Version] [CPU] [Build Mode] Build Environment"

 

[OS Version]

Windows 2000

Windows XP

Windows Server 2003

Windows Vista and Windows Server 2008

 

[CPU]

x86

x64

ia64

 

[Build Mode]

Free

Checked

 

もし、64 ビットの Windows Vista のドライバをビルドしたい場合は、"Windows Vista and Windows Server 2008 x64 Free Build Environment" を選択します。

このショートカットを選択すると、%BASEDIR% が、起動パスになり、多く方は、c:\winddk\6001.18002 になると思います。

 

今回は、Cleng さんが、紹介した Toaster ドライバをビルドしてみます。

まず、cd src で、サンプル コードのルート フォルダに移動します。

ここで dir をすると、dirs というファイルがあります。よく見ると、src フォルダのサブ フォルダには、至る所に dirs ファイルがあります。

dirs ファイルは、テキスト ファイルで、カレント フォルダで、ビルドした場合、ビルド対象となるサブフォルダを記述しています。

もし、%BASEDIR%\src で、ビルドしてしまうと、サンプル コードを全部ビルドしてしまい、非常に時間が掛かるので、暇なとき以外は、控えたほうがいいと思います。

C:\WINDDK\6001.18002\src>type dirs

DIRS= \

     1394 \

     audio \

     AVStream \

     bth \

     filesys \

     general \

     hid \

     input \

     ir \

     kernel \

     kmdf \

     mmedia \

     network \

     print \

     setup \

     smartcrd \

     storage \

     Swtuner \

     Test \

     umdf \

     usb \

     video \

     videocap \

     wia \

     wmi

C:\WINDDK\6001.18002\src>

 

 

 

%BASEDIR%\src\general\toaster\bus に移動して、ファイルを一覧を見てみると、こんな感じのファイルがあります。

C:\WINDDK\6001.18002\src\general\toaster\bus>dir

 ドライブ C のボリューム ラベルは Windows Vista です

 ボリューム シリアル番号は B421-00D1 です

 

 C:\WINDDK\6001.18002\src\general\toaster\bus のディレクトリ

 

2008/12/08 18:01 <DIR> .

2008/12/08 18:01 <DIR> ..

2008/01/18 21:58 10,721 busenum.c

2008/01/18 21:58 15,380 busenum.h

2008/01/18 21:58 586 busenum.mof

2008/01/18 21:58 343 busenum.rc

2008/01/18 21:58 41,038 buspdo.c

2008/01/18 21:58 271 makefile

2008/01/18 21:58 101 MAKEFILE.INC

2008/01/18 21:58 44,666 pnp.c

2008/01/18 21:58 9,743 power.c

2008/01/18 21:58 348 sources

2008/01/18 21:58 16,025 Wmi.c

              11 個のファイル             139,222 バイト

               2 個のディレクトリ  188,743,041,024 バイトの空き領域

 

C:\WINDDK\6001.18002\src\general\toaster\bus>

 

 

 

makefile があるので、これがソース コードを追加するときは、このファイルを変更するのかな?と直感的に思われるかもしれませんが、気を付けてください、このファイルは変更してはいけません。

C:\WINDDK\6001.18002\src\general\toaster\bus>type makefile

#

# DO NOT EDIT THIS FILE!!!   Edit .\sources. if you want to add a new source

# file to this component. This file merely indirects to the real make file

# that is shared by all the driver components of the Windows NT DDK

#

 

!INCLUDE $(NTMAKEENV)\makefile.def

 

 

 

C:\WINDDK\6001.18002\src\general\toaster\bus>

 

 

 

では、ソース コードを追加するときは、どうするのかというと、ソース コードを追加するときは、sources ファイルを変更します。

source ファイルを見てみると、単語的に何となく、何のマクロかわかると思うのですが、WDK 独特のマクロになっています。

C:\WINDDK\6001.18002\src\general\toaster\bus>type sources

TARGETNAME=BusEnum

TARGETTYPE=DRIVER

 

INCLUDES = ..\inc

 

NTTARGETFILE0=$(OBJ_PATH)\$(O)\busenum.bmf

 

 

TARGETLIBS= $(DDK_LIB_PATH)\wdmsec.lib \

             $(DDK_LIB_PATH)\ntstrsafe.lib

 

SOURCES= busenum.rc \

         busenum.c \

         pnp.c \

         power.c \

         buspdo.c \

         wmi.c

 

_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WIN2K)

 

C:\WINDDK\6001.18002\src\general\toaster\bus>

 

 

 

この sources ファイルを例にすると、赤字のマクロは、以下のような意味となっています。

TARGETNAME

ドライバのファイル名を指定。

TARGETTYPE

ファイル種別を指定。DRIVER は、SYS ファイルです。

INCLUDES

インクルードのパスを指定。

NTTARGETFILE0

ビルド前に、makefile.def に makefile.inc を追加。サンプル コードでは、WMI のマネージ リソース クラスの定義ファイル (MOF ファイル) を指定しているので、makefile.inc を実行して、します。

 

※ $(OBJ_PATH) は、このフォルダで、$(O) は、ビルドしたファイルを保存するフォルダ

TARGETLIBS

リンクするライブラリを指定。

 

※ $(DDK_LIB_PATH) は、WDK の標準のライブラリパス

SOURCES

コンパイルするソース ファイルとリソース ファイルを指定。

_NT_TARGET_VERSION

指定された OS と互換性があるようなビルドを実行。

 

※ ビルドの方法を変えるだけです。ソース コードは、開発時に互換性があるコーディングをする必要があります。

 

 

 

ドライバをビルドする際は、build [enter] と実行しますが、build は、色々とオプションがあり、指定したほうが便利なのもあります。

お勧めのオプションは、doskey のマクロで、定義してあるので、赤字のマクロを使用するのがいいと思います。

C:\WINDDK\6001.18002\src\general\toaster\bus>doskey /macros:all

[cmd.exe]

    BLD=build -cfeg $*

    up=if "$1"=="" (cd ..) else (for /L %i in (1,1,$1) do cd ..)

    COFF=link $*

    LINK32=link $*

    WINDIR=cd %windir% $T %homedrive%

    VIEW=net view \\$*

    QF=format a: /q /u /v:""

    NUSE=net use $* /d

    USE=net use $*

    BCZ=build -cZMg $*

    BZ=build -ZPg $*

    BZZ=build -ZPg $*

    ....=cd ..\..\..\$*

    ...=cd ..\..\$*

    ..=cd ..\$*

 

 

C:\WINDDK\6001.18002\src\general\toaster\bus>

 

 

 

古いオブジェクトを削除して、フルビルドする場合は、BLDBCZ を使用して、差分ビルドする場合は、BZBZZ を使用するのがいいと思います。

私の場合は、ほとんど、BLD を使用するので、今回も BLD を使用します。

C:\WINDDK\6001.18002\src\general\toaster\bus>bld

BUILD: Compile and Link for AMD64

BUILD: Loading c:\winddk\6001.18002\build.dat...

BUILD: Computing Include file dependencies:

BUILD: Start time: Thu Apr 02 22:31:11 2009

BUILD: Examining c:\winddk\6001.18002\src\general\toaster\bus directory for files to compile.

BUILD: Saving c:\winddk\6001.18002\build.dat...

BUILD: Building generated files in c:\winddk\6001.18002\src\general\toaster\bus directory

 _NT_TARGET_VERSION SET TO WS03

BUILD: Examining c:\winddk\6001.18002\src\general\toaster\bus directory for files to compile. (2nd Pass)

BUILD: Compiling and Linking c:\winddk\6001.18002\src\general\toaster\bus directory

_NT_TARGET_VERSION SET TO WS03

Compiling resources - busenum.rc

Compiling - busenum.c

Compiling - pnp.c

Compiling - power.c

Compiling - buspdo.c

Compiling - wmi.c

Linking Executable - objfre_wlh_amd64\amd64\busenum.sys

BUILD: Finish time: Thu Apr 02 22:31:14 2009

BUILD: Done

 

    8 files compiled - 4,432 LPS

    1 executable built

 

C:\WINDDK\6001.18002\src\general\toaster\bus>

 

上記のように BLD を実行すると、ビルドのログとして、buildfre_wlh_amd64.log が生成され、[objfre_wlh_amd64] というフォルダにビルドしたドライバなどが生成されます。

また、エラーやワーニングあった場合は、ログファイルから、エラーやワーニングを抽出した拡張子ERRや拡張子WRNというファイルが生成されるので、エラーだけを見る場合は、ERR ファイルを見るのがわかりやすいと思います。

 

ビルドの方法は、こんな感じとなりますが、サンプル コードは、色々なマクロを指定した sources があるので、関係ないと思うサンプル コードでも sources ファイルを見てみると参考になると思います。

 

なお、蛇足となりますが、ドライバの開発は、WDK だけでいいのか?Visual Studio や Windows SDK をインストールする必要はないのか?という質問をいただくことがあります。

Windows 2000 以前のDDK は、コンパイラなどが含まれていなかったので、Visual Studio や Windows SDK が必要でした。しかし、Windows XP 以降の DDK では、コンパイラなども DDK に含まれているため、DDK だけで開発できます。

Windows Vista から、DDK が、WDK に変わりましたが、WDK でも同じくコンパイラなどが含まれているため、WDK だけで開発できます。

むしろ、Visual Studio が入っていると、こんな感じで、パスが消されちゃいます。

path contains nonexistant c:\program files (x86)\microsoft visual studio 9.0\common7\tools\bin, removing

BUILD: Compile and Link for x86

BUILD: Loading c:\winddk\6001.18002\build.dat...

BUILD: Computing Include file dependencies:

 

それでは、また。