汎用PCIeドライバのVista対応(?)
特電PCI ExpressボードをVistaで動かそうとしたところ、割り込みが受け取れない(したがってDMAの完了がわからない)という現象が起きました。
現在のVersion0.7β2では、ハードウェアが割り込みを発生させると、ドライバの中の割り込み処理ルーチンがイベントを発生させ、それをユーザモードのDLLで受け取るということをしています。
具体的には、割り込みのセットアップルーチン(ドライバ内)で、
UNICODE_STRING name ;
RtlInitUnicodeString (&name, L"\\BaseNamedObjects\\TkdnPcieIsr") ;
dx->UserIsrEvent = IoCreateNotificationEvent (&name, &dx->UserIsrHandle) ;
とやって、イベントを作ります。
そして、DLLの中(ユーザモード)で、
Intstr->hIsrEvent = OpenEvent(SYNCHRONIZE, FALSE, "TkdnPcieIsr");
とやれば、割り込みを受け取ることができるはずです。
このBaseNamedObjects\\というが曲者で、これを頭に付けてカーネルモードせ作成しておくと、ユーザモードでBaseNamedObjects\\を外した名前でアクセスできるというものです。これはPCIデバッグライブラリでも使われている方法です。
WindowsXPでは、これでうまくいっていたのですが、Windows Vistaではできなくなっていました。しかし、
HANDLE hTmp = CreateEvent(NULL, FALSE, FALSE, "TkdnPcieIsr");
Intstr->hIsrEvent = OpenEvent(SYNCHRONIZE, FALSE, "TkdnPcieIsr");
と、CreateEventをやるとうまくいきます。
WindowsXPまではCreateEventをやらなくてもよかったのに。本当はやるべきなのか、やらないべきなのか・・・
うーん。謎。
一応、Vistaでも割り込み駆動でイベントを発生させて、ユーザーモード受け取ることができました。
| 固定リンク
コメント