ドライバのビルド方法


なおきお~です。


 


昨日のお約束通り、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:


 


それでは、また。


Skip to main content