ClasFiltサンプルINFファイル

皆さん、こんにちは。A寿です。

 

突然ですが、皆さんは演出家からダメ出しを受けたことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。

 

さて、今回は、ClasFiltサンプルINFファイルをご紹介したいと思います。これはクラスドライバの上位または下位にフィルタドライバを挿入(インストール)するためのサンプルINFファイルです。

ClasFiltサンプルINFファイルは、

 

  \WinDDK\{バージョン番号}\src\setup\infs\clasfilt

 

のフォルダにあります。このフォルダには、以下のように、ClasFiltサンプルINFファイルであるClasFilt.infと、使い方などのヘルプが載っているClasFilt.htmの2つのファイルがあります。

 

C:\WinDDK\7600.16385.0\src\setup\infs\clasfilt>dir

 ドライブ C のボリューム ラベルがありません。

 ボリューム シリアル番号は 0836-2E4B です

 

 C:\WinDDK\7600.16385.0\src\setup\infs\clasfilt のディレクトリ

 

2009/08/07 11:07 <DIR> .

2009/08/07 11:07 <DIR> ..

2009/06/10 14:03 6,106 ClasFilt.htm

2009/06/10 14:03 2,481 ClasFilt.inf

               2 個のファイル               8,587 バイト

               2 個のディレクトリ  46,665,232,384 バイトの空き領域

 

使い方は、ClasFilt.htmや下記ドキュメントを見ていただければ、非常に簡単であることがわかっていただけると思います。

 

  ClasFilt Sample INF File

  https://msdn.microsoft.com/en-us/library/dd163208.aspx

 

今回はこのサンプルINFを使って、CDROMクラスの上位フィルタドライバをインストールする方法をご紹介します。このサンプルINFの使い方のイメージをつかんでいただければと思います。

手順の概要は以下の通りです。

  (0) インストールするフィルタドライバを用意

  (1) INFファイル名を、インストールするフィルタドライバ名と同じになるよう変更

  (2) INFファイル内のフィルタドライバ名を、インストールするフィルタドライバ名に変更

  (3) クラスGUIDを、フィルタリング対象のクラスドライバのGUIDに変更

  (4) その他の部分は、必要に応じて変更

  (5) インストール

それでは、それぞれの手順についてご説明します。

 

(0) インストールするフィルタドライバを用意

 

今回、CDROMクラスの上位(upper)フィルタドライバなので、例としてcdrupper.sysという名前のドライバを作ります。ClasFiltサンプルINFファイルは、汎用的なクラスフィルタドライバのINFなので、ドライバ自体はついていません。そこで、上位フィルタドライバとして、toasterのフィルタドライバを使ってみます。

toasterのフィルタドライバは

 

  C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter

 

のフォルダにあります。このフォルダには、以下のように、フィルタドライバのソース(filter.cやfiler.hなど)と一緒に、様々なサブフォルダがあります。

 

C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter>dir

 ドライブ C のボリューム ラベルがありません。

 ボリューム シリアル番号は 0836-2E4B です

 

 C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter のディレクトリ

 

2009/08/19 16:35 <DIR> .

2009/08/19 16:35 <DIR> ..

2009/08/07 11:14    <DIR> buslower // バス下位フィルタ

2009/08/07 11:14    <DIR> busupper // バス上位フィルタ

2009/08/07 11:14    <DIR> claslower // クラス下位フィルタ

2009/08/07 11:14    <DIR> clasupper // クラス上位フィルタ

2009/08/07 11:14    <DIR> devlower // デバイス下位フィルタ

2009/08/07 11:14    <DIR> devupper // デバイス上位フィルタ

2009/08/19 16:35 109 dirs

2009/07/13 15:16 31,123 filter.c

2009/07/13 15:16 5,723 filter.h

2009/07/13 15:16 365 filter.rc

2009/07/13 15:16 196 sources.inc

               5 個のファイル 37,516 バイト

               8 個のディレクトリ 46,662,000,640 バイトの空き領域

 

 

これらのサブフォルダ(上記黄色部分)は、バスの下位フィルタ(buslowerフォルダ)やクラスの上位フィルタ(clasupperフォルダ)などのカテゴリ別のフィルタドライバとして分かれています。それぞれのサブフォルダには、ソースをビルドするために必要なsourcesファイルとmakefileファイルが入っています。

 

このfilterフォルダでビルドすると、以下のように書かれたdirsファイルが読まれ、それぞれのサブフォルダのsourcesにしたがってビルドされます。

 

DIRS= \

     buslower \

     busupper \

     claslower \

     clasupper \

     devlower \

     devupper

 

今回は、clasupperだけでよいので、clasupperフォルダでビルドします。

ただ、ビルドする前に、clasupperフォルダの中のsourcesを見ますと、

 

!include ..\sources.inc

 

TARGETNAME=clsupper

 

C_DEFINES= $(C_DEFINES) -DCLASS_UPPER=1

 

となっています。このままビルドすると、「TARGETNAME=clsupper」という記述にしたがって、clsupper.sysというドライバ名になってしまいます。ですので、clsupperをcdrupperに変更します。

その後、このclasupperフォルダでビルドします。今回はWindows 7 x86のテストPCにインストールすることにしますので、Windows 7のx86 Checked Build Environmentを使います。これを起動したら、

 

> cd C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter\clasupper

> build

 

と実行します。すると、clasupperフォルダの下に、objchk_win7_x86フォルダができ、その下にi386フォルダができ、その下にcdrupper.sysができていることを確認できます。

 

これで、今回使う、クラス上位フィルタドライバを作成することができました。

 

 

(1) INFファイル名を、インストールするフィルタドライバ名と同じになるよう変更

 

ClasFilt.infをcdrupper.infにファイル名を変更します。

 

 

(2) INFファイル内のフィルタドライバ名を、インストールするフィルタドライバ名に変更

 

ClasFilt.infの中でフィルタドライバ名(clasfilt.sys)があるのは、以下の4箇所です。

 

(2-a) SourceDisksFilesセクション(19行目~20行目)

 

19 [SourceDisksFiles]

20 clasfilt.sys = 1

 

(2-b) DefaultInstallセクション(31行目~39行目)

 

31 [DefaultInstall.NT]

32 ;

33 ; DefaultInstall section is used to install the class filter driver. Use .NT platform extension so this

34 ; section won't be executed on Windows 9x/ME.

35 ;

36 ; Change clasfilt.sys to the name of the class filter driver you need to copy.

37 ;

38 CopyFiles = @clasfilt.sys

39 AddReg = ClassFilter_AddReg

 

 (2-c) clasfilt_Service_Inst(サービスインストール)セクション(57行目~62行目)

 

57 [clasfilt_Service_Inst]

58 DisplayName = %ClasFilt.SvcDesc%

59 ServiceType = %SERVICE_KERNEL_DRIVER%

60 StartType = %SERVICE_DEMAND_START%

61 ErrorControl = %SERVICE_ERROR_IGNORE%

62 ServiceBinary = %12%\clasfilt.sys ;change clasfilt.sys to the name of your driver binary.

 

(2-d) clasfilt_EventLog_AddRegセクションのイベントログAddRegディレクティブ(69行目~72行目)

 

69 [clasfilt_EventLog_AddReg]

70 ;Change clasfilt.sys to the name of your driver file.

71 HKR,,EventMessageFile, %REG_EXPAND_SZ%,"%%SystemRoot%%\System32\IoLogMsg.dll;%%SystemRoot%%\System32\drivers\clasfilt.sys"

72 HKR,,TypesSupported, %REG_DWORD%, 7

 

 

上記の抜粋の赤字部分として示した、これら4つのclasfilt.sysをすべて、今回インストールするフィルタドライバ名cdrupper.sysに変更します。

 

なお、上記の抜粋のコメント行(「;」から始まる行)を見てもお分かりいただけるように、ClasFilt.infの中にも、かなり親切にどこを修正するかを書いてくれています。

 

 

(3) クラスGUIDを、フィルタリング対象のクラスドライバのGUIDに変更

 

以下のClassFilter_AddRegセクション(41行目~47行目)の、{setup-ClassGUID}の部分を、適切なクラスドライバのGUIDに変更します。

今回は、CDROMクラスの上位フィルタドライバですので、クラスGUIDをCDROMクラスのGUIDにします。

CDROMクラスのGUIDは、

 

  System-Supplied Device Setup Classes

  https://msdn.microsoft.com/en-us/library/ms791134.aspx

 

のドキュメントの

 

  CD-ROM Drives

    Class = CDROM

    ClassGuid = {4d36e965-e325-11ce-bfc1-08002be10318}

    This class includes CD-ROM drives, including SCSI CD-ROM drives. By default, the system's CD-ROM class installer

    also installs a system-supplied CD audio driver and CD-ROM changer driver as Plug and Play filters.

 

という記述から、{4d36e965-e325-11ce-bfc1-08002be10318}であることがわかります。これに置き換えます。

 

 

(4) その他の部分は、必要に応じて変更

 

必要最低限の準備は(3)までで十分です。オプションとして、以下のような変更ができます。

・上位フィルタではなく、下位(lower)フィルタドライバとしてインストールしたい場合は、[ClassFilter_AddReg]セクションのUpperFiltersの部分をLowerFiltersに変更する。

・[Strings]セクションのClasFilt.SvcDescやClasFilt.MediaDescの文字列を変更する。

・5行目の「Microsoft Corporation」を自社の社名に変更する。

 

(なお、好みの問題になるかと思いますが、ドライバ名がcdrupper.sysなのに、サービス名がclasfiltというのが気になるのであれば、clasfiltを全てcdrupperに置き換えてしまってOKです。今回は説明のためにあくまでも必要最低限の変更とさせていただきますので、サービス名は変更しません。)

 

(5) インストール

 

それでは、実際にインストールしてみます。

テストPCの、C:\testというフォルダに、cdrupper.sysとcdrupper.infをコピーします。

そして、cdrupper.infを右クリックして[インストール]を選び、インストールします。

OSを再起動します。

 

まずはデバッガを接続しない状態で以下を確認してみましょう。

・デバイスマネージャの[DVD/CD-ROMドライブ]の下にあるドライブを右クリックしてプロパティを表示。

  プロパティの[ドライバー]タブの[ドライバーの詳細]ボタンをクリック。

  cdrupper.sysがあることを確認。(下図参照)

 

 

・C:\Windows\system32\driversフォルダの下にcdrupper.sysがコピーされている。

 

・レジストリエディタのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}に、UpperFiltersのエントリが追加され、データとして「clasfilt」がある。(下図参照)

 

 

 

・レジストリエディタのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\servicesの下に「clusfilt」のキーが作成されている。(下図参照)

 

 

 

 

続いて、カーネルデバッガでドライバスタックを確認してみましょう。

デバッガを接続したら、WinDbgの[File]の[Symbol File Path...]にcdrupper.pdbのあるフォルダへのフルパス、[Source File Path...]にfilter.cのあるフォルダへのフルパスを指定してください。例えば、C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter\clasupper\objchk_win7_x86\i386のフォルダにcdrupper.pdbがあるなら、[Symbol File Path...]には「C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter\clasupper\objchk_win7_x86\i386」を指定します。C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter\のフォルダにfilter.cがあるなら、[Source File Path...]に「C:\WinDDK\7600.16385.0\src\general\toaster\wdm\filter\」を指定します。

WinDbgのBreakボタンをクリックし、ターゲットPCであるWindows 7の動きを止めます。

!drvobjをcdrupper.sysに対して実行してみます。すると、以下のようにドライバオブジェクトではない、という表示になりました。

 

1: kd> !drvobj cdrupper

Driver object (90bdf000) is for:

90bdf000: is not a driver object

 

これは、!drvobjの後に、ドライバのバイナリ名を指定したからです。サービス名であるclusfiltを指定しなければなりません。

 

1: kd> !drvobj clasfilt

Driver object (86af9030) is for:

 \Driver\clasfilt

Driver Extension List: (id , addr)

 

Device Object list:

86b62700 

 

この一番最後の8桁の数字がclasfilt(cdrupper.sys)が持つデバイスオブジェクトのアドレスです。

このデバイススタックを!devstackで見てみましょう。

 

1: kd> !devstack 86b62700 

  !DevObj !DrvObj !DevExt ObjectName

> 86b62700 \Driver\clasfilt 86b627b8 

  8646f860 \Driver\cdrom 86b5eab8 CdRom0

  86495030 \Driver\atapi 864950e8 IdeDeviceP1T0L0-1

!DevNode 85b71888 :

  DeviceInst is "IDE\CdRomTSSTcorp_DVD-ROM_TS-H353B_______________D200____\5&1a4d1015&0&1.0.0"

  ServiceName is "cdrom"

 

上記のように、CDROMクラスドライバの上位フィルタとして、clasfilt(cdrupper.sys)がインストールできたことがわかります。

 

――――――――――――――――

 

【閑話休題】皆さんは演出家からダメ出しを受けたことはありますか?

 

数年前の話ですが、ある朗読劇の体験講座に参加しました。この講座は、全三回で、第一回にプロの俳優(芸能人など)の方々の実際のステージを見て、第二回に講師の演出家の解説を聞き、第三回に自分で実際に演技してみて演出家の方に批評していただく、というものでした。朗読劇の内容そのものは、ある1組の男女が幼少から死に別れるまでの紆余曲折を互いに手紙でやりとりしあうというもので、とても感動しました。実際、私が全三回の体験講座の第一回で、俳優の方々の演技を見た時は、すばらしかったですし、第三回の実演でも、感極まって泣いている参加者の方がいたくらいです。その第三回で、私は男性役の青年期を担当しました。その中で、その男性役がいかにボート部で活躍したかを一生懸命心をこめて・・・というよりは、緊張のあまり、間違えないように必死で読みました。その結果、講師の演出家の評価は・・・「とてもスポーツをしている男性の話し方とは思えない」でした。。。「スポーツをしている男性の話し方」!?どなたか「スポーツをしている男性の話し方」をご存じの方はお教えいただければ幸いです。皆様、ドライバ開発関連のお問い合わせをしていただいた際に、お電話にて「こいつは、スポーツをしている男性の話し方ではないな」と感じたら、それはA寿です。どうぞ、よろしくお願いいたします。