Kernel PlugIn は無料ですか? 使用するのにライセンスは必要ですか?
Kernel PlugIn は、WinDriver ツールキットに付属されています。
追加のライセンスを購入する必要はありません。
Kernel PlugIn のプロジェクトをビルドするのに Microsoft の DDK は必要ですか?
Kernel PlugIn を使用して、SYS ドライバ (Windows XP/2k/NT または Windows Me/98
の場合) を開発する場合、SYS ファイルをリンクするために WinNT/2000/XP DDK の ntoskrnl.lib
ファイルが必要です。そのため対象の OS に Microsoft 社の DDK をインストールする必要があります。Microsoft
社の DDK ライブラリに関する詳細情報は以下を参照してください: http://www.microsoft.com/whdc/devtools/ddk/default.mspx
[注意: DDK を使用して、Kernel PlugIn ドライバをビルドするには、BASEDIR または
DDKROOT 環境変数を設定する必要があります。WinDriver のユーザー マニュアルおよび FAQ
を参照してください]。
Kernel PlugIn を使用して、VxD ドライバ (Windows 98/Me) を作成する場合には、ドライバをビルドするために
Microsoft 社の DDK をインストールする必要はありません。ただし、作成した Kernel PlugIn アプリケーションに
DDK 関数を呼び出しを追加する場合には、必要です。[注意: OS 独自の DDK 関数を使用すると、ドライバの互換性が損なわれます]。
1 秒間 (一般的に) に期待できる割り込みの回数はいくつですか?
WinDriver の Kernel PlugIn 機能を使用すると、割り込みを一つもミスせずに、1 秒間に 100,000
以上の割り込みを処理できます。
Kernel PlugIn 割り込み処理コードのサンプルでは、DriverWizard を使用して、デバイスのコードを生成
(PCI デバイスの場合、コードを生成する前に Winzard で割り込みをクリアするためにデータを定義します) するか、カーネルでの
ISA の割り込み処理のサンプル Kernel PlugIn KPTEST コード - WinDriver\kerplug\kermode\kptest.c
- を参照にします。
ユーザー モードでは、1 秒間におよそ 5,000-10,000 の割り込みを処理できます。しかし、Windows は
Real Time OS ではないので、割り込みをミスする可能性があります (ただし、割り込みをミスした際に、ミスした回数を
WinDriver はお知らせします)。
WinDriver を使用した割り込み処理の説明は、テクニカル
ドキュメント #48 を参照してください。
ドライバ コードは常に物理メモリ内でロックされますか?
はい。
カーネルでロックされたメモリをどのように割り当てますか
(Kernel PlugIn 割り込みルーティン内から使用可能)?
WinDriver は、カーネル モードのメモリの割り当てに malloc()
および free() を実装します (テクニカル
ドキュメント #34 を参照してください)。割り当てたメモリをロックするので、Kernel PlugIn 割り込みルーティンでこのメモリを使用することもできます。
ユーザー モードおよび Kernel PlugIn アプリケーション間でメモリを共有することもできます。テクニカル
ドキュメント #41 を参照してください。
Kernel PlugIn で割り込みを処理する際に、ユーザー モードで割り込みハンドラーを削除することはできますか?
はい - ユーザー モードの割り込みハンドラー ルーティンを削除することができます。
また、Kernel PlugIn で割り込み処理のいくつかを実装でき、そして残りのいくつかをユーザー モードで実装できます。KP_IntAtDpc()
の戻り値が、ユーザー モードの割り込みハンドラー ルーティンを実行する回数となります。
Kernel PlugIn 機能を使用して、VxD または SYS ドライバ
ファイルを作成できますか?
Kernel PlugIn を使用して、add-on VxD/SYS/o カーネル ドライバ (OS によって異なります)
を作成して、必要に応じて WinDriver の機能を拡張します。作成した Kernel PlugIn ドライバは、スタンド
アロンではありません - 有効にするユーザー モードのドライバとのみ動作します。
[注意: WinDriver の Kernel PlugIn 機能を使用する際には、windrvr6.sys/vxd/o
または windrvr.sys/vxd/o ドライバ モジュールをインストールする必要があります
(OS および WinDriver のバージョンによって異なります)]。
WinDbg などのカーネル デバッガを使用して、参照することができる
Kernel PlugIn からのデバッグ情報をどのように出力しますか?
WinDriver の Debug
Monitor ユーティリティのデバッグ情報をカーネル デバッガへ送信することができます - テクニカル
ドキュメント #44 を参照してください。WinDriver の WD_DebugAdd()
API (v5.03 およびそれ以降) を使用して、Kernel PlugIn (またはユーザー モード) のコードから
Debug Monitor へデバッグ メッセージを出力できます (必要に応じて、カーネル デバッガへ直接情報を送信することもできます)。ユーザー
モードまたは Kernel PlugIn 関数内から WD_DebugAdd()
を呼びことができます (KP_IntAtIrql()
も含まれます)。
Kernel PlugIn コードの内側から KdPrint()
(Windows NT/2K/XP の場合) または DbgPrint()
(Windows 98/Me/NT/2K/XP の場合) の呼び出しを追加することもできます。DDK 関数は、カーネル
デバッガで出力内容を参照することができます。
作成したアプリケーションの close 処理で PC がハングします。
WD_IntDisable() で失敗しています。何が原因でしょうか?
Kernel PlugIn を使用して、割り込みを処理しています。
この現象は、Kernel PlugIn から割り込みを有効にし、割り込みを無効にするためにユーザー モードから同時に WD_IntDisable()
を呼ぶ際に起きます。割り込みが有効 (Kernel PlugIn から有効にした) だったので、WD_IntDisable()
で割り込みを無効にできず、WD_IntDisable()
への戻りを待っている間に PC がハングします。
有効な解決策としては、アトミック操作として WD_IntDisable()
を呼びます。それによって、Kernel PlugIn 割り込みルーティンが割り込みを有効にする前に割り込みの無効に成功します。
Kernel に Kernel PlugIn モジュールを挿入すると
(insmod を使用)、多くの unresolved symbols エラーが発生します。
FAQ を参照してください。
SYS/VxD ファイルに新しい関数を記述する場合、 __cdecl
を使用して宣言する必要がありますか?
いいえ。WinDriver が使用する callback のみが __cdecl
として宣言する必要があります。
戻る