SlideShare una empresa de Scribd logo
1 de 31
Windows の 
カーネルモードドライバで 
填まった話 
みむら(@mimura1133) 
1
自己紹介 
2
こんなひと 
• みむら( @mimura1133 / Satoshi Mimura ) 
• http://mimumimu.net/ 
• セキュリティキャンプ2014 
ソフトウェアセキュリティクラスチュータ(予定) 
• SECCON 2014 CTF for Beginners の旗振り役 
( http://2014.seccon.jp/2014_07_CTF_for_Beginners2.html ) 
• wasamusume というCTF チームの旗振り役 
• 最近は土足でWinRT に入れないかいろいろ実験中 
3
余談:この前。 
• セキュリティキャンプ 
ネットワークセキュリティクラスの問題を解くWrite-up を書きました。 
• 問題ファイルはpcap で、その中からファイルを出してきて解くもの。 
• なんか怖い人からこんなこと言われたので: 
• がんばってみました。 
• https://mimumimu.net/blog/ 4
余談:この前。 
5
こういう話ではなくてですね 
→本題に戻る 
6
Windows の 
カーネルモードドライバで 
填まった話 
みむら(@mimura1133) 
7
はじめに 
• 話題がディープすぎるので 
何となく雰囲気を感じて頂くような内容にしました。 
• ガチなドライバ開発者さん: 
目一杯マサカリを飛ばしたくなるかもしれません 
• カーネルモードドライバ書いてみたい!という人: 
別所で。15分では無理です。 
8
そもそも「カーネルモード」ってなんぞ 
• カーネル空間で動作するもの! 
• 簡単ですね 
• カーネルモードとユーザモードがあって・・。 
9
カーネルモードとユーザモード 
• ユーザモード: 
• 普段使うアプリケーションはここで動く 
• よく見るWindows API はここで叩く。 
• WoW64 もここ。 
• 何かやろうとしたらWindows API やカー 
ネルモードドライバを経由して指示を出す 
• カーネルモード: 
• HAL に直接触れられる 
• Windows カーネルに必ずしもお伺いを立て 
る必要なし。 
• 各ビット用にプログラムを書く 
ユーザモード 
ユーザモード 
ドライバ 
カーネルモード 
カーネルモード 
ドライバ 
Windows 
カーネル 
10
つまり 
ユーザデータ 
ユーザモードの 
プロセス 
カーネルモードの 
プロセス 
11
簡単なOS の知識おさらい 
• OSによるアプリケーションの保護 
• OS は各アプリケーションに 
仮想的なI/O と 
仮想記憶による資源を提供する。 
• 各アプリケーション毎にアドレスは仮想化されており、 
互いに互いの領域に侵入したり値を書き換えたりは出来ない。 
• アプリケーションは個別に実行されるので落ちても大丈夫 
12
カーネルモードドライバでは 
• メモリアドレスは仮想化される: 
• でもカーネル含んで全体で一つの仮想化テーブルを共有する 
• カーネルモードドライバから 
カーネルのメモリ空間にアクセスしたりその逆が出来る 
• カーネルモードドライバが落ちるときは 
カーネル含めて落ちる。一心同体。 
13
つまり 
ユーザモードの 
プロセス 
障害発生 
カーネルモードの 
プロセス 
障害発生 
14
15
16
つまり 
ユーザモードの 
障害発生カーネルモードの 
プロセス 
障害発生 
プロセス 
17
でもいろいろと出来る 
• ハードウェアに直接触っていじれる。 
→ハードディスクに直接命令出せる。 
• プロセスの起動を阻害する事とかできる。 
• ファイアウォールとしてジャッジを下せる。 
• ネットワークパケットを回収できる。 
→正義の目的にも、悪い目的にもどちらにも使える。 
18
そんな良さそうな環境にも 
カーネルならではの障壁が 
IRQL のはなし 
19
IRQL (割り込みレベル) 
• 各コードの実行に関して 
IRQL というレベルが設定されている。 
• 通常実行時は 
PASSIVE_LEVEL 
• 緊急度の高いコールバックは 
DISPATCH_LEVEL 
で呼び出される。 
Source IRQL 
Hardware 
HIGH_LEVEL クリティカルなエラー 
POWER_LEVEL 電源周りのエラー 
IPL_LEVEL プロセッサ間割込 
CLOCK2_LEVEL 
CLOCK1_LEVEL 
PROFILE_LEVEL プロファイルタイマー 
DIRQL I/O デバイス割込 
Software 
DISPATCH_LEVEL ディスパッチャ 
APC_LEVEL 非同期処理APC 
PASSIVE_LEVEL スレッド実行 
20
たとえば 
• 普通にmain 関数から実行されるコード 
PASSIVE_LEVEL 
• タイマーを設定して呼び出されるコード 
DISPATCH_LEVEL 
[WdfExecutionLevelPassive を使ってPASSIVE_LEVEL で呼び出すことも出来る] 
• PsSetCreateProcessNotifyRoutine で設定したコールバック 
PASSIVE_LEVEL 
• Windows のファイアウォールとして設定したプログラムの呼び出し 
DISPATCH_LEVEL 
21
何か意味あるの 
• これって何か意味あるの? 
• 上のレベルから下のレベル 
のコードは直接呼べない。 
• 呼ぶとどうなるの 
IRQL_NOT_LESS_OR_EQUAL 
でBSoD. 
• 某R社のドライバで 
一時期よくありました( 
Source IRQL 
Hardware 
HIGH_LEVEL クリティカルなエラー 
POWER_LEVEL 電源周りのエラー 
IPL_LEVEL プロセッサ間割込 
CLOCK2_LEVEL 
CLOCK1_LEVEL 
PROFILE_LEVEL プロファイルタイマー 
DIRQL I/O デバイス割込 
Software 
DISPATCH_LEVEL ディスパッチャ 
APC_LEVEL 非同期処理APC 
PASSIVE_LEVEL スレッド実行 
22
つまり 
• PASSIVE_LEVEL の例: 
• 中島くんによる 
カツオの呼び出し。 
• クリティカルではない。 
• 何してもとりあえずOK 
23
つまり 
• DISPATCH_LEVEL の例 
• 波平によるカツオの呼び出し。 
• クリティカル。 
• 「勉強しろ」というのに 
「遊んでいる」と 
(許可されていない動作) 
動作を強制停止させられる 
(ブルースクリーン) 
24
どの状態なら何して良いかわからない 
• MSDN を見ると書いてある 
25
詰まったところ。 
• IRQL の問題 
• ディスクI/O (ファイル書き込みとかファイル作成とか)が 
全部PASSIVE_LEVEL じゃないと呼び出せない。 
• でも仕掛けておいたタイマーはDISPATCH_LEVEL! 
26
どう解決したか 
• ExQueueWorkItem をDelayedItem を引数にとって動かすと 
指定した関数をPASSIVE_LEVEL で呼び出せる! 
• やった! 
27
コード 
void hogeo(int i) 
{ 
// PASSIVE_LEVEL!! 
} 
void main(){ 
WORK_QUEUE_ITEM item; 
ExInitalizeWorkItem(&item, hogeo,0); 
ExQueueWorkItem(&item, DelayedWorkQueue); 
} 28
イメージ 
• カツオ(実行中のコンテキスト)が 
波平の監視下にある(DISPATCH_LEVEL) 
• 「終わったらお菓子食べるから取っといて」と 
サザエに依頼する( ExQueueWorkItem ) 
• 処理が終わった時に、サザエがお菓子を持って現れる 
(関数のコール) 
• カツオ、お菓子を食べる(処理の実行) 
29
コード 
void hogeo(OKASHI okashi) // サザエによって呼び出される 
{ 
// PASSIVE_LEVEL!! 
} 
void main(){ // ここは波平によって呼び出される 
WORK_QUEUE_ITEM item; 
ExInitalizeWorkItem(&item, hogeo,new OKASHI(“塩昆布”)); 
ExQueueWorkItem(&item, DelayedWorkQueue); // サザエにお菓子を依頼する。 
} 30
まとめ 
• カーネルモードドライバは慣れると楽しい 
• サザエさんのカツオはいつになったら中学生になるのだろう 
• IRQL は波平さんを思い出そう。 
• 困ったらサザエさんを使おう 
( ExQueueWorkItem ) 
• プロ生ちゃんis かわいい 
31 
Title : Windows のカーネルモード(ry 
Twitter : @mimura1133

Más contenido relacionado

La actualidad más candente (10)

neobundle.vimについて+おまけ
neobundle.vimについて+おまけneobundle.vimについて+おまけ
neobundle.vimについて+おまけ
 
暗黒美夢王とEmacs
暗黒美夢王とEmacs暗黒美夢王とEmacs
暗黒美夢王とEmacs
 
Ultimate completion environment with neocomplcache in vim
Ultimate completion environment with neocomplcache in vimUltimate completion environment with neocomplcache in vim
Ultimate completion environment with neocomplcache in vim
 
初心者Vimmerによるvim+rails開発
初心者Vimmerによるvim+rails開発初心者Vimmerによるvim+rails開発
初心者Vimmerによるvim+rails開発
 
Vim = VM
Vim = VMVim = VM
Vim = VM
 
Windows をより安全にする SafeSEH on MinGW
Windows をより安全にする SafeSEH on MinGWWindows をより安全にする SafeSEH on MinGW
Windows をより安全にする SafeSEH on MinGW
 
すごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつりすごいVimでhaskellを書こう@なごやまつり
すごいVimでhaskellを書こう@なごやまつり
 
Unite vim
Unite vim Unite vim
Unite vim
 
RAW現像入門中…
RAW現像入門中…RAW現像入門中…
RAW現像入門中…
 
「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2「ハイパーバイザの作り方」読書会#2
「ハイパーバイザの作り方」読書会#2
 

Similar a WHAT_A_KERNEL_IRQL

T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
伸男 伊藤
 
わんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみたわんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみた
伸男 伊藤
 
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼 [CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
CODE BLUE
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
Yusaku Watanabe
 
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
CODE BLUE
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
MITSUNARI Shigeo
 
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
Takuma SHIRAISHI
 

Similar a WHAT_A_KERNEL_IRQL (20)

【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
Functions
FunctionsFunctions
Functions
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
 
Nishimoto osh2014: Test driven development and accessibility
Nishimoto osh2014: Test driven development and accessibilityNishimoto osh2014: Test driven development and accessibility
Nishimoto osh2014: Test driven development and accessibility
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
ソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テスト
 
わんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみたわんくまT78 mfcを始めようとしてみた
わんくまT78 mfcを始めようとしてみた
 
Clrh 110827 wfho
Clrh 110827 wfhoClrh 110827 wfho
Clrh 110827 wfho
 
【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門 【学習メモ#9th】12ステップで作る組込みOS自作入門
【学習メモ#9th】12ステップで作る組込みOS自作入門
 
Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼 [CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
[CB19] アンチウイルスをオラクルとしたWindows Defenderに対する新しい攻撃手法 by 市川遼
 
Word bench7月号
Word bench7月号Word bench7月号
Word bench7月号
 
Pythonによる並列プログラミング -GPGPUも-
Pythonによる並列プログラミング   -GPGPUも- Pythonによる並列プログラミング   -GPGPUも-
Pythonによる並列プログラミング -GPGPUも-
 
Jenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCIJenkins+Play!で気軽にCI
Jenkins+Play!で気軽にCI
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by  朱義文
[CB19] Semzhu-Project – 手で作る組込み向けハイパーバイザと攻撃検知手法の新しい世界 by 朱義文
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
継続的デリバリー読書会 第 5 章 デプロイメントパイプラインの解剖学
 
microPCFを使ってみよう
microPCFを使ってみようmicroPCFを使ってみよう
microPCFを使ってみよう
 

Más de Satoshi Mimura

アプリ作者と Windows XP
アプリ作者と Windows XPアプリ作者と Windows XP
アプリ作者と Windows XP
Satoshi Mimura
 
Iron python と c sharp
Iron python と c sharpIron python と c sharp
Iron python と c sharp
Satoshi Mimura
 

Más de Satoshi Mimura (12)

Inside wsl
Inside wslInside wsl
Inside wsl
 
Inside wsl
Inside wslInside wsl
Inside wsl
 
おうちで簡単ハードウェアセキュリティ
おうちで簡単ハードウェアセキュリティおうちで簡単ハードウェアセキュリティ
おうちで簡単ハードウェアセキュリティ
 
某Ctf にて writeup
某Ctf にて writeup某Ctf にて writeup
某Ctf にて writeup
 
Edomae 2015 - マルウェアを解析してみよう
Edomae 2015 - マルウェアを解析してみようEdomae 2015 - マルウェアを解析してみよう
Edomae 2015 - マルウェアを解析してみよう
 
Visual Studio で TeX 編集
Visual Studio で TeX 編集Visual Studio で TeX 編集
Visual Studio で TeX 編集
 
3本指ジェスチャでの 仮想デスクトップ機能を Windows に実装した話
3本指ジェスチャでの仮想デスクトップ機能を Windows に実装した話3本指ジェスチャでの仮想デスクトップ機能を Windows に実装した話
3本指ジェスチャでの 仮想デスクトップ機能を Windows に実装した話
 
アプリ作者と Windows XP
アプリ作者と Windows XPアプリ作者と Windows XP
アプリ作者と Windows XP
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
Iron python と c sharp
Iron python と c sharpIron python と c sharp
Iron python と c sharp
 
Unix と windows 世界の融合
Unix と windows 世界の融合Unix と windows 世界の融合
Unix と windows 世界の融合
 
Windows Phone 7 と XNA の世界
Windows Phone 7 と XNA の世界Windows Phone 7 と XNA の世界
Windows Phone 7 と XNA の世界
 

WHAT_A_KERNEL_IRQL

  • 1. Windows の カーネルモードドライバで 填まった話 みむら(@mimura1133) 1
  • 3. こんなひと • みむら( @mimura1133 / Satoshi Mimura ) • http://mimumimu.net/ • セキュリティキャンプ2014 ソフトウェアセキュリティクラスチュータ(予定) • SECCON 2014 CTF for Beginners の旗振り役 ( http://2014.seccon.jp/2014_07_CTF_for_Beginners2.html ) • wasamusume というCTF チームの旗振り役 • 最近は土足でWinRT に入れないかいろいろ実験中 3
  • 4. 余談:この前。 • セキュリティキャンプ ネットワークセキュリティクラスの問題を解くWrite-up を書きました。 • 問題ファイルはpcap で、その中からファイルを出してきて解くもの。 • なんか怖い人からこんなこと言われたので: • がんばってみました。 • https://mimumimu.net/blog/ 4
  • 7. Windows の カーネルモードドライバで 填まった話 みむら(@mimura1133) 7
  • 8. はじめに • 話題がディープすぎるので 何となく雰囲気を感じて頂くような内容にしました。 • ガチなドライバ開発者さん: 目一杯マサカリを飛ばしたくなるかもしれません • カーネルモードドライバ書いてみたい!という人: 別所で。15分では無理です。 8
  • 9. そもそも「カーネルモード」ってなんぞ • カーネル空間で動作するもの! • 簡単ですね • カーネルモードとユーザモードがあって・・。 9
  • 10. カーネルモードとユーザモード • ユーザモード: • 普段使うアプリケーションはここで動く • よく見るWindows API はここで叩く。 • WoW64 もここ。 • 何かやろうとしたらWindows API やカー ネルモードドライバを経由して指示を出す • カーネルモード: • HAL に直接触れられる • Windows カーネルに必ずしもお伺いを立て る必要なし。 • 各ビット用にプログラムを書く ユーザモード ユーザモード ドライバ カーネルモード カーネルモード ドライバ Windows カーネル 10
  • 11. つまり ユーザデータ ユーザモードの プロセス カーネルモードの プロセス 11
  • 12. 簡単なOS の知識おさらい • OSによるアプリケーションの保護 • OS は各アプリケーションに 仮想的なI/O と 仮想記憶による資源を提供する。 • 各アプリケーション毎にアドレスは仮想化されており、 互いに互いの領域に侵入したり値を書き換えたりは出来ない。 • アプリケーションは個別に実行されるので落ちても大丈夫 12
  • 13. カーネルモードドライバでは • メモリアドレスは仮想化される: • でもカーネル含んで全体で一つの仮想化テーブルを共有する • カーネルモードドライバから カーネルのメモリ空間にアクセスしたりその逆が出来る • カーネルモードドライバが落ちるときは カーネル含めて落ちる。一心同体。 13
  • 14. つまり ユーザモードの プロセス 障害発生 カーネルモードの プロセス 障害発生 14
  • 15. 15
  • 16. 16
  • 17. つまり ユーザモードの 障害発生カーネルモードの プロセス 障害発生 プロセス 17
  • 18. でもいろいろと出来る • ハードウェアに直接触っていじれる。 →ハードディスクに直接命令出せる。 • プロセスの起動を阻害する事とかできる。 • ファイアウォールとしてジャッジを下せる。 • ネットワークパケットを回収できる。 →正義の目的にも、悪い目的にもどちらにも使える。 18
  • 20. IRQL (割り込みレベル) • 各コードの実行に関して IRQL というレベルが設定されている。 • 通常実行時は PASSIVE_LEVEL • 緊急度の高いコールバックは DISPATCH_LEVEL で呼び出される。 Source IRQL Hardware HIGH_LEVEL クリティカルなエラー POWER_LEVEL 電源周りのエラー IPL_LEVEL プロセッサ間割込 CLOCK2_LEVEL CLOCK1_LEVEL PROFILE_LEVEL プロファイルタイマー DIRQL I/O デバイス割込 Software DISPATCH_LEVEL ディスパッチャ APC_LEVEL 非同期処理APC PASSIVE_LEVEL スレッド実行 20
  • 21. たとえば • 普通にmain 関数から実行されるコード PASSIVE_LEVEL • タイマーを設定して呼び出されるコード DISPATCH_LEVEL [WdfExecutionLevelPassive を使ってPASSIVE_LEVEL で呼び出すことも出来る] • PsSetCreateProcessNotifyRoutine で設定したコールバック PASSIVE_LEVEL • Windows のファイアウォールとして設定したプログラムの呼び出し DISPATCH_LEVEL 21
  • 22. 何か意味あるの • これって何か意味あるの? • 上のレベルから下のレベル のコードは直接呼べない。 • 呼ぶとどうなるの IRQL_NOT_LESS_OR_EQUAL でBSoD. • 某R社のドライバで 一時期よくありました( Source IRQL Hardware HIGH_LEVEL クリティカルなエラー POWER_LEVEL 電源周りのエラー IPL_LEVEL プロセッサ間割込 CLOCK2_LEVEL CLOCK1_LEVEL PROFILE_LEVEL プロファイルタイマー DIRQL I/O デバイス割込 Software DISPATCH_LEVEL ディスパッチャ APC_LEVEL 非同期処理APC PASSIVE_LEVEL スレッド実行 22
  • 23. つまり • PASSIVE_LEVEL の例: • 中島くんによる カツオの呼び出し。 • クリティカルではない。 • 何してもとりあえずOK 23
  • 24. つまり • DISPATCH_LEVEL の例 • 波平によるカツオの呼び出し。 • クリティカル。 • 「勉強しろ」というのに 「遊んでいる」と (許可されていない動作) 動作を強制停止させられる (ブルースクリーン) 24
  • 26. 詰まったところ。 • IRQL の問題 • ディスクI/O (ファイル書き込みとかファイル作成とか)が 全部PASSIVE_LEVEL じゃないと呼び出せない。 • でも仕掛けておいたタイマーはDISPATCH_LEVEL! 26
  • 27. どう解決したか • ExQueueWorkItem をDelayedItem を引数にとって動かすと 指定した関数をPASSIVE_LEVEL で呼び出せる! • やった! 27
  • 28. コード void hogeo(int i) { // PASSIVE_LEVEL!! } void main(){ WORK_QUEUE_ITEM item; ExInitalizeWorkItem(&item, hogeo,0); ExQueueWorkItem(&item, DelayedWorkQueue); } 28
  • 29. イメージ • カツオ(実行中のコンテキスト)が 波平の監視下にある(DISPATCH_LEVEL) • 「終わったらお菓子食べるから取っといて」と サザエに依頼する( ExQueueWorkItem ) • 処理が終わった時に、サザエがお菓子を持って現れる (関数のコール) • カツオ、お菓子を食べる(処理の実行) 29
  • 30. コード void hogeo(OKASHI okashi) // サザエによって呼び出される { // PASSIVE_LEVEL!! } void main(){ // ここは波平によって呼び出される WORK_QUEUE_ITEM item; ExInitalizeWorkItem(&item, hogeo,new OKASHI(“塩昆布”)); ExQueueWorkItem(&item, DelayedWorkQueue); // サザエにお菓子を依頼する。 } 30
  • 31. まとめ • カーネルモードドライバは慣れると楽しい • サザエさんのカツオはいつになったら中学生になるのだろう • IRQL は波平さんを思い出そう。 • 困ったらサザエさんを使おう ( ExQueueWorkItem ) • プロ生ちゃんis かわいい 31 Title : Windows のカーネルモード(ry Twitter : @mimura1133