• 検索結果がありません。

Kernel PlugIn の構造

ドキュメント内 WinDriver v11.70 ユーザーズ ガイド (ページ 110-114)

第 9 章 実行に当たっての問題

11.5 Kernel PlugIn の構造

11.5.1 構造の概要

ユーザーモードで記述したドライバは、デバイスにアクセスする際に WinDriver の関数 (WDC_xxx および/

または WD_xxx) を使用します。ユーザーモードで実装され、カーネル レベルのパフォーマンスの達成が必 要な関数 (割り込みハンドラなど) の場合、WinDriver の Kernel PlugIn に移します。通常、ユーザーモードと Kernel PlugIn の両方で同じ WinDriver API をサポートしているので、コードの修正をせずに、ユーザーモー ドからカーネルへ WDC_xxx / WD_xxx 関数呼び出しを使用するようにコードを移行できます。

図 11.1: KernelPlugIn の構造 アプリケーション ( YourApp.EXE )

ドライバ コード

WinDriver ユーザーモード ライブラリ

(WinDrvr.h)

WinDriver カーネル (WinDrvr.VXD、

WinDrvr.SYS) WinDriver

Kernel PlugIn 関数

KP_Init() KP_Open() KP_IntAtIrq() KP_IntAtDpc()

KP_Call() KP_Close()

Kernel PlugIn

I/O 割り込み 割り込み処理

メッセージ 受け渡し WinDriver コンポーネント

記述するコンポーネント

ユーザー モード カーネル モード

ハードウェア アプリケーション

( YourApp.EXE )

ドライバ コード

WinDriver ユーザーモード ライブラリ

(WinDrvr.h)

WinDriver カーネル (WinDrvr.VXD、

WinDrvr.SYS) WinDriver

Kernel PlugIn 関数

KP_Init() KP_Open() KP_IntAtIrq() KP_IntAtDpc()

KP_Call() KP_Close()

Kernel PlugIn

I/O 割り込み 割り込み処理

メッセージ 受け渡し WinDriver コンポーネント

記述するコンポーネント

ユーザー モード カーネル モード

ハードウェア

11.5.2 WinDriver のカーネルと Kernel Plugin の相互作用

WinDriver のカーネルと WinDriver の Kernel PlugIn は次の 2 種類の相互作用があります:

1. 割り込み処理: WinDriver が割り込みを受信すると、ユーザーモードの割り込みハンドラをデフォルトで 有効にします。しかし、割り込みを Kernel PlugIn ドライバが処理するように設定し、WinDriver が割り込 みを受信すると、Kernel PlugIn ドライバのカーネルモードの割り込みハンドラを有効にします。Kernel

PlugIn の割り込みハンドラは、基本的に Kernel PlugIn へ移動する前に、ユーザーモードの割り込み

ハンドラで記述およびデバッグしたコードと同様ですが、ユーザーモードのコードの一部を編集する必 要があります。KernelPlugIn で割り込みの検知および処理を行うコードを再記述し、KernelPlugIn の柔 軟性を有効にします (セクション 11.6.5 を参照してください)。

2. メッセージ受け渡し: カーネルモードで関数を実行する場合 (I/O 処理関数など)、ユーザーモードのド ライバは WinDriver の Kernel PlugIn に「メッセージ」を渡します。このメッセージは特定の関数にマップ され、カーネル内で実行されます。この関数はユーザーモードで開発されたものと同じコードが含まれ ます。

ユーザーモード アプリケーションから Kernel PlugIn ドライバへメッセージを使用してデータを渡すことも できます。

11.5.3 Kernel Plugin コンポーネント

Kernel PlugIn の開発サイクルを終了すると、作成したドライバは以下のコンポーネントを持つことになります:

 WDC_xxx / WD_xxx API 関数で記述されたユーザーモード ドライバ アプリケーション(<アプリ ケーション名>/.exe)。

 WinDriver カーネル モジュール - windrvr6.sys/.o/.ko (OS に依存)。

 カーネル レベルへ移動したドライバ機能を含む WDC_xxx / WD_xxx API 関数で記述された Kernel PlugIn ドライバ (<Kernel PlugIn ドライバ名>/.sys/.o/.ko/.kext)

11.5.4 Kernel PlugIn イベント シーケンス

以下、Kernel PlugIn で実装できるすべての関数の一般的なイベント シーケンスです:

11.5.4.1 ユーザーモードから Kernel PlugIn ドライバへのハンドルを開く

イベント / コールバック 備考

イベント:

Windows は Kernel PlugIn ドライバをロードしま す。

このイベントはブート時にダイナミック ロードにより行 われるか、またはレジストリからの指示として行われ ます。

コールバック:

KP_Init() Kernel PlugIn ルーチンを呼び出し ます。

KP_Init() が WinDriver に KP_Open() ルー チンの名前を知らせます。Kernel PlugIn ドライバへ のハンドルを開くユーザーモードのリクエストがある 場合、WinDriver は関連するオープン ルーチンを 呼びます。

イベント:

ユーザーモード ドライバ アプリケーションは次の 関数のいずれか一つを呼んで、Kernel PlugIn ド ラ イ バ へ ハ ン ド ル を リ ク エ ス ト し ま す - WDC_KernelPlugInOpen() 関 数 、 WDC_xxxDeviceOpen() 関数 (PCI / PCMCIA / ISA – Kernel PlugIn ドライバの名前と一緒に)、

WD_KernelPlugInOpen() 関数 (低レベルの WinDriver API を使用する場合)。

コールバック:

関連する KP_Open() Kernel PlugIn コールバッ ク ルーチンを呼び出します。

KP_Open() コ ー ル バ ッ ク を 使 用 し て 、Kernel PlugInドライバで実装したすべてのコールバック関 数の名前の WinDriver を通知し、必要に応じて、

Kernel PlugIn ドライバを起動します。

11.5.4.2 Kernel PlugIn からのユーザーモード要求処理

イベント / コールバック 備考

イベント:

アプリケーションは WDC_callKerPlug()、ま たは 低レベルの WD_KernelPlugInCall() 関数を呼び出します。

ア プ リ ケ ー シ ョ ン は WDC_CallKerPlug() / WD_KernelPlugInCall() を 呼 び 出 し 、 (Kernel PlugIn ドライバの) カーネルモードでコード を実行します。アプリケーションは Kernel PlugIn ド ライバへメッセージを渡します。 Kernel PlugIn ドラ イバは送られたメッセージに従って実行するコード を選択します。

コールバック:

KP_Call() Kernel PlugIn ルーチンを呼び出し ます。

KP_Call() はユーザーモードより渡されたメッ セージに従ってコードを実行します。

11.5.4.3 割り込み処理の有効化/無効化および高い割り込み要求レベルの処理

イベント / コールバック 備考

イベント:

アプリケーションは fUseKP 引数に TRUE を設定 し て WDC_IntEnable() を 呼 ぶ か (Kernel PlugIn で デ バ イ ス を 開 い た 後)、 ま た は 、

KernelPlugIn ドライバへのハンドルでより低レベ

ル な InterruptEnable() ま た は WD_IntEnable()関数を呼びます (関数へ渡 さ れ た WD_INTERRUPT 構 造 体 の hKernelPlugIn フィールドに設定)。

コールバック:

KP_IntEnable() Kernel PlugIn ルーチンを呼 び出します。

この関数には Kernel PlugIn の割り込み処理に必 要な初期化設定を含めてください。

イベント:

ハードウェアが割り込みを発生します。

コールバック:

高い IRQL の Kernel PlugIn の割り込みハンド ラ ルーチン - KP_IntAtIrql() (レガシー 割り込み) または KP_IntAtIrqlMSI() (MSI / MSI-X) を呼び出します。

KP_IntAtIrql() とKP_IntAtIrqlMSI() は 高い優先度で実行されるため、基本的な割り込み 処理 (割り込みを確認するために、レベル センシ ティブ割り込みの HW 割り込みシグナルを下げる など) だけを実行します。

よ り 多 く の 割 り 込 み 処 理 が 必 要 な 場 合 、 KP_IntAtIrql() (レガシー割り込み) または KP_IntAtIrqlMSI() (MSI / MSI-X) で は

TRUE を返し、関連する割り込み遅延処理ハンドラ

(KP_IntAtDpc() ま た は

KP_IntAtDpcMSI()) で追加の処理を遅延処 理することができます。

イベント:

割り込みが Kernel PlugIn で有効になっている場 合 (割り込みを有効にするイベントの詳細を参 照) 、アプリケーションは WDC_IntDisable() を 呼 び 出 す か 、 ま た は 、 低 レ ベ ル の InterruptDisable() ま た は WD_IntDisable() 関数を呼び出します。

コールバック:

KP_IntDisable() Kernel PlugIn ルーチンを 呼び出します。

この関数は KP_IntEnable() コールバックによ り割り当てられたメモリを解放します。

11.5.4.4 割り込み処理 – 遅延処理の呼び出し

イベント / コールバック 備考

イベント:

Kernel PlugIn の高い IRQL の割り込みハンドラ -

KP_IntAtIrql() ま た は

KP_IntAtIrqlMSI() が TRUE を返します。

カーネルで DPC (Deferred Procedure Call) として追 加の割り込み処理が必要であることを WinDriver へ 通知します。

コールバック:

Kernel PlugIn の DPC 割 り 込 み ハ ン ド ラ - KP_IntAtDpc() (レガシー割り込み) または KP_IntAtDpcMSI() (MSI / MSI-X) を呼び出 します。

残りの割り込みコードを処理しますが 、高い IRQL 割り込みハンドラよりは優先度が低いです。

イベント:

DPC 割り込みハンドラ - KP_IntAtDpc() また

は KP_IntAtDpcMSI() は 0 よりも大きい値を 返します。

WinDriver に追加のユーザーモードの割り込み処

理が必要であることを通知します。

コールバック:

WD_IntWait() を戻します。

ユーザーモードの割り込みハンドラ ルーチンを実 行します。

11.5.4.5 Plug-and-Play およびパワーマネージメント

イベント / コールバック 備考

イベント:

アプリケーションは、fUseKP 引数に TRUE を設 定 し て WDC_EventRegister() を 呼 ん で、

Kernel PlugIn ドライバを使用して、Plug-and-Play およびパワー マネージメントの通知を受け取るよ うに登録します (Kernel PlugIn でデバイスを開い た後)。または、Kernel PlugIn ドライバへのハンド ルでより低レベルな EventRegister() または WD_EventRegister() 関数を呼び出します (関 数 に 渡 さ れ た WD_EVENT 構 造 体 の hKernelPlugIn フィールドに設定)。

イベント:

Plug-and-Play またはパワー マネージメント イ

ベントが発生します。

コールバック:

KP_Event() Kernel PlugIn ルーチンを呼び出 します。

KP_Event() は、発生したイベントに関する情報 を受け取り、必要に応じて、イベントの処理を開始 します。

イベント:

KP_Event() は TRUE を返します。

イベントもユーザーモード アプリケーションで処理 する必要があることを WinDriver に通知します。

コールバック:

WD_Intwait() を返します。

ユーザーモードのイベント ハンドラ ルーチンを実 行します。

ドキュメント内 WinDriver v11.70 ユーザーズ ガイド (ページ 110-114)