SlideShare uma empresa Scribd logo
1 de 127
フィルタドライバ入門 
firewood@hatena 
hotpepsi@twitter
自己紹介 
 生息地 
 組込日記 http://d.hatena.ne.jp/firewood/ 
 よく使う環境 
 Windows、Linux、Flash、C/C+ 
+、x86、ARM 
 趣味 
 エンバグ、デバッグ 
 キーボード蒐集
はじめに 
 書籍、 WDK、webの情報を元に記述 
していますが、間違いがあれば教えて 
ください
目的 
 ユーザー空間からカーネル空間まで全 
体的にざっと理解する 
 「WDMドライバ開発完全ガイド」を 
何となく読めるようになる 
 自分の理解を深める
概要 
 Windowsのデバイスドライバについて 
 フィルタドライバの概要、種類、機能 
、実装 
 インストール方法
 デバイスドライバの概要 ←★ 
 フィルタドライバの概要 
 ドライバとインスタンス 
 IRP 
 フィルタドライバの実装 
 フィルタドライバの登録 
 INFファイル
デバイスドライバとは 
 デバイスドライバの定義 
 あるハードウェアをOSから利用可能にす 
るためのソフトウェア(狭義の定義) 
 デバイスドライバの目的 
 ハードウェアを抽象化すること 
基本的には、それぞれのハードウェアに応じ 
たデバイスドライバが必要となる
ユーザーランドとカーネル 
ユーザー 
ユーザーランド 
カーネル 
デバイス 
ユーザー空間 カーネル空間 
操作 
CUIやGUI、 
ライブラリ、 
アプリケーション 
ハードウェア抽象化 
ハードウェア毎の 
違いを吸収
デバイスドライバの位置 
ユーザー 
ユーザーランドAPI kernel32.dll など 
カーネルランド本体 ntoskrnl.exe など 
デバイス 
ユーザー空間 カーネル空間 
操作 
アプリケーション 
デバイスドライバ
実行形式の種類 
 NTドライバ 
 Windows NT 3.1~4.0用 
 Windows Driver Model (WDM) 
 Windows 98および2000以降のドライバ 
 Windows用のドライバの多くがこの形式 
 WDF Driver Model 
 ユーザーモードのドライバも書ける新形式
WDMの特長 
 階層化 
 雛形を定義することによりデバイスド 
ライバ開発を定型化 
 必要最小限の部分だけ実装することが 
できる(ミニポートドライバ、フィル 
タドライバ)
WDMの階層例 
他にも 
 クラスドライバ 
 ミニクラスドライ 
バ 
 ポートドライバ 
 ミニポートドライ 
バ 
など色々ある 
uppe r フィルタドライバ 
ファンクションドライバ 
Lowe r フィルタドライバ 
バスドライバ 
Ha rdwa re Abs t ra c t ion La ye r(HAL)
 デバイスドライバの概要 
 フィルタドライバの概要 ←★ 
 ドライバとインスタンス 
 IRP 
 フィルタドライバの実装 
 フィルタドライバの登録 
 INFファイル
フィルタドライバの概要 
 機能追加のためのデバイスドライバ 
 フル実装ではなく、部分実装 
 ほとんどの処理を既存のデバイスドライバ 
に任せ、必要な処理だけ行う 
 デバイスドライバとデバイスドライバ 
の間にはさまる、いわゆる「フック」 
を行う 
 加工したり横取りしたりできる
フックとは 
デバイスドライバA 
デバイスドライバB 
デバイスドライバA 
フィルタドライバ 
デバイスドライバB 
間にはさむ 
 デバイスドライバAからは、フィルタドライ 
バがデバイスドライバBに見える 
 デバイスドライバBからは、フィルタドライ 
バがデバイスドライバAに見える
フィルタドライバの例 
 アンチウィルスソフト 
 リアルタイムファイルシステム監視 
 VMware 
 ホストOSのキーボード、マウス、ネット 
ワークなど入出力を横取りし、ゲストOS 
に流す 
 葉隠れの術 
 「SONYがrootkit」とネットで話題に
フィルタドライバの特長 
 階層化 
 雛形を定義することによりデバイスド 
ライバ開発を定型化 
 必要最小限の部分だけ実装することが 
できる 
WDMの特長 ≒ フィルタドライバの特 
長
フィルタドライバの配置の種 
類 
 UpperとLowerの二種類ある 
 Upperフィルタ 
 あるデバイスドライバの上位側を乗っ取る 
 Lowerフィルタ 
 あるデバイスドライバの下位側を乗っ取る
Upperフィルタ 
 あるデバイスドライ 
バの上位側に追加す 
る 
 ユーザーランド側の 
入出力を乗っ取るこ 
とができる 
 手軽だが、低レベル 
の操作はできない 
Uppe r フィルタドライバ 
ファンクションドライバ 
バスドライバ
Lowerフィルタ 
 あるデバイスドライ 
バの下位側に追加す 
る 
 低レベル入出力を 
乗っ取ることができ 
る 
 細かい操作が可能だ 
が煩雑 
ファンクションドライバ 
Lowe r フィルタドライバ 
バスドライバ
フィルタドライバの範囲の種 
類 
 デバイスに対するフィルタドライバ 
 例:PS/2キーボードに対するドライバ 
 同種のデバイスのみに適用される 
 例:USBキーボードには適用されない 
 デバイスクラスに対するフィルタドラ 
イバ 
 例:キーボードに対するドライバ 
 そのクラスに属する全デバイスに適用され 
る 
 例:PS/2・USB両方に適用される
 デバイスドライバの概要 
 フィルタドライバの概要 
 ドライバとインスタンス ←★ 
 IRP 
 フィルタドライバの実装 
 フィルタドライバの登録 
 INFファイル
ドライバとインスタンス 
 デバイスドライバ 
 実行ファイル 
 ドライバオブジェクト 
 デバイスドライバのインスタンス(通常一 
つ) 
 デバイスオブジェクト 
 個別のデバイスのインスタンス
ドライバオブジェクト 
 デバイスドライバのインスタンス 
 デバイスドライバが必要になると、 
カーネルがロード&実行 
 システム起動時やデバイスを挿したとき 
 デバイスドライバのロード 
 =ドライバオブジェクトの生成 
 DriverEntry関数が呼び出される 
 引数はドライバオブジェクト
デバイスオブジェクト 
 システム起動時やデバイスを挿したとき、デ 
バイス毎に(バスドライバ等が)生成する 
 登録されているデバイスドライバそれぞれが 
デバイスオブジェクトを生成する 
 総数=デバイス数×デバイスドライバ数 
 それぞれのデバイスドライバのAddDevice関 
数が呼び出される 
 引数はドライバオブジェクトと、下位のデバイス 
オブジェクト
デバイスマネージャで見てみ 
る 
 あるデバイスには複数のデバイスドラ 
イバ(フィルタドライバ含む)が登録 
されている
レジストリで見てみる(1) 
 PS/2キーボード
レジストリで見てみる(2) 
 キーボードクラス
ドライバ階層例 
 ドライバがディ 
ジーチェーン接 
続されている 
vmkbd(フィルタドライバ) 
kbdc la s s(クラスドライバ) 
i8042prt(ポートドライバ) 
Ha rdwa re Abs t ra c t ion La ye r(HAL)
インスタンスの生成順序 
vmkbd の 
ドライバオブジェクト 
kbdc la s s の 
ドライバオブジェクト 
i8042prt の 
ドライバオブジェクト 
デバイス 
オブジェクト 
デバイス 
オブジェクト 
②通知 
デバイス 
オブジェクト 
③生成 
④連結 
①生成 
⑤通知 
⑥生成 
⑦連結
フィルタドライバの優先順位 
 Lower DO→FDO→Upper DOの順に生成 
 (対クラスよりも)デバイスに対する 
フィルタドライバが先にインスタンス 
化される 
 同種では記述順にインスタンス化され 
る
フィルタドライバのリンク 
 次のようなリンクを形成する(はず) 
 上位(ユーザー空間) → クラスのUpper B 
→ クラスのUpper A → デバイスのUpper 
B → デバイスのUpper A → FDO → クラス 
のLower B → クラスのLower A → デバイ 
スのLower B → デバイスのLower A → 
PDO → 下位(HAL) 
 生成は上記の逆順(デバイスのLowerか 
ら)
 デバイスドライバの概要 
 フィルタドライバの概要 
 ドライバとインスタンス 
 IRP ←★ 
 フィルタドライバの実装 
 フィルタドライバの登録 
 INFファイル
IRPの概要 
 IRP 
 I/O Request Packet 
 何らかのイベントが発生することによ 
り生成され、デバイスオブジェクトに 
伝達される指示パケット 
 Read、Write、Plug&Playなど、様々 
な内容のメッセージが定義されている
IRPの処理イメージ 
 上位のデバイス 
オブジェクトが 
、下位のデバイ 
スオブジェクト 
へIRPを伝播さ 
せていく 
IRP 
イベント 
発生 生成 
デバイスオブジェクトA 
IRP 
デバイスオブジェクトB
IRPのスタック領域 
IRP 
デバイスオブジェクトX 
デバイスオブジェクトY 
デバイスオブジェクトZ 
A用のスタック領域 
B用のスタック領域 
C 用のスタック領域 
IRP内の自分用の領域に 
アクセスし、次の階層へ 
伝播させていく 
ドライバオブジェクトA 
ドライバオブジェクトB 
ドライバオブジェクトC
概要編終了 
 すいませんがあと90枚あります
 デバイスドライバの概要 
 フィルタドライバの概要 
 ドライバとインスタンス 
 IRP 
 フィルタドライバの実装 ←★ 
 フィルタドライバの登録 
 INFファイル
開発に必要な環境(1) 
 DDK 
 Windows 2000で開発できる 
 Vista用のドライバが書けない 
 WDK 
 Windows XP以降で開発できる 
 2000/XP/Vistaのドライバ開発が可能 
 WinDbg 
 なくても開発は可能、あると便利
開発に必要な環境(2) 
 VMwareホスト+VMwareゲスト 
 1台のPCで開発とテスト実行が可能 
 named pipe経由でWinDbg接続 
 デバイスドライバの種類によっては開発不 
能 
 二台のPC(開発機と実験機) 
 シリアルクロスケーブル経由でWinDbg接 
続 
 最終的には実機での検証が必要
最小限の実装 
 単純なフィルタドライバは以下の処理 
だけでOK 
 初期化(DriverEntry/DriverUnload ) 
 デバイスの追加(AddDevice) 
 IRPハンドラ 
 ファイルシステム等はもっと複雑
DriverEntryの概要 
 ドライバのロード完了時に呼び出され 
る 
 WinMain()やDllMain()に相当 
 この関数だけあればビルドはできる 
 引数はドライバオブジェクトとレジス 
トリのパス 
 主な責務は、AddDeviceやIRPハンド 
ラ等関数ポインタをドライバオブジェ 
クトに設定すること
余談1:エントリポイント 
 PEヘッダにアドレスが記録されている 
 手動リンクするならシンボルは何でもよい
余談2:GsDriverEntry 
 /GSオプションありでビルドした場合 
(WDK以降のデフォルト)のエントリ 
ポイント 
 /GSつきだとスタックチェックのコードが 
生成 
 ドライバファイルのエントリポイントに 
GsDriverEntryのアドレスが入る 
 GsDriverEntry内でDriverEntryへジャンプ 
 sourcesでの設定で無効化できる 
 BUFFER_OVERFLOW_CHECKS=0 
 詳しくはwebで
DriverEntryの例 
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, 
IN PUNICODE_STRING RegistryPath) 
{ 
int i; 
for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; ++i) { 
DriverObject->MajorFunction[i] = OtherDispatch; 
} 
DriverObject->MajorFunction[IRP_MJ_POWER] = PowerDispatch; 
DriverObject->MajorFunction[IRP_MJ_PNP] = PnPDispatch; 
DriverObject->DriverStartIo = NULL; 
DriverObject->DriverUnload = DriverUnload; 
DriverObject->DriverExtension->AddDevice = AddDevice; 
return STATUS_SUCCESS; 
}
DriverUnload 
 静的に確保しているものがなければ空 
でOK 
 管理しているデバイスオブジェクトが 
ゼロになると呼び出される 
 デバイスオブジェクトを静的に確保してい 
ると自動的にはアンロードされない 
static void DriverUnload(IN PDRIVER_OBJECT DriverObject) 
{ 
}
AddDeviceの概要 
 デバイスが接続された時に呼び出され 
る 
 接続=デバイスオブジェクトの生成 
 引数はドライバオブジェクトと、自分 
の下位となるデバイスオブジェクト 
 下位のデバイスオブジェクト 
 通常はバスドライバ(のドライバオブジェ 
クト)が生成したもの 
 通称PDO(Physical Device Object)
典型的なAddDeviceの処理 
 新しいデバイスオブジェクトobjを生成 
する 
 objのメンバーを初期化する 
 RemoveLockの初期化など 
 objをPDOにアタッチする 
 アタッチすると、下位のデバイスオブジェ 
クト(ポインタ)が得られる
アタッチ 
 IoAttachDeviceToDeviceStack ()に 
よってデバイスオブジェクトのチェー 
ンに追加する 
 IRPを受け取れるようになる 
PDO 
生成したデバイス 
オブジェクト 
PDO 
アタッチ
IRPハンドラの概要 
 特定の種類のIRPを処理する関数 
 いずれかのパターン 
 IRP毎に関数を用意する 
 一つの関数で共通処理を行い、関数内で 
IRPの種類で分岐する 
 電源管理とPnP(Plug&Play)は他の 
IRPと処理が異なるので、別の関数に 
することが多い
上位と下位 
 自分の上位と下位がある 
 上位=I/Oマネージャや、自分へアタッ 
チしたデバイスオブジェクト 
 上位からIRPが送られてくる 
 下位=自分がアタッチしたデバイスオ 
ブジェクト 
 IRPを送信することができる
IRPハンドラの責務 
 自分の上位(IRPの送信元)に対して 
、処理結果をステータスとして返す 
 自前でIRPを処理するか、下位で処理 
してもらうかを決める 
 自分で処理しない場合は、下位にIRP 
を渡し、その処理結果を上位に返す
フィルタドライバのIRP処理 
 基本は「何もしないフィルタドライ 
バ」 
 ここでいう「何もしない」とは、上位 
から受け取ったIRPを、加工せずに下 
位に渡すこと 
 いわゆるスルー出力 
 下位に対して、特定のIRPを渡さない 
ことにより、機能を無効化できる 
(例:書込禁止)
IRPハンドラの定石 
 いくつかの処理パターンがある 
 自分で処理する・しない 
 下位に渡す・渡さない 
 下位の処理が終わるのを待つ・待たない 
 Microsoft KB「IRPのさまざまな処理 
方法」 
 http://support.microsoft.com/kb/320275/ja
シナリオ1:スルー出力 
 上位から受け取ったIRPを下位に渡し 
、下位の処理結果を上位に返す(丸投 
げ) 
static NTSTATUS OtherDispatch(IN PDEVICE_OBJECT DeviceObject, 
IN PIRP Irp) 
{ 
DEVICE_EXTENSION *Extension = 
(DEVICE_EXTENSION *)DeviceObject->DeviceExtension; 
IoSkipCurrentIrpStackLocation(Irp); 
return IoCallDriver(Extension->NextLowerDriver, Irp); 
}
シナリオ1の用途 
 「何もしない」=もらったものを中継 
する 
 「何も足さない、何も引かない」 
 「どのIRPが」「いつ」あったかを監 
視できる 
 デバッグ出力、ロギング 
 そのIRPの処理結果(いつ完了し、ど 
ういう結果が得られたか)は、シナリ 
オ1ではわからない
シナリオ2:同期して待つ 
 IRPを下位に渡し、処理が終わるまで 
待ち、結果を上位に返す(※ 下記は抜 
粋) 
static NTSTATUS CompletionRoutine(DeviceObject, Irp, Event) 
{ 
KeSetEvent(Event, IO_NO_INCREMENT, FALSE); 
} 
NTSTATUS OtherDispatch(DeviceObject, Irp) 
{ 
KeInitializeEvent(&Event, NotificationEvent, FALSE); 
IoCopyCurrentIrpStackLocationToNext(Irp); 
IoSetCompletionRoutine(Irp, CompletionRoutine, &Event, …); 
status = IoCallDriver(Extension->NextLowerDriver, Irp); 
KeWaitForSingleObject(&Event, Executive, KernelMode); 
IoCompleteRequest (Irp, IO_NO_INCREMENT); 
return status; 
}
シナリオ2の用途 
 処理の完了を待つものに使用する 
 典型的な使用例は、デバイスの使用開始待 
ち(IRP_MN_START_DEVICE) 
 完了するまで上位に制御を返さない 
 KeWaitForSingleObject()で待つと、 
他のIRPディスパッチ処理も停止する 
(かも) 
 そのため、下位の処理が短時間に終わらな 
いIRPには適用すべきでない
シナリオ3:処理完了時に通 
知 
 IRPを下位に渡し、完了時に通知して 
もらう 
 (通常、下位が非同期処理をするため)同 
期的に待たない 
static NTSTATUS CompletionRoutine(DeviceObject, Irp, Event) 
{ 
if (Irp->PendingReturned) IoMarkIrpPending(Irp); 
return STATUS_CONTINUE_COMPLETION; 
} 
NTSTATUS OtherDispatch(DeviceObject, Irp) 
{ 
IoCopyCurrentIrpStackLocationToNext(Irp); 
IoSetCompletionRoutine(Irp, CompletionRoutine, NULL, …); 
return IoCallDriver(Extension->NextLowerDriver, Irp); 
}
シナリオ3の用途 
 下位の処理結果(I/O読み込みの結果 
等)を加工したい場合に使える 
 シナリオ2は処理完了まで上位をブ 
ロックするが、シナリオ3だと下位が 
非同期処理をしていれば上位に制御が 
戻る 
 明示的に非同期処理をしたい場合はシ 
ナリオ4にする
シナリオ4:IRPをキューに 
入れる 
 上位にpendingを通知し、後で処理す 
る 
NTSTATUS CompletionRoutine(DeviceObject, Irp, Event) 
{ 
return STATUS_CONTINUE_COMPLETION; 
} 
NTSTATUS OtherDispatch(DeviceObject, Irp) 
{ 
NTSTATUS status; 
IoMarkIrpPending(Irp); 
IoCopyCurrentIrpStackLocationToNext(Irp); 
IoSetCompletionRoutine(Irp, CompletionRoutine, NULL, …); 
IoCallDriver(Extension->NextLowerDriver, Irp); 
return STATUS_PENDING; 
}
シナリオ4の用途 
 そのIRPを別のスレッドで処理したい 
場合に使用する 
 非同期処理を行う場合、他のスレッド 
との競合を考慮したコードを書く必要 
がある 
 スピンロックによる排他制御や、他のス 
レッドによってIRPがキャンセルされたか 
どうかのチェック等
シナリオ5:下位に渡さない 
 IRPを処理完了に設定する 
static NTSTATUS OtherDispatch(IN PDEVICE_OBJECT DeviceObject, 
IN PIRP Irp) 
{ 
// なにがしかの処理 
NTSTATUS status = …; 
ULONG_PTR info = …; 
Irp->IoStatus.Status = status; 
Irp->IoStatus.Information = info; 
IoCompleteRequest(Irp, IO_NO_INCREMENT); 
return status; 
}
シナリオ5の用途 
 フィルタドライバで追加実装した機能 
など、自分で処理する必要があるIRP 
の場合 
 独自のDeviceIoControlなど 
 特定の機能を上書きしたり禁止できる 
 例:ある条件下では書き込みを禁止する
BSoD 
 BlueScreen of Death (死の青画面) 
 デバイスドライバのバグやメモリエ 
ラー等で発生 
 デバッガ接続している場合はBSoDは 
表示されず、デバッガプロンプトにな 
る 
 BSoD発生時、クラッシュダンプに追 
加情報を格納することも可能
余談:色を変える 
 BSOD Properties NT
実行レベル 
 カーネル空間では、スレッドの実行レ 
ベルが状況に応じて動的に変化する 
 割り込み処理などで一時的に高くなる 
 ユーザープロセスの優先度とはまた別 
 全ユーザープロセスよりもカーネルが優先 
 フィルタドライバで使う実行レベルは 
主に以下の2レベル 
 高=DISPATCH_LEVEL 
 低=PASSIVE_LEVEL
ページング 
 ページング=ページを1単位としたメ 
モリブロックを外部記憶装置(HDD) 
へ追い出す 
 スワップ=プロセス単位(IT用語辞典) 
 デバイスドライバのソースコードにお 
いて、ある関数または変数がページン 
グ可能かどうかを指定できる 
 指定方法はコードとデータで異なる 
 確保時に固定(動的に変化しない)
DISPATCH_LEVEL 
 実行優先度が高く、処理の自由度が低 
い 
 応答性が必要な処理などで使用する 
 DPC(Deferred Procedure Call )など 
 ページングしない(できない) 
 ページアウトされた領域にアクセスすると 
BSoD 
 ページアウトを伴う可能性のある関数は呼 
び出せない
PASSIVE_LEVEL 
 実行優先度が低く、処理の自由度が高 
い 
 応答性が不要の処理を記述する 
 IRPのディスパッチなど 
 ページングする(できる) 
 ページアウトされた領域にアクセスすると 
ページインする(BSoDにならない) 
 DISPATCH_LEVELでないと呼び出せない 
関数は、一時的に実行レベルを上げて呼び 
出す
non-paged 
 ページング不可、通称「非ページ」 
 メモリが不足してもページアウトされ 
ない 
 ページング指定がないものはページン 
グ不可になる 
 システム全体のパフォーマンスに影響 
するので、必要最小限に抑える 
 PASSIVE_LEVELでも使える
paged 
 ページング可、通称「ページ」 
 ページアウトされる可能性がある 
 ユーザー空間のプログラムと同じレベ 
ルのリソース 
 DISPATCH_LEVEL では使えない
コードのページング指定 
 関数宣言のあとにpragmaで指定 
 #pragma alloc_text(INIT, DriverEntry) 
 #pragma alloc_text(PAGE, DriverUnload) 
 ページング可である関数に「PAGE」 
を指定する 
 初期化時しか使わないコード 
(DriverEntry )にはINITを指定する 
 初期化処理の完了後、解放される
PAGED_CODE() 
 ページング可能な領域に配置された 
コードであることを示すマクロ 
 PASSIVE_LEVELで実行されるべきという 
印 
 実行時のチェック 
 PASSIVE_LEVELよりも高い優先度で実行 
されると警告をデバッグ出力
データのページ指定 
 ページ可能ヒープから確保 
 ExAllocatePoolWithTag(PagedPool) 
 非ページヒープから確保 
 ExAllocatePoolWithTag(NonPagedPool 
) 
 #pragma data_seg ()でデータをペー 
ジング可能領域(PAGEセクション) 
に置けるが、データだけ別ファイルに 
する必要がある
ページング指定とセクション 
 ページング不可のコードは.textセク 
ションに入る 
 ページング不可のデータは.data 
や.rodataセクションに入る 
 ページング可のデータはPAGEセク 
ションに入る 
 リスティングファイルやIDA Proでわ 
かる
豆知識:pageable 
 ページ可能は「pageable」 
 でもなぜかDO_POWER_PAGABLEと 
いう定義が…
 デバイスドライバの概要 
 フィルタドライバの概要 
 ドライバとインスタンス 
 IRP 
 フィルタドライバの実装 
 フィルタドライバの登録 ←★ 
 INFファイル
フィルタドライバの登録 
(1) 
 デバイスドライバとしてインストール 
しておく 
 Win32APIのCreateService() 
 レジストリエントリに追加する 
 Upperフィルタの場合:値 UpperFilters 
 Lowerフィルタの場合:値 LowerFilters 
 値はMULTI_SZ型 
 複数登録できる
フィルタドライバの登録 
(2) 
 デバイスに対するフィルタドライバの 
追加 
 Win32APIの 
SetupDiSetDeviceRegistryProperty() を使 
用して登録する 
 レジストリエントリ 
HKEY_LOCAL_MACHINESYSTEMCurre 
ntControlSetEnum以下に登録される(レ 
ジストリエディタでは読み取りのみ可能)
フィルタドライバの登録 
(3) 
 デバイスクラスに対するフィルタドラ 
イバの追加 
 HKEY_LOCAL_MACHINESYSTEMCurre 
ntControlSetControlClass 
{CLASS_GUID}以下を、レジストリ操作 
関数で設定する 
 RegOpenKeyEx()、RegSetValueEx()
フィルタドライバの削除 
 SetupDiGetDeviceRegistryProperty() または 
RegQueryValueEx() により既存の値を読み取 
る 
 MULTI_SZ型の値から、対象文字列を削除す 
る 
 SetupDiSetDeviceRegistryProperty() または 
RegSetValueEx()により値を設定する 
 DeleteService() によりデバイスドライバの登 
録を削除する
GUIで設定 
 DevFilterEditor
 デバイスドライバの概要 
 フィルタドライバの概要 
 ドライバとインスタンス 
 IRP 
 フィルタドライバの実装 
 フィルタドライバの登録 
 INFファイル ←★
INFファイル 
 謎の書式でインストール情報を記述す 
る 
 devcon.exe等からインストールすると 
きや、カタログファイル(.CAT)を作 
るのに必要 
 GenINFである程度は作れる 
 ただしWDK 6001には存在しない 
 ChkINFでチェックできる 
 実態はPerlスクリプト
GenINF(1) general info.
GenINF(2) add files 
アーキテクチャの指定
GenINF(3) specific info.
GenINF(4) bus types
GenINF(5) x86 specific
GenINF(6) service info.
GenINF(7) IA64 specific
GenINF(8) class specific 
info.
GenINF(9) done!
しかしながら… 
 そのままでは使えないのでINFファイ 
ルを修正する必要がある 
 近い動作のドライバのINFファイルを 
見るのが手っ取り早い 
 WDKのサンプルのINFファイルを改造 
して挙動を確かめる 
 記述が間違っているとインストールできな 
い
デコレーション 
 プラットフォーム毎(例えばx86と 
x64)で、インストール先やインス 
トールするファイルを変えたい場合に 
指定する 
 例:「x86」「NTamd64」 
 Windows XP以前(95/98/2000) 
の.INFは下位互換性維持のためひどい 
書式だったが、XP以降はデコレーショ 
ンのおかげでシンプルになった
DriverVer 
 「DriverVer= 5/1/2009 」の行を 
「DriverVer= 05/01/2009,1.0.0.1 」の 
ように修正(一桁の数字はゼロで埋め 
る) 
 そのままだとsignability に怒られる
[Manufacturer] (1) 
 INFファイルに含まれる製造元(ベン 
ダー)の一覧を記述する 
 それぞれのハードウェアは、ベンダー毎の 
セクションで指定 
 プラットフォーム毎にインストール動 
作を記述したい場合、 [Manufacturer] 
セクションにデコレーションを追記す 
る 
 配布ファイルだけ異なるような場合には不 
要
[Manufacturer] (2) 
 x64(AMD64/Intel64 )に対応させた 
い場合 
[Manufacturer] 
%HOGE%=HOGE,NTamd64 
[HOGE.NTamd64] 
…
[Manufacturer] (3) 
 Itaniumに対応させたい場合 
[Manufacturer] 
%HOGE%=HOGE,NTia64 
[HOGE.NTia64] 
…
[Manufacturer] (4) 
 StrongARMアーキテクチャ(Intel 
XScale)に対応させたい場合 
[Manufacturer] 
%HOGE%=HOGE,SA 
[HOGE.SA] 
…
[Manufacturer] (5) 
 SHアーキテクチャ(SH-3、SH-4) 
に対応させたい場合 
[Manufacturer] 
%HOGE%=HOGE,SH 
[HOGE.SH] 
…
[Manufacturer] (6) 
 MIPSアーキテクチャに対応させたい場 
合 
[Manufacturer] 
%HOGE%=HOGE,MIPS 
[HOGE.MIPS] 
…
[Manufacturer] (7) 
 PowerPCアーキテクチャに対応させた 
い場合 
[Manufacturer] 
%HOGE%=HOGE,PPC 
[HOGE.PPC] 
…
[Manufacturer] (8) 
 Alphaアーキテクチャに対応させたい場 
合 
[Manufacturer] 
%HOGE%=HOGE,Alpha 
[HOGE.Alpha] 
…
[Manufacturer] (9) 
 Alpha AXPアーキテクチャに対応させ 
たい場合 
[Manufacturer] 
%HOGE%=HOGE,axp64 
[HOGE.axp64] 
…
ちなみに 
 Windows XPはx86版とx64版しかリ 
リースされていません 
Alpha版はbetaすら出ていません
[SourceDisksNames] 
 ファイルのコピー元のディレクトリ指 
定 
 書式 
disk_id_num = ,"label",,path 
disk_id_numは1以上で自分で定義する 
 デコレーションにより、アーキテク 
チャ毎にバイナリを用意できる
[DestinationDirs] 
 ファイルのコピー先をdridで指定する 
 http://msdn.microsoft.com/en-us/library/ms790174.aspx 
 例:DefaultDestDir = 12 
 ドライバなら「12」 
 10 → C:Windows 
 11 → C:WindowsSystem32 
 12 → C:WindowsSystem32drivers
[~_Inst.NTx86.HW.AddReg] 
 レジストリに追加する値の指定 
 例: 
HKR,,"UpperFilters",0x00010008,"Hoge" 
 値の型に注意 
 MULTI_SZ(0x10000)だと既存の値を 
上書きする(既存のフィルタドライバを無 
効にする) 
 0x10008 → MULTI_SZ型で追記
CATファイル 
 カテゴリファイル 
 INFファイルから生成するバイナリ 
ファイル 
 デジタル署名可能 
 signability.exe などを利用して生成する
signabilityで.catを生成 
 signability.exe /cat /driver:<INFファイ 
ルのあるフォルダのフルパス> /os:OS 
値 
 OS値には、OSに対応する数値の論理和 
か、文字列(Windows_XPなど) 
 Windows 2000 … 2 
 Windows XP 32bit … 8 
 Windows Vista 32bit … 256
デジタル署名(1) 
 Vista 64bitでは必須 
 Microsoftによる署名のないドライバは 
ロードできない 
 フィルタドライバがロードできないと、そ 
のデバイスが使用不可能になる
デジタル署名(2) 
 正式な証明書の場合 
 Verisignなどから購入し、Microsoftのク 
ロス証明書を生成する 
 CrystalCPUIDのブログなどを参照 
 オレオレ証明書の場合 
 適当な証明書を発行し、「信頼できるルー 
ト証明書」に格納する 
 テストモードでないとロードできない
signtoolで署名 
 証明書の作り方は省略 
 詳しくはKMCS_Walkthrough.doc を参 
照 
 http://www.microsoft.com 
/whdc/winlogo/drvsign/kmcs_walkthrough.mspx 
 例:Hoge.catをPrivateCertStore に格 
納してある証明書HogeIncで署名する 
 signtool.exe sign /v /s PrivateCertStore /n HogeInc /t 
http://timestamp.verisign.com/scripts/timestamp.dll 
Hoge.cat
インストール 
 devcon.exe でインストール可能 
 INFファイルとハードウェアIDを指定す 
る 
 devcon.exe install Hoge.inf *PNP0FAKE 
 謎のデバイスを強制的にインストール 
する方法のため、不明なデバイスが追 
加される 
 削除してよい
余談:GNU make 
 NMAKE用のMAKEFILEが存在してい 
る 
 しかもMAKEFILEは「DO NOT 
EDIT」 
 GNU makeが使いたい 
→ GNUMakefileというファイル名にする
DEMO1:PassFilter 
 何もしないフィルタドライバ 
 IRPをデバッグ出力
DEMO2:SwapFilter 
 キーボードのLキーとRキーを入れ替 
え 
 マウスの左クリックと右クリックを入 
れ替え 
 Scroll Lockを押すとBSoD
入れ替えの実装方法 
 Lowerフィルタの場合 
 クラスドライバの配下に入る 
 クラスドライバが提供するサービスコール 
バックを利用する 
 Upperフィルタの場合 
 ユーザーランドとクラスドライバとの間に 
入る 
 ユーザーランドとの入出力を加工できる
実装部 
 Lのscan code=0x26 
 Rのscan code =0x13 
 Scroll Lockのscan code =0x46 
if (Buffer[0].MakeCode == 0x26) { 
Buffer[0].MakeCode = 0x13; 
} else if (Buffer[0].MakeCode == 0x13) { 
Buffer[0].MakeCode = 0x26; 
} else if (Buffer[0].MakeCode == 0x46) { 
char *p = NULL; 
*p = 0; 
}
参考書籍 
 WindowsXPフィルタドライバプログラ 
ミング 
 Microsoft WDMプログラミング 
 WDMデバイスドライバプログラミング 
完全ガイド 
 Windows NT ファイルシステム詳説
フィルタドライバプログラミ 
ング 
 絶版 
 入門書 
 評判はいまいち 
 USBのフィルタドライバを 
書くなら参考になる
Microsoft WDMプログラミン 
グ 
 良書 
 サンプルが豊富 
 Visual C++用のWizardつ 
き
WDM~完全ガイド 
 ソースコードなし 
 どちらかというとリファレ 
ンス的 
 概要を把握した上で、より 
深く理解するのに使える
NTファイルシステム詳説 
 絶版 
 重厚 
 NT用なので古い 
 ファイルシステム周りとし 
ては唯一の日本語書籍 
 ヤフオクで3万円くらい
Thank you! 
 ご意見ご質問があればお願いします

Mais conteúdo relacionado

Mais procurados

正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?kwatch
 
FlutterでBLEを
いい感じにする
FlutterでBLEを
いい感じにするFlutterでBLEを
いい感じにする
FlutterでBLEを
いい感じにするchigichan24
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~Miki Shimogai
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIKoichiro Sumi
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーke-m kamekoopa
 
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」Junichiro Kazama
 
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介IBM Analytics Japan
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンKentaro Yoshida
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Yuichi Ito
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策iPride Co., Ltd.
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門uchan_nos
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)
Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)
Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)NTT DATA Technology & Innovation
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 

Mais procurados (20)

正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
 
FlutterでBLEを
いい感じにする
FlutterでBLEを
いい感じにするFlutterでBLEを
いい感じにする
FlutterでBLEを
いい感じにする
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
どうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCIどうやらテスト駆動型開発は死んだようです。これからのCI
どうやらテスト駆動型開発は死んだようです。これからのCI
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
SQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリーSQLアンチパターン - ナイーブツリー
SQLアンチパターン - ナイーブツリー
 
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
SQLite の暗号化
SQLite の暗号化SQLite の暗号化
SQLite の暗号化
 
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
Db2 v11.5.4 高可用性構成 & HADR 構成パターンご紹介
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方Docker入門: コンテナ型仮想化技術の仕組みと使い方
Docker入門: コンテナ型仮想化技術の仕組みと使い方
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策PDOでデータベース接続と SQLインジェクション対策
PDOでデータベース接続と SQLインジェクション対策
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
C++でできる!OS自作入門
C++でできる!OS自作入門C++でできる!OS自作入門
C++でできる!OS自作入門
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)
Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)
Grafana Lokiの Docker Logging Driver入門 (Docker Meetup Tokyo #34, 2020/01/16)
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 

Destaque

C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
Css2009 ruo ando
Css2009 ruo andoCss2009 ruo ando
Css2009 ruo andoRuo Ando
 
Raw画像について
Raw画像についてRaw画像について
Raw画像についてSungsil Hwang
 
RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」
RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」
RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」ec-campus
 
Introduction to workqueue
Introduction to workqueueIntroduction to workqueue
Introduction to workqueueyshigeru
 
Mr201209 windows8 exploit_mitigation
Mr201209 windows8 exploit_mitigationMr201209 windows8 exploit_mitigation
Mr201209 windows8 exploit_mitigationFFRI, Inc.
 
File systems virtualization in windows using mini filter drivers
File systems virtualization in windows using mini filter driversFile systems virtualization in windows using mini filter drivers
File systems virtualization in windows using mini filter driversMPNIKHIL
 
ロボットシステム学2015年第13回
ロボットシステム学2015年第13回ロボットシステム学2015年第13回
ロボットシステム学2015年第13回Ryuichi Ueda
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!
XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!
XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!Hiroaki Komine
 
Windows Internals for Linux Kernel Developers
Windows Internals for Linux Kernel DevelopersWindows Internals for Linux Kernel Developers
Windows Internals for Linux Kernel DevelopersKernel TLV
 
Windows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてWindows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてOsamu Monoe
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法NAOKI ABE
 
これだけ知っときゃなんとかなるVim
これだけ知っときゃなんとかなるVimこれだけ知っときゃなんとかなるVim
これだけ知っときゃなんとかなるVimarisu yano
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~
デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~
デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~ec-campus
 
レンズについて
レンズについてレンズについて
レンズについてfimpen
 
Manuscriptedit Japan Medical Services
Manuscriptedit Japan Medical ServicesManuscriptedit Japan Medical Services
Manuscriptedit Japan Medical ServicesTanmaya
 
プレゼンテーション
プレゼンテーションプレゼンテーション
プレゼンテーションwebcampusschoo
 
撮影のイロハ基礎編
撮影のイロハ基礎編撮影のイロハ基礎編
撮影のイロハ基礎編ec-campus
 

Destaque (20)

C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
Css2009 ruo ando
Css2009 ruo andoCss2009 ruo ando
Css2009 ruo ando
 
Raw画像について
Raw画像についてRaw画像について
Raw画像について
 
RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」
RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」
RAW現像をマスターすれば写真が劇的に変わる!「商品撮影のイロハ〜現像初級編〜」
 
Introduction to workqueue
Introduction to workqueueIntroduction to workqueue
Introduction to workqueue
 
Mr201209 windows8 exploit_mitigation
Mr201209 windows8 exploit_mitigationMr201209 windows8 exploit_mitigation
Mr201209 windows8 exploit_mitigation
 
File systems virtualization in windows using mini filter drivers
File systems virtualization in windows using mini filter driversFile systems virtualization in windows using mini filter drivers
File systems virtualization in windows using mini filter drivers
 
ロボットシステム学2015年第13回
ロボットシステム学2015年第13回ロボットシステム学2015年第13回
ロボットシステム学2015年第13回
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
 
XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!
XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!
XPages の最新機能を、XPages Extension Library Japan の日本語サンプルで試そう!
 
Windows Internals for Linux Kernel Developers
Windows Internals for Linux Kernel DevelopersWindows Internals for Linux Kernel Developers
Windows Internals for Linux Kernel Developers
 
Windows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー についてWindows 10 の あたらしい Web ブラウザー について
Windows 10 の あたらしい Web ブラウザー について
 
Windows10の展開手法
Windows10の展開手法Windows10の展開手法
Windows10の展開手法
 
これだけ知っときゃなんとかなるVim
これだけ知っときゃなんとかなるVimこれだけ知っときゃなんとかなるVim
これだけ知っときゃなんとかなるVim
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~
デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~
デジタル一眼レフでプロ並みの商品写真を撮る方法~デモ編~
 
レンズについて
レンズについてレンズについて
レンズについて
 
Manuscriptedit Japan Medical Services
Manuscriptedit Japan Medical ServicesManuscriptedit Japan Medical Services
Manuscriptedit Japan Medical Services
 
プレゼンテーション
プレゼンテーションプレゼンテーション
プレゼンテーション
 
撮影のイロハ基礎編
撮影のイロハ基礎編撮影のイロハ基礎編
撮影のイロハ基礎編
 

Semelhante a フィルタドライバ入門

Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )博宣 今村
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法Naruto TAKAHASHI
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)Daisuke Ikeda
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!leverages_event
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ UndertowについてYoshimasa Tanabe
 
Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Akira Kaneda
 
20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriver20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriverHiroko Tamagawa
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - FuncGosuke Miyashita
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Masahito Zembutsu
 
2016年2月4日 空間OSの設計コンセプトと先端IT
2016年2月4日 空間OSの設計コンセプトと先端IT2016年2月4日 空間OSの設計コンセプトと先端IT
2016年2月4日 空間OSの設計コンセプトと先端ITaitc_jp
 
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Uemura Yuichi
 
Ai sam 製品概要 4-5
Ai sam 製品概要 4-5Ai sam 製品概要 4-5
Ai sam 製品概要 4-5龍雄 炭田
 
Ai SAM 製品概要-4-5
Ai SAM 製品概要-4-5 Ai SAM 製品概要-4-5
Ai SAM 製品概要-4-5 龍雄 炭田
 
Linux daemonとsupervisordの美味しい関係
Linux daemonとsupervisordの美味しい関係Linux daemonとsupervisordの美味しい関係
Linux daemonとsupervisordの美味しい関係Kazushige TAKEUCHI
 
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!Midori Oge
 
Serfが面白いと俺の中で話題にwwwwww
Serfが面白いと俺の中で話題にwwwwwwSerfが面白いと俺の中で話題にwwwwww
Serfが面白いと俺の中で話題にwwwwwwMasahito Zembutsu
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Mori Shingo
 
クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~
クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~
クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~Rworks, Inc.
 

Semelhante a フィルタドライバ入門 (20)

Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )
Linuxベースのオープンソース フライトコントローラーの概要( #ABC2015S )
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
 
BBBBB
BBBBBBBBBB
BBBBB
 
1MB
1MB1MB
1MB
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!
 
次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて次世代Webコンテナ Undertowについて
次世代Webコンテナ Undertowについて
 
Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)Edge os(vyos)の基本(入門編)
Edge os(vyos)の基本(入門編)
 
20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriver20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriver
 
Open Source System Administration Framework - Func
Open Source System Administration Framework - FuncOpen Source System Administration Framework - Func
Open Source System Administration Framework - Func
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
2016年2月4日 空間OSの設計コンセプトと先端IT
2016年2月4日 空間OSの設計コンセプトと先端IT2016年2月4日 空間OSの設計コンセプトと先端IT
2016年2月4日 空間OSの設計コンセプトと先端IT
 
Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018Cloud Foundry構成概要 111018
Cloud Foundry構成概要 111018
 
Ai sam 製品概要 4-5
Ai sam 製品概要 4-5Ai sam 製品概要 4-5
Ai sam 製品概要 4-5
 
Ai SAM 製品概要-4-5
Ai SAM 製品概要-4-5 Ai SAM 製品概要-4-5
Ai SAM 製品概要-4-5
 
Linux daemonとsupervisordの美味しい関係
Linux daemonとsupervisordの美味しい関係Linux daemonとsupervisordの美味しい関係
Linux daemonとsupervisordの美味しい関係
 
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
2013OSC関西@京都_CloudStackとCloudFoundaryがまるわかり!
 
Serfが面白いと俺の中で話題にwwwwww
Serfが面白いと俺の中で話題にwwwwwwSerfが面白いと俺の中で話題にwwwwww
Serfが面白いと俺の中で話題にwwwwww
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~
クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~
クラウド環境の監視がより便利になった Pandora FMS ~手間をかけない監視設定を実現する仕組み~
 

Mais de firewood

Best Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS appBest Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS appfirewood
 
Xcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたfirewood
 
Xcodeで値を表示する
Xcodeで値を表示するXcodeで値を表示する
Xcodeで値を表示するfirewood
 
SmartNewsアプリの品質
SmartNewsアプリの品質SmartNewsアプリの品質
SmartNewsアプリの品質firewood
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたfirewood
 
delayed_jobの自動再起動
delayed_jobの自動再起動delayed_jobの自動再起動
delayed_jobの自動再起動firewood
 
三日で書くGroonga関数
三日で書くGroonga関数三日で書くGroonga関数
三日で書くGroonga関数firewood
 

Mais de firewood (9)

Best Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS appBest Bugs 2017 in the SmartNews iOS app
Best Bugs 2017 in the SmartNews iOS app
 
Xcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみたXcodeでmrubyをステップ実行してみた
Xcodeでmrubyをステップ実行してみた
 
Xcodeで値を表示する
Xcodeで値を表示するXcodeで値を表示する
Xcodeで値を表示する
 
SmartNewsアプリの品質
SmartNewsアプリの品質SmartNewsアプリの品質
SmartNewsアプリの品質
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べた
 
delayed_jobの自動再起動
delayed_jobの自動再起動delayed_jobの自動再起動
delayed_jobの自動再起動
 
三日で書くGroonga関数
三日で書くGroonga関数三日で書くGroonga関数
三日で書くGroonga関数
 
L-R
L-RL-R
L-R
 
FPGA
FPGAFPGA
FPGA
 

フィルタドライバ入門