ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

UMDF開発のすゝめ - 3

少しずつ書き進めてます。
チュートリアルドキュメント。

HelloWorld のソースコードまでできたので、
次はビルド方法です。

その他雑多なファイルを用意する

デバイスドライバの本体となるコードは実装し終わりましたが、ビルドするためにはいくつか細かいファイルを用意する必要があります。
簡単な説明とともに例を挙げていきます。

リソーススクリプト(.rcファイル)

DLLの説明やファイル名などを#defineしてからcommon.verをインクルードすると、その中で適宜設定してくれます。

#include <windows.h>
#include <ntverp.h>

#define VER_FILETYPE                VFT_DLL
#define VER_FILESUBTYPE             VFT_UNKNOWN
#define VER_FILEDESCRIPTION_STR     "UMDF Sample DeviceDriver"
#define VER_INTERNALNAME_STR        "UmdfHello"
#define VER_ORIGINALFILENAME_STR    "UmdfHello.dll"

#include "common.ver"
Exports.def ファイル

DLLファイルとして外部に公開しなければならない関数はDllGetClassObjectだけですのでEXPORTSしておきます。
ライブラリ名は先ほどリソーススクリプトで書いたものと統一します。

LIBRARY UmdfHello.dll
EXPORTS
	DllGetClassObject	PRIVATE
Makefile

これはDDK標準にMakefileに流します。下の一行を書いておくだけです。

!INCLUDE $(NTMAKEENV)\makefile.def
Sources

このファイルは先ほど!INCLUDEしたmakefile.defからさらに!INCLUDEされるファイルです。
標準で設定されない変数やリンクファイルなどの設定を行います。
ファイル名などは適宜設定します。

UMDF_VERSION=1
UMDF_MINOR_VERSION=5
TARGETTYPE=DYNLINK
USE_MSVCRT=1
C_DEFINES=$(C_DEFINES) /D_UNICODE /DUNICODE
TARGETLIBS=\
        $(SDK_LIB_PATH)\strsafe.lib     \
        $(SDK_LIB_PATH)\kernel32.lib    \
        $(SDK_LIB_PATH)\advapi32.lib

TARGETNAME=UmdfHello
DLLDEF=Exports.def
SOURCES=Hello.cpp Hello.rc

ビルドする

細かいファイルも全部揃ったらビルドします。

まずは

[Windows Driver Kits] -> [Build Environments] -> [Windows XP] -> [Windows XP x86 Checked Build Environment]

ここから環境設定済みのプロンプトを起動します。
Checked Buildはいわゆるデバッグバージョン、Free Buildはいわゆるリリースバージョンです。

次に、cdコマンドで先ほどのファイル一式がそろったフォルダへ移動し、buildと叩きます。
しばらくして

3 files compiled -   104 LPS
1 library built
1 executable built

このように完了メッセージがでてプロンプトに戻ってこればビルド完了です。objchk_wxp_x86\i386\UmdfHello.dllが生成されていれば成功です。