|
|
 |
| 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 コードを参照することもできます]。 |
|
|