Windows 7 Sensor Driverを作ろう - その3

このシリーズ、あまり見られていないようですが・・・めげずに三回目です。

 さて、今回は、ドライバーの非同期通知の部分です。

アプリケーション側の動きを思い出してください。(って、このブログでは解説してないや。https://msdn.microsoft.com/ja-jp/windows/ff432760.aspx を参照あれ)

SensorのCOM APIを使う場合、非同期通知を受けるには、ISensorEventsを実装するクラスを定義し、そのインスタンスを一つ作成して、ISenosrインスタンスのSetEventSinkメソッドをコールするのでした。そうしておくと、ISensorEventsのOnNancharaというメソッドがコールバックされる、という流れになっています。
デバイスドライバー側では、ISensorのSetEventSinkがコールされたときにISensorDriverのOnClientSubscribeToEventsがコールされます。
このメソッドがコールされたときに、非同期通知を待っているクライアントがあることを記憶して置きます。

同期的にセンサーを取り出す場合には、対応するメソッドがコールされた時点で、デバイスにアクセスしてデータを取り出せばよいのですが、非同期の場合は、デバイスからのデータが更新された時に、ドライバー側から能動的に更新されたデータをOS(を通じてアプリケーション)に通知する必要があります。
OSへの通知は、ドライバーが初期化されるときに渡されているISensorClassExtentionのメソッドをコールすることによってアプリケーションに通知が行きます。ISensorClassExtensionには、PostEventメソッドと、PostStateChangedメソッドが用意されていて、各メソッドをドライバー内でコールすると、それぞれ、ISensorEventsのOnDataUpdatedメソッド、OnStateChangedメソッドがコールバックされます。ちなみに、ISensorClassExtensionインスタンスは、OSが用意しているCOMオブジェクトなので、

CComPtr<ISensorClassExtension> pClassExtension;hr = CoCreateInstance(    CLSID_SensorClassExtension,    NULL,    CLSCTX_INPROC_SERVER,    __uuidof(ISensorClassExtension),    (VOID**)&pClassExtension);

で、取り出すことができます。
前の回でも説明したとおり、Sensor Driverは、UMDFなので、ここで供給するセンサーデータは様々な方法で取り出せます。Sensor Development Kitでは、WDFIoRequestを使ったHIDデバイスを使った方法で、通信を行っています。
他にも、COMポートからのデータ読み込みや、Socketからのデータ受信、DPWS(Device Profile For Web Service:ローカルネットワーク向けアドホックWeb Service)によって接続したデバイスからのデータ受信(TechEd2009 BoFで実演)、等々、様々な方法が可能です。
更には、COM Interopを使い、Managed Codeでライブラリーを用意しておいて、データを供給することすら可能です。

これで、That's All Folksです。

最後に、Visual StudioでSensor Driverの実行中ソースレベルデバッグの方法を紹介して終わりにします。
User Mode Device Driverは、WUDFHost.exeがホストしています。なので、Visual Studioのメニューから”デバッグ”→”プロセスにアタッチ”で、このプロセスを探し、アタッチすれば、ソースコードを持っているドライバーに対して、通常のアプリケーションと同様にデバッグができます。