スキップしてメイン コンテンツへ

 locked
WIA ミニドライバーサンプル wiadriverex をデバッグする RRS feed

  • 全般的な情報交換

  • 今回は、Windows Image Acquisition (WIA) ミニドライバーのサンプル EXTENDED WIA 2.0 MONSTER DRIVER (wiadriverex) をデバッグするための手順をご紹介します。

    デバッガーを接続して、各種モジュールのデバッグを行うことで、それぞれのモジュールがどのように連携し、動いているのかイメージがつかみやすくなるかと思います。

    このサンプルは、stream-based WIA 2.0 transfer model を使うWIA 2.0 ミニドライバーのサンプルです。このサンプルには、ミニドライバーである wiadriverex.dll 以外に、以下の 4 つが含まれます。
    • User Interface Extension (拡張 UI) のサンプル (uiext2.dll)
    • Image Processing Filter のサンプル (imgfilter.dll)
    • Segmentation Filter のサンプル (segfilter.dll)
    • Error Handling Driver Extension のサンプル (errhandler.dll)

    以下の3つのドキュメントの図の通り、WIA ミニドライバー(= Vendor User Mode Minidriver)は WIA Service のプロセス空間に存在し、拡張 UIOptional Vendor UI)、Image Processing FilterSegmentation FilterError Handling Driver Extension WIA Application、つまりスキャンを行うアプリケーションのプロセス空間に存在します。

    WIA Architecture Overview

    https://docs.microsoft.com/en-us/windows-hardware/drivers/image/wia-architecture-overview

    Introduction to Image Processing Filters

    https://docs.microsoft.com/en-us/windows-hardware/drivers/image/introduction-to-image-processing-filters

    WIA Error Handling Architecture

    https://docs.microsoft.com/en-us/windows-hardware/drivers/image/wia-error-handling-architecture

    今回は、このサンプルを Windows 10 (1903) x64 にインストールして、[Windows FAX とスキャン] (WFS.exe) WDK のツール WiaPreview (wiapreview.exe) のどのような操作で、どのコードが呼ばれるのかをお見せしたいと思います。以下の手順では、同じ PC で、サンプルをビルドするために、Visual Studio 2019 Windows 10 SDK (10.0.18362.0) for Windows 10, version 1903WDK for Windows 10 Version 1903 がインストールされています。

    1. サンプルの入手

    wiadriverex サンプルは、以下のサイトの右側の緑色の [Clone or Download] ボタンを押すと表示される [Download ZIP] ボタンで Windows-driver-samples-master.zipをダウンロードすると、Windows-driver-samples-master\wia のフォルダにあります。

    https://github.com/Microsoft/Windows-driver-samples

    2. サンプルのビルド

    このフォルダの wia.sln を、Visual Studio 2019 で開きます。Wiadriverex フォルダ以下にそれぞれのプロジェクトがあることを確認できます。


    [ソリューション ‘wia] を右クリックして [構成マネージャー] をクリックします。

    今回は、[アクティブソリューション構成] [Debug][アクティブ ソリューション プラットフォーム] [x64] とします。

    [ソリューション ‘wia] を右クリックして [ソリューションのリビルド] をクリックします。

    これで、wiadriverex.dll, uiext2.dll, imgfilter.dll, segfilter.dll, errhandler.dll ができます。

    次のステップに必要なファイルと場所は以下です。

    ファイル

    場所

    wiadriverex.dll

    wia\wiadriverex\usd\x64\Debug

    uiext2.dll

    wia\wiadriverex\uiext2\x64\Debug

    imgfilter.dll

    wia\wiadriverex\imgfilter\x64\Debug

    segfilter.dll

    wia\wiadriverex\segfilter\x64\Debug

    errhandler.dll

    wia\wiadriverex\errhandler\x64\Debug

    wiadriverex.inf

    wia\wiadriverex

    sample.bmp

    wia\wiadriverex

    • 補足:ビルドエラーが出る場合

    もし「LINK : fatal error LNK1104: ファイル 'MSVCRTD.lib' を開くことができません。」というビルドエラーが出る場合には、以下のことが要因の場合があります。

    例えば、C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.20.27508\lib\x64 MSVCRTD.lib がある一方、任意のプロジェクトのプロパティページを開き、[VC++ ディレクトリ] [ライブラリ ディレクトリ] のドロップダウンリストで <編集> をクリックすると、以下の図のように、lib x64 の間に Spectre というフォルダが入っていることがわかります。

    このような場合、Visual Studio のメニューの [ツール] [ツールと機能を取得] をクリックし、Visual Studio Installer [個別のコンポーネント] タブから、「MSVC v142 VS 2019 C++ x64/x86 Spectre 軽減ライブラリ (v14.20)」にチェックを入れて、[変更] をクリックします。(クリックの前に Visual Studio は終了する必要があります。)

    2019年5月2日 0:05
    所有者

すべての返信

  • 3. サンプルのインストールと動作確認の準備

    上記のファイルを一つのフォルダにコピーします。例えば、C:\wia\wiabin\drivers というフォルダを作って、そこに置きます。

    x64 環境のため、以下のドキュメントに基づいて、テスト署名します。

    Test Signing

    https://docs.microsoft.com/en-us/windows-hardware/drivers/install/test-signing

    以下は全て、ドライバパッケージのある C:\wia\wiabin\drivers フォルダ上で実行するとします。

    (1) テスト証明書を作成します。

    Makecert.exe C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86 にあるので、これを使ってテスト証明書 ContosoTest.cer を作成します。

    コマンドプロンプトから、以下を実行します。

    makecert -r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) ContosoTest.cer

    Certmgr.msc を起動し、[PrivateCertStore] [証明書] に、上記で作成した証明書があることを確認します。

    (2) カタログファイルを作成します。

    Inf2Cat.exe C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86 にあるので、これを使って、wiadriver.inf の以下の「CatalogFile=wiadriver.cat」の記述に基づいて、カタログファイル wiadriver.catを作成します。

    [Version]

    Signature="$WINDOWS NT$"

    Class=Image

    ClassGUID={6bdd1fc6-810f-11d0-bec7-08002be2092f}

    Provider=%ProviderString%

    DriverVer=09/20/2004,1.0.0.7

    CatalogFile=wiadriver.cat

    コマンドプロンプトから、以下を実行します。今回は Windows 10 (1903) x64 にインストールするため、以下の様に /os オプションを指定しています。

    inf2cat /v /driver:C:\wia\wiabin\drivers  /os:10_19H1_x64

    (3) カタログファイルにテスト署名します。

    signtool.exe C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86 にあるので、これを使って、カタログファイル wiadriver.catにテスト署名をします。

    Signtool sign /v /fd sha256 /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.verisign.com/scripts/timstamp.dll wiadriver.cat

    管理者権限のコマンドプロンプトを起動し、「bcdedit -set testsigning on」を実行後、OS を再起動してテストモードにします。

    テスト証明書を localMachine root trustedpublisher に追加します。

    Certmgr.exe C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86 にあります。

    以下を管理者権限のコマンドプロンプトから実行します。

    CertMgr.exe /add ContosoTest.cer /s /r localMachine root

    CertMgr.exe /add ContosoTest.cer /s /r localMachine trustedpublisher

    デバイスマネージャーを起動して、 PC 名など任意のオブジェクトをクリックし、[操作] [レガシ ハードウェアの追加] をクリックします。

    ハードウェアの追加ウィザードが起動したら、[次へ]

    [一覧から選択したハードウェアをインストールする(詳細)] にチェックを付け [次へ]

    [イメージング デバイス] を選択して [次へ]

    [ディスク使用] をクリックし、上述の \wia\wiabin\drivers\ にある wiadriver.inf を選択

    [Extended WIA Monster Device] をインストールします

    以下の様にデバイスが追加されることが確認できます。

    4. サンプルのデバッグ

    4-1. WIA ミニドライバーサンプルのデバッグ

    1. WIA サービスにデバッガ―をアタッチします。

    タスク マネージャーの [サービス] タブで、WIA のサービスである stisvc のプロセス ID を確認します。

    Visual Studio [デバッグ] [プロセスにアタッチ] をクリックします。

    [すべてのユーザーからのプロセスを表示する] のチェックボックスをチェックし、上記のプロセス ID を持つプロセスを選択し、[アタッチ] をクリックします。

    以下のダイアログが表示されたら、[異なる資格情報で再起動] をクリックし、[プロセスにアタッチ] からやり直します。

    2019年5月2日 0:12
    所有者
  • 2. ブレークポイントを設定します。

    Wiadriver.cpp CWIADriver::drvAcquireItemData (1287 行目) にブレークポイントをセットします。

    3. スタートメニューの [Windows アクセサリ] から “Windows FAX とスキャン” を起動します。

    (もしくは、C:\Program Files (x86)\Windows Kits\10\Tools\x64\wiapreview.exe でもよいです。)

    左下の [スキャン] をクリックします。

    4. メニューの下の [新しいスキャン] をクリックすると、スキャンが開始されます。

    5. ドライバーと一緒にインストールした Extension UI モジュール (uiext2.dll) CWiaUIExtension2::DeviceDialog で表示しているメッセージボックスが表示されるので、[OK] をクリックします。

    6. 2 で設定したブレークポイントで止まります。

    4-2. フィルターと拡張 UI サンプルのデバッグ

    ドライバーのデバッグと同じようにデバッガーをアタッチしてデバッグしますが、アタッチするプロセスはアプリケーションになります。

    上の例では、Windows FAX and Scan (WFS.exe) にアタッチします。


    [デバッグ] [ウィンドウ] - [モジュール] ウィンドウを開くと、フィルター DLL などがロードされていることが確認できます。

    Extension UI モジュール (uiext2.dll) CWiaUIExtension2::DeviceDialog などにブレークポイントをセットすると、スキャン開始時に呼び出されることが確認できます。

    2019年5月2日 0:16
    所有者
  • ■ Segmentation Filter

    Segmentation Filter のテストを行う場合 C:\Program Files (x86)\Windows Kits\10\Tools\x64\wiapreview.exe で動作確認できます。

    [デバイスの選択] 画面で Extended WIA Monster Device を選択します。

    Visual Studio [デバッグ] [プロセスにアタッチ] で、wiapreview.exe にアタッチします。

    [New Preview] ボタンを押すとスキャンが開始されます。

    [Detect Regions] ボタンを押すと、Segmentation Filter CSegFitler::DetectRegions が呼ばれます。

    画像の検出結果は以下のようになります。このサンプルでは、画像の位置をハードコードで検出しています。

    2019年5月2日 0:19
    所有者
  • ■ Error Handling Driver Extension

    Wiapreview.exe [Error Handling] メニューから、以下のように [Send Private Error Message (handled by driver error handler)] チェックボックスを有効にします。

    [New Preview] ボタンをクリックすると、wiadriverex.dll IWiaMiniDrvTransferCallback::SendMessage HANDLE_PRIVATE_STATUS_ERROR_1 を通知します。

    Error Handling Driver Extension モジュール (errhandler.dll) では、そのタイミングで ReportStatus メソッドがコールされ HANDLE_PRIVATE_STATUS_ERROR_1 を受け取ります。

    ReportStatus メソッドの中で以下の MessageBox を表示しています。

    上記の内容が、WIA ミニドライバーを開発される方のお役に立てば幸いです。

    WDK サポートチーム

    2019年5月2日 0:22
    所有者