« Vostro220sでのPCI Express(続き) | トップページ | JTAG小冊子発送、1日目の分 »

2009.11.26

WDMデバイスドライバの排他制御

1台のパソコンでMITOUJTAG Proを複数立ち上げて、複数のラインの基板の検査をしたいというお客様がいらっしゃいました。

MITOUJTAGを複数起動できるようにするのは難しくないのですが(逆に今はミューテックスで複数起動しないようにしている)、複数のMITOUJTAGが1つのPocket JTAG Cableをアクセスすると良くないので、デバイスドライバ部分で排他制御しようと考えました。

まず、CreateFileの各種フラグを設定しても効果はありません。

なので、カーネルモードプログラムの中で何かをしてやらねばなりません。CreateFileでデバイスドライバをオープンした際、ドライバの中ではIRP_MJ_CREATEのディスパッチルーチンが呼び出されますが、このディスパッチルーチンは戻り値でSTATUS_UNSUCCESSFULを返しても、CreateFileは失敗しないようです。
つまり、CreateFileはINVALID_HANDLE_VALUEを返さずに、ドライバは正常にオープンできてしまいます。これはハマりました。

簡単に排他制御するならば、DEVICE_OBJECTにDO_EXCLUSIVEというフラグがあるので、これを設定すればよいようです。しかし、2回目以降のCreateFileで必ず失敗し、1回目は成功するので、きめ細かい制御はできません。

いろいろ試行錯誤した結果、CreateFileを失敗させるには、IRP_MJ_CREATEのディスパッチルーチンの中で、
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
IoCompleteRequest (Irp,IO_NO_INCREMENT);
と、IoStatus.StatusにSTATUS_UNSUCCESSFULを設定すればよいようです。

あとは、DEVICE_EXTENSIONに、現在のこのデバイスがオープンしているかどうかを保持するフラグを持たせて、オープンしていたらIRP_MJ_CREATEを失敗させれば排他制御が実現できます。
これで、きめ細かく状況に応じてオープンさせないということができるようになります。

いまは先にオープンしたPocket JTAG Cableが0番、次にオープンしたPocket JTAG Cableが1番、としていますが、シリアル番号か何かでオープンするのを制御できるようにすれば、使い分けができるようになるはずです。

Mitoujtag_multi


|

« Vostro220sでのPCI Express(続き) | トップページ | JTAG小冊子発送、1日目の分 »

コメント

コメントを書く



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




« Vostro220sでのPCI Express(続き) | トップページ | JTAG小冊子発送、1日目の分 »