ドライバのビルド方法
なおきお~です。
昨日のお約束通り、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> |
古いオブジェクトを削除して、フルビルドする場合は、BLD か BCZ を使用して、差分ビルドする場合は、BZ か BZZ を使用するのがいいと思います。
私の場合は、ほとんど、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: |
それでは、また。