« お伊勢さんにお参りしてきました | トップページ | DDKのバージョンとVistaでの動作の問題 »

2010.04.14

汎用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でも割り込み駆動でイベントを発生させて、ユーザーモード受け取ることができました。

|

« お伊勢さんにお参りしてきました | トップページ | DDKのバージョンとVistaでの動作の問題 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« お伊勢さんにお参りしてきました | トップページ | DDKのバージョンとVistaでの動作の問題 »