SlideShare a Scribd company logo
初心者向けデバイスドライバ講座 (1)
サイエンスパーク株式会社 大島 光人
1
ID:aohshima
名前:大島 光人(オオシマ アキト)
東京電機大学理工学部電子機械工学科卒業
今年4月にサイエンスパーク株式会社に就職
プラットフォーム開発部:デバイスドライバ課所属
⇒デバイスドライバ初心者が学んだ内容を発表していきます。
2
自己紹介
目次
3
1. デバイスドライバとは
2. デバイスドライバの種類
3. 開発環境を構築してみる
4. サンプルドライバをビルドしてみる
5. 簡単なログ出力のドライバを作成してみる
OSと周辺機器の橋渡しの役割をするソフトウェア。
1つの周辺機器を動かすだけでも、たくさんのデバイスドライバが必要。
デバイスドライバとは
PC
周辺機器
4
バスドライバ
クラスドライバ
ファンクションドライバ
ミニポートドライバ
5
例:実際にUSBメモリを接続した場合
USBクラスドライバ
USBバスドライバ
PCIバスドライバ
ハードウェア
ソフトウェア
実際にデバイスドライバの開発環境を用意してみる
6
• 開発環境:Visual Studio(2012以降)
• WDK (対応するVisualStudioのバージョンを導入)
現状WDK10は以下のOSに対応
・Windows10
・Windows8.1
・Windows7
⇒これより前のOSに対応する場合、前のVisualStudioを導入する必要がある。
• WindowsSDK
⇒最新のものはMSからダウンロード
少し前のバージョンならVisualStudioインストール時にオプションでインストールも可能
(最新のものを導入する場合前のバージョンのアンインストールが必要)
⇒WDKはVisualStudioのバージョンに応じて変更する必要がある。
必要なもの
7
VisualStudio:Windows:WDKの対応表
※1 VisualStudioインストール時に対応したSDKがインストール可能
VisualStudioのバージョン Windowsのバージョン WDKと関連ダウンロード WindowsSDK
VisualStudio2017 Windows 10、バージョン1809 Windows 10用WDK、バージョン1809 -(※1)
Windows 10、バージョン1803 Windows 10用WDK、バージョン1803 -(※1)
Windows 10、バージョン1709 Windows 10用WDK、バージョン1709 -(※1)
VisualStudio2015 Windows 10、バージョン1703 Windows 10用WDK、バージョン1703 Windows SDK for Windows
10.0.15063.468
Windows 10、バージョン1607 Windows 10用WDK、バージョン1607 Windows SDK for Windows
10.0.14393.795
VisualStudio2013 Windows 8.1アップデート WDK 8.1アップデート(英語のみ)
WDK 8.1アップデートテストパック(英語
のみ)
WDK 8.1サンプル
Windows 8.1 向け Windows SDK
VisualStudio2012 ウィンドウズ8 WDK 8(英語のみ)
WDK 8再頒布可能コンポーネント(英語
のみ)
WDK 8サンプル
Windows SDK for Windows 8
8
WindowsSDK
9
1. VisualStudio
2. WindowsSDK
3. WDK
⇒WDKインストール時にSDKが未インストールだとSDKが発見できないと警告文が表示さ
れる。
インストール順
10
EWDK(EnterPrise WDK)
11
EWDK は、コマンド ラインをベースにしたビルド環境
詳細なインストール手順はなく、ファイルのダウンロードとシンプルなコマンドの実行
だけで利用することが可能
EWDK は無償だが、Visual Studio にのみ含まれているライブラリは含まれていない
⇒上記ライブラリを利用するモジュールはビルドすることができない。
例:ネットで調べるとよく見るサンプルドライバの Toasterは、EWDK に含まれていな
い Active Template Library (ATL) と呼ばれるライブラリを利用している為ビルド不可
GitHubからソースコードをダウンロードする。
https://github.com/microsoft/Windows-driver-samples
Windowsのサンプルドライバをビルドしてみる ①
12
Windows-driver-samples-mastergeneralioctlを見てみると・・・
Kmdfとwdmの二つのフォルダが存在
フォルダの中身の構成は同じになっている。
Windowsのサンプルドライバをビルドしてみる ②
13
• WDM⇒Windows Driver Model
Wikipediaには以下のように記載
Windows Driver Model (WDM) とは、Windows 98とWindows 2000で導入されたデバイスドライバーのフレームワークであり、それ
クであり、それ以前のWindowsで使われていたVxDなどを代替するものとして登場した。導入当時はWin32 Driver Modelと呼ばれ
ていた。
⇒昔から使用されていたドライバーのフレームワーク
WDM
14
WDF⇒Windows Driver Foundationの略称WDMの後継として登場したデバイスドライバ開発の
ためのデバイスドライバモデル。
WDFの主な構成として
Kernel Mode Driver Framework (KMDF)
User Mode Driver Framework (UMDF)
⇒WDMの後継として登場したフレームワーク
WDF
15
ユーザーモードのドライバ開発
⇒WDFのUMDFを使用
カーネルモードのドライバ開発
⇒WDFのKMDFあるいはWDMを使用
機能的に両モデルに差異はないが、対応OS、自由度に差がある
汎用的なドライバ開発
⇒WDF
自由度の高い特異的なドライバ開発
⇒WDM
自分が作成するべきドライバに応じて使い分けることが重要
どっちを選ぶか
16
Windowsのサンプルドライバをビルドしてみる ③
17
ログ出力用のドライバをビルドしてみる①
18
ログ出力用のドライバをビルドしてみる②
Driver.cの中に以下の関数がある
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
.
.
.
.
}
19
DriverEntryとは?
C言語のmain関数に相当
ドライバがロードされる時に一番最初に呼び出される関数
どのデバイスを制御するか、どんな要求を受けてどのような処理をするかを定義する
Driver
Entry
Add
Device
PnP
Manager
PnP
Dispatch
Routine
要求に対する処理を定義
ドライバ
ロード
デバイス制御対象を定義
20
ログ出力用のドライバをビルドしてみる③
DriverEntry関数内に以下の一文を追加してビルドする。
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
.
.
.
.
DbgPrint(“Hello World”);
return status;
}
21
ビルドしたドライバをインストールしてみる
C:Program Files (x86)Windows Kits10(1)Toolsx64(2)devcon.exeをビルドしたドライバと同じディ
レクトリに配置
(1)導入したSDKのバージョンによって、8.1などに変更
(2)ドライバをインストールする環境によってx86等に変更
22
ビルドしたドライバをインストールしてみる②
コマンドプロンプトでドライバのあるディレクトリに移動して、以下のコマンドを実行
devcon.exe install [ドライバ名].inf Root[ドライバ名]
ドライバロー
ド時に呼び出
されている。
23
EWDKを用いてビルドしてみる
24
EWDKをMSからダウンロードし解凍する。
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk
解答したフォルダをcmdでワーキングディレクトリに指定する。
25
MSBuild [ビルド対象のsln].slnでビルド実行
EWDKを用いてビルドしてみる②
まとめ
デバイスドライバの基礎部分について実践した。
次回は、DriverEntry内に処理を実装して、ドライバロード時のデバッグに挑戦する。
26
SP-1907-E09-1

More Related Content

What's hot

GTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games Japan
GTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games JapanGTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games Japan
GTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games Japan
Game Tools & Middleware Forum
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
Binderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroidBinderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroid
l_b__
 

What's hot (20)

アーティスト向けNSightの手引き
アーティスト向けNSightの手引きアーティスト向けNSightの手引き
アーティスト向けNSightの手引き
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
 
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
給自己更好未來的 3 個練習:嵌入式作業系統設計、實做,與移植 (2015 年春季 ) 課程說明
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
 
Msを16倍出し抜くwpf開発1回目
Msを16倍出し抜くwpf開発1回目Msを16倍出し抜くwpf開発1回目
Msを16倍出し抜くwpf開発1回目
 
WPF開発での陥りやすい罠
WPF開発での陥りやすい罠WPF開発での陥りやすい罠
WPF開発での陥りやすい罠
 
ROS を用いた自律移動ロボットのシステム構築
ROS を用いた自律移動ロボットのシステム構築ROS を用いた自律移動ロボットのシステム構築
ROS を用いた自律移動ロボットのシステム構築
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
GTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games Japan
GTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games JapanGTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games Japan
GTMF2016:Unreal Engine 4を利用した先進的なゲーム制作手法 The Unreal Way 2016 Epic Games Japan
 
Scheduling in Android
Scheduling in AndroidScheduling in Android
Scheduling in Android
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話Raspberry Pi + Go で IoT した話
Raspberry Pi + Go で IoT した話
 
ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!ARM Trusted FirmwareのBL31を単体で使う!
ARM Trusted FirmwareのBL31を単体で使う!
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
 
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装
 
Steam ゲーム内購入 サーバーサイド実装について
Steam ゲーム内購入 サーバーサイド実装についてSteam ゲーム内購入 サーバーサイド実装について
Steam ゲーム内購入 サーバーサイド実装について
 
仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点仮想化技術によるマルウェア対策とその問題点
仮想化技術によるマルウェア対策とその問題点
 
Binderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroidBinderのはじめの一歩とAndroid
Binderのはじめの一歩とAndroid
 

Similar to 初心者向けデバイスドライバ講座(1)

年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会
モノビット エンジン
 
Aws summits2014 nttデータaws上のシステムはこう作る!
Aws summits2014 nttデータaws上のシステムはこう作る!Aws summits2014 nttデータaws上のシステムはこう作る!
Aws summits2014 nttデータaws上のシステムはこう作る!
Boss4434
 

Similar to 初心者向けデバイスドライバ講座(1) (20)

初心者向けデバイスドライバ講座 (2)
初心者向けデバイスドライバ講座 (2) 初心者向けデバイスドライバ講座 (2)
初心者向けデバイスドライバ講座 (2)
 
テスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめテスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめ
 
Algyan@how to dragon board410c20170930
Algyan@how to dragon board410c20170930Algyan@how to dragon board410c20170930
Algyan@how to dragon board410c20170930
 
年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会
 
わんくま名古屋 #37 (20151114) Windows 10 UWP アプリ開発入門(実践編)
わんくま名古屋 #37 (20151114) Windows 10 UWP アプリ開発入門(実践編)わんくま名古屋 #37 (20151114) Windows 10 UWP アプリ開発入門(実践編)
わんくま名古屋 #37 (20151114) Windows 10 UWP アプリ開発入門(実践編)
 
Archer
ArcherArcher
Archer
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
ドライバへのETWの埋め込み
ドライバへのETWの埋め込みドライバへのETWの埋め込み
ドライバへのETWの埋め込み
 
Hardware control by .NET Core 3.1
Hardware control by .NET Core 3.1Hardware control by .NET Core 3.1
Hardware control by .NET Core 3.1
 
自動テスト知識体系TABOKのご紹介
自動テスト知識体系TABOKのご紹介自動テスト知識体系TABOKのご紹介
自動テスト知識体系TABOKのご紹介
 
初心者向けデバイスドライバ講座(6)
初心者向けデバイスドライバ講座(6)初心者向けデバイスドライバ講座(6)
初心者向けデバイスドライバ講座(6)
 
Androidアプリケーション開発中級研修 前編
Androidアプリケーション開発中級研修 前編Androidアプリケーション開発中級研修 前編
Androidアプリケーション開発中級研修 前編
 
Essentials of container
Essentials of containerEssentials of container
Essentials of container
 
SORACOM Bootcamp Rec12 | SORACOM Inventory
SORACOM Bootcamp Rec12 | SORACOM InventorySORACOM Bootcamp Rec12 | SORACOM Inventory
SORACOM Bootcamp Rec12 | SORACOM Inventory
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編
 
Jslug2 nagoya-shibata
Jslug2 nagoya-shibataJslug2 nagoya-shibata
Jslug2 nagoya-shibata
 
Lt 110416
Lt 110416Lt 110416
Lt 110416
 
.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み.NET Coreから概観する.NETのOSSへの取り組み
.NET Coreから概観する.NETのOSSへの取り組み
 
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
CEDEC2021 Android iOS 実機上での自動テストをより楽に有意義にする為に ~端末管理・イメージ転送・動画記録等の周辺情報のノウハウ共有~
 
Aws summits2014 nttデータaws上のシステムはこう作る!
Aws summits2014 nttデータaws上のシステムはこう作る!Aws summits2014 nttデータaws上のシステムはこう作る!
Aws summits2014 nttデータaws上のシステムはこう作る!
 

More from Study Group by SciencePark Corp.

More from Study Group by SciencePark Corp. (20)

WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
WPFの画面をWebブラウザのように拡大・縮小に追従させる方法(オートスクロールバー付き)
 
YOLOとご一緒にPandasはいかがですか
YOLOとご一緒にPandasはいかがですかYOLOとご一緒にPandasはいかがですか
YOLOとご一緒にPandasはいかがですか
 
新入社員の俺がDeepLearningのコードを書いてみたら神検出率だった件
新入社員の俺がDeepLearningのコードを書いてみたら神検出率だった件新入社員の俺がDeepLearningのコードを書いてみたら神検出率だった件
新入社員の俺がDeepLearningのコードを書いてみたら神検出率だった件
 
.NET CoreでのWindowsサービスの作り方と、Coreならではの便利な機能
.NET CoreでのWindowsサービスの作り方と、Coreならではの便利な機能.NET CoreでのWindowsサービスの作り方と、Coreならではの便利な機能
.NET CoreでのWindowsサービスの作り方と、Coreならではの便利な機能
 
JTAGを使ってみよう
JTAGを使ってみようJTAGを使ってみよう
JTAGを使ってみよう
 
JTAG入門
JTAG入門JTAG入門
JTAG入門
 
ローカルストレージでの永続化キューの方式を本気で比較してみた
ローカルストレージでの永続化キューの方式を本気で比較してみたローカルストレージでの永続化キューの方式を本気で比較してみた
ローカルストレージでの永続化キューの方式を本気で比較してみた
 
Azure VMを検証に使う - 便利なHyper-Vスナップショットを使う方法
Azure VMを検証に使う - 便利なHyper-Vスナップショットを使う方法Azure VMを検証に使う - 便利なHyper-Vスナップショットを使う方法
Azure VMを検証に使う - 便利なHyper-Vスナップショットを使う方法
 
02.超初心者向けセキュリティ入門(IoT)
02.超初心者向けセキュリティ入門(IoT)02.超初心者向けセキュリティ入門(IoT)
02.超初心者向けセキュリティ入門(IoT)
 
06.超初心者向けセキュリティ入門(.netの解析と対策)
06.超初心者向けセキュリティ入門(.netの解析と対策)06.超初心者向けセキュリティ入門(.netの解析と対策)
06.超初心者向けセキュリティ入門(.netの解析と対策)
 
Visual StudioでWixをビルドしてみた
Visual StudioでWixをビルドしてみたVisual StudioでWixをビルドしてみた
Visual StudioでWixをビルドしてみた
 
MacOS10.15への対応について
MacOS10.15への対応についてMacOS10.15への対応について
MacOS10.15への対応について
 
Teamsでのリモート勉強会の開き方
Teamsでのリモート勉強会の開き方Teamsでのリモート勉強会の開き方
Teamsでのリモート勉強会の開き方
 
リモートでの勉強会参加方法
リモートでの勉強会参加方法リモートでの勉強会参加方法
リモートでの勉強会参加方法
 
No.2 超初心者向け セキュリティ入門
No.2 超初心者向け セキュリティ入門No.2 超初心者向け セキュリティ入門
No.2 超初心者向け セキュリティ入門
 
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまでSphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
SphinxのCIの続き Azure DevOpsでのビルド結果を、認証付きAzure App Serviceに公開するところまで
 
01.超初心者向けセキュリティ入門
01.超初心者向けセキュリティ入門01.超初心者向けセキュリティ入門
01.超初心者向けセキュリティ入門
 
Azure DevTestLabsはデスクトップアプリ開発のテストを楽にしてくれる
Azure DevTestLabsはデスクトップアプリ開発のテストを楽にしてくれるAzure DevTestLabsはデスクトップアプリ開発のテストを楽にしてくれる
Azure DevTestLabsはデスクトップアプリ開発のテストを楽にしてくれる
 
無線通信にて遠隔操作を行うVRトラッキングカメラ
無線通信にて遠隔操作を行うVRトラッキングカメラ無線通信にて遠隔操作を行うVRトラッキングカメラ
無線通信にて遠隔操作を行うVRトラッキングカメラ
 
Sphinxの環境構築が再現できない問題をDockerで解決してみた
Sphinxの環境構築が再現できない問題をDockerで解決してみたSphinxの環境構築が再現できない問題をDockerで解決してみた
Sphinxの環境構築が再現できない問題をDockerで解決してみた
 

初心者向けデバイスドライバ講座(1)