1

スマートカード UMDF Windows ドライバーを開発しています。次の動作を実現したいと思います。

API 呼び出しSCardListReadersを使用して接続されているすべてのリーダーを一覧表示するときに、接続されている各リーダーの正しいフレンドリ名を取得したいと考えています。たとえば、同じブランドのリーダーが 2 つある場合、ドライバーからこれが返されるようにします。

SmartcardBrand USBReader 0
SmartcardBrand USBReader 1

フレンドリ名は属性SCARD_ATTR_VENDOR_NAMEで構成されてSCARD_ATTR_VENDOR_IFD_TYPEおりSCARD_ATTR_DEVICE_UNIT、ドライバーが返されることを知っています。

SmartcardBrand USBReader 0私の質問は、私のドライバーでは、どうすればとを区別できSmartcardBrand USBReader 1ますか?

要求されたときに OS に何を返すかSCARD_ATTR_DEVICE_UNIT。新しいリーダーが接続されるたびに、新しい UMDF ホスト プロセスが起動され (タスク マネージャーで確認できます)、別の新しいメモリ領域が作成されるため、ドライバーでグローバル静的変数を使用してインクリメントすることはできません。

UMDF ドライバーでデバイス インスタンスをカウントする適切な方法は何ですか?


メモリ マップト ファイルを使用して問題を解決しました。基本的に、ドライバーの各 UMDF プロセスは、リーダーのフレンドリ名の名前を持つメモリ マップト ファイルを作成します。他のプロセスが同じ名前のファイルを作成しようとすると、ドライバーが既に実行されていることを示します。

ただし、自分のドライバーを使用するリーダーを接続し、その後 Windows ネイティブ ドライバーを使用するリーダーを接続すると、矛盾が生じます。Windows ドライバーは、私が作成したメモリ マップト ファイルを認識せず、そのデバイスにインデックス 0 を適用します。

Windows ドライバーが読み込まれるとSCARD_ATTR_VENDOR_IFD_TYPE、 、SCARD_ATTR_VENDOR_IFD_TYPEおよびSCARD_ATTR_DEVICE_UNIT私のドライバー (および現在読み込まれている他のすべてのドライバー) からクエリを実行することがわかりました。このようにして、Windowsドライバーはどのデバイスユニットが使用されているかを認識し、空いているユニットをリーダーに適用できると思います。

4

0 に答える 0