テクニカル ドキュメント #40



Doc ID: 40
製品: WinDriver
Version:  --

Kernel PlugIn の割り込みハンドラで、どのように WD_Transfer() を呼びますか?

ハードウェアへアクセスするには、KP_IntAtIrql() または KP_IntAtDPC() から WD_Transfer() を呼びます。

Kernel PlugIn 割り込み関数から直接、メモリ/IO にアクセスできます。[直接メモリにアクセスする場合、cardReg.Card.Item[i].I.Mem.dwTransAddr の WD_CardRegister() から戻るメモリのカーネル マップを使用してください]。

WD_Transfer() を呼ぶ際には、WinDriver へのハンドル (hWD) を最初の引数として渡す必要があります。Kernel PlugIn 内から WinDriver へのハンドルの取得方法に関しては、テクニカルドキュメント #38 を参照して下さい。

上記のテクニカルドキュメントの説明のとおり、グローバル Kernel PlugIn 変数 (推奨) で WinDriver へのハンドルを保存することができ、また、それをある関数から他に渡すことができます。以下が KP_Open() から KP_IntAtIrql() へ WinDriver へのハンドルを渡す例です:

KP_Open() に以下の行を追加 :
*ppDrvContext = (PVOID) hWD;
KP_IntEnable() に以下の行を追加 :
*ppIntContext = pDrvContext;
ここで、KP_IntAtIrql() 内から memory/IO にアクセスするために WD_Transfer() を使用することができます。I/O アクセスの例:

HANDLE hWD = (HANDLE) pIntContext;
WD_TRANSFER trans;
BZERO(trans);
trans.cmdTrans = WP_BYTE;
trans.dwPort = 0x378;
trans.Data.Byte = 0x65;
WD_Transfer(hWD, &trans);

これは、割り込みでポート 0x378 に 0x65 を書き込みます。hWD ハンドルは KP_Open() から KP_IntEnable() および KP_IntAtIrql() に渡されます。
[WinDriver v5.20 以降では、コード生成をする前に、割り込みの検知に対するレジスタを定義し配置するために DriverWizard を使用して供給された KP_IntAtIrql() から WD_MultiTransfer() を呼ぶ例として、生成された DriverWizard Kenrl PlugIn コードを参照することもできます]。