WDKドライバ開発 - Visual Studio の設定

おことわり

こういう自分用めもは非公開にすべきなのですが
はてな Blog では記事ごとの公開/非公開設定ができないみたいなので、
最初に言っておきます
VC++をドライバ開発環境にするの自分用めもです。
参照元のサイトのほうが画像つきで丁寧なので、そちらを参照してもらったほうがよいです。

環境

  • Visual Studio 2010 (高価な専門ツールです)
  • Windows Driver Kit Version 7.1.0
  • ddkbuild_cmd 2009-11-28@04-38-36

下準備

  • WDKは入っている前提
  • 適当な場所(UACでとめられない場所が望ましい)に作業用ディレクトリを作成しとく(スペースとか全角文字とかは含まれないようにしとく)
  • DLしたddkbuild.cmdをwdkディレクトリの下に置く(まぁどこでもよいのだが)
  • ddkbuild.cmd の @echo off の下にビルドする環境に合わせて、以下のような設定を書いておく
@set W7BASE=C:\WinDDK\7600.16385.1 

プロジェクトの作成

新しいプロジェクトを作成からメイクファイル プロジェクトを選択する

ウィザードで値を設定する

ddkbuild.cmdの絶対パスはダブルクォートで囲まないこと
UACが有効ならユーザー権限でアクセスできる場所にプロジェクトを作成すること

  • ビルドコマンドライン
(ddkbuild.cmdの絶対パス) -W7 checked $(ProjectDir)
  • リビルドコマンドライン

一時ファイルを削除するように-cZをつける

(ddkbuild.cmdの絶対パス) -W7 checked $(ProjectDir) -cZ

リリースビルドの場合は checked の代わりに free をつける

デバッグビルド/リリースビルド

_X86_;DBG

そのほかのファイル

ソースファイルを.cファイルとして作成

ビルドするためなら、DriverEntryだけ書いておけば、とりあえず通る

#include <ntddk.h>
#include <wdm.h>

NTSTATUS DriverEntry( PDRIVER_OBJECT pDriverObject,
                      PUNICODE_STRING RegistryPath )
{
    DbgPrint("Hello World\n");
    return STATUS_SUCCESS;
}

makefile

MINIMUM_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_VISTA)
!INCLUDE $(NTMAKEENV)\makefile.def

sources

TARGETNAME はプロジェクト名
TARGETTYPE はドライバ作成の場合はDRIVER
TARGETLIBS はドライバ作成で使うライブラリを書いておく
SOURCES はビルドするファイルを書いておく
USE_PDB はないと後(デバッグ時)から泣くことになるので入れておく

TARGETNAME=test
TARGETTYPE=DRIVER
TARGETLIBS=$(SDK_LIB_PATH)\advapi32.lib \
            $(SDK_LIB_PATH)\ntdll.lib \
            $(SDK_LIB_PATH)\kernel32.lib \
            $(DDK_LIB_PATH)\ntoskrnl.lib \
            $(DDK_LIB_PATH)\ndis.lib \

SOURCES=\
        driver.c       \

USE_PDB=1

makefileとsourcesファイルに.txt拡張子をつけないようにする

インテリセンスを有効にする

プロジェクトのプロパティを開き、NMAKE->インクルードの検索パスに(WDKのパス)\inc\ddkを追加する

ドライバのロード

わざわざローダを書くのが面倒な場合は
Driver Loader(OSR Online に登録が必要)を使いましょう
ただし Windows XP までしか対応していません

Windows XP 用にドライバを作成するには

  • ddkbuild.cmd の W7BASE を WXPBASE に変更する
  • ビルド/リビルドコマンドラインの -W7 を -WXP に変更する
  • makefile を MINIMUM_NT_TARGET_VERSION=$(_NT_TARGET_VERSION_WINXP) に変更する

ロードの確認

Sysinternals Suite の DbgView を使いましょう
メニューの Capture->Capture Kernel を有効にする