USB Trace

デバイスクラスのデコード

USBTraceは、USB 2.0のデバイスクラスで規定されている、多くのクラス固有の情報を表示する機能があります。 ログと情報ビュー中の、クラス固有のリクエストとディスクリプタの詳しいデコード情報を表示します。
クラスのデコードを有効にするには、対応するクラスデコーダ・プラグインDLL(以下の”クラスデコーダのインストール”のセクションを 参照)をダウンロードする必要があります。 現在サポートされているデバイスクラスは、次のリンクを参照してください。
http://www.sysnucleus.com/usbtrace_cd.html

下の図は、USBTraceでキャプチャされた、ハブクラスを示しています。

下の図は、情報ビューの、デコードされたクラスリクエストです。

クラスデコーダは、クラス固有のデスクリプタと関連データも、デコードして表示する事ができます。
下の図は、USBTraceビデオクラスデコーダを使って、クラス固有の情報を表示しているところです。

クラスデコーダのインストール

USBTraceクラスデコーダは、USBTraceのメインアプリケーションとは別に、インストールする必要があります。 クラスデコーダは、ZIP圧縮されたDLLとして配布されます。

  1. 必要なクラスデコーダを、次のリンクからダウンロードします。
    http://www.sysnucleus.com/usbtrace_download.html
  2. ダウンロードしたファイルを、USBTraceのインストールディレクトリに解凍します。
  3. USBTraceをリスタートします。

マスストレージクラスデコーダ

マスストレージクラスデコーダ(プラグインdll)を使用してマスストレージデバイスクラスに属するUSBデバイスをモニタリングすることができます。 Bulk-Only転送プロトコルをサポートするマスストレージデバイスをモニタリング可能です。

Bulk-Onlyプロトコルのコマンドブロックラッパ (CBW) と コマンドステータスラッパ (CSW) の両方がデコード・表示可能です。

以下のコマンドブロック特定(サブクラスコードに基づく)がサポートされます:

  • SCSI プライマリコマンドセット 2 (SPC2)
  • SCSI マルチメディアコマンドセット 2 (MMC2)
  • SCSI Reduced ブロックコマンドセット (RBC)

以下のイメージは、USBトレースでデコード・表示されたSCSI問い合わせコマンドブロックを示しています。
マスストレージクラスデコーダ

ワイヤレスUSBホストワイヤクラスデコーダ

HWAクラスデコーダ(プラグインdll)を使用してワイヤレスコントローラ/ワイヤレスUSBホストワイヤアダプタ(HWA)クラスに属するUSBデバイスがモニタリング可能です。このデコーダはWUSB、HWAクラス特定リクエストをキャプチャ、デコード、表示します。 以下のタイプのリクエストがデコード・表示されます:

  • クラス特定リクエスト
    • ワイヤアダプタクラス特定リクエスト
    • ホストワイヤアダプタクラス特定リクエスト
  • 通知情報
    • ホストワイヤアダプタ特定通知
    • 転送完了
    • アイソクロナス完了
  • 転送リクエスト
    • 転送コントロール
    • バルク&割り込み転送
    • 転送結果
    • 中断転送
    • アイソクロナス転送

以下の画像は、USBトレースでデコード・表示されたWUSB HWAクラスリクエストを示しています:

HIDクラスデコーダ

ヒューマンインターフェイスデバイス(HID)クラスに属するUSBデバイスが、HIDクラスデコーダ(プラグインdll)を使用してモニタリング可能です。 HIDクラスの具体的なデコードされたリクエスト:

  • レポートを取得
  • Idleを取得
  • プロトコルを取得
  • レポートを設定
  • Idleを設定
  • プロトコルを設定

また、デコーダはインタラプトパイプを通してデバイスから運ばれる非同期データ(HIDレポート)をキャプチャ・表示します。
以下の画像はHIDマウスからUSBトレースを使用してキャプチャされたHIDレポートです:

HUBクラスデコーダ

Hubクラスデコーダ(プラグインdll)を使用してHubクラスに属するUSBデバイスをモニタリング可能です。 このデコーダは、特定USB IOCTLs内部Hubと同様にHubクラス特定のリクエストをモニタリングします。Hub記述子はデバイス情報ビューに表示されます。

デコードされるHubクラスリクエスト:

  • GET STATUS
  • CLEAR FEATURE
  • GET STATE
  • SET FEATURE
  • GET DESCRIPTOR
  • SET DESCRIPTOR
  • CLEAR TT BUFFER
  • RESET TT
  • GET TT STATE
  • STOP TT

以下の内部USB(Hub特定)IOCTLsがモニタリングされます:

  • IOCTL_INTERNAL_USB_RESET_PORT
  • IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO
  • IOCTL_INTERNAL_USB_GET_PORT_STATUS
  • IOCTL_INTERNAL_USB_ENABLE_PORT
  • IOCTL_INTERNAL_USB_GET_HUB_COUNT
  • IOCTL_INTERNAL_USB_CYCLE_PORT
  • IOCTL_INTERNAL_USB_GET_HUB_NAME
  • IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO

以下のイメージは、USBトレースでデコードされ、表示されるHub特定リクエストを示しています。

静止画像キャプチャクラスデコーダ

このクラスデコーダ(プラグインdll)を使用して、静止画像キャプチャデバイスクラスに属するUSBデバイスのモニタリングが可能です。

デコードされたクラス特定リクエスト:

  • キャンセルリクエスト
  • 拡張イベントデータを取得
  • デバイスリセットリクエスト
  • デバイスステータスを取得

また、このデコーダはデジタル静止画デバイスで使用されるPIMA 15740プロトコルをキャプチャ・表示します。 PIMA15740動作、応答、イベントがデコードされ、表示されます。

下の画像は、デジタルカメラからUSBトレースを使用してキャプチャされたPIMA 1570パケットです。

ビデオクラスデコーダ

ビデオクラスデコーダ(プラグインdll)を使用してビデオクラスに属するUSBデバイスのモニタリングが可能です。 このカテゴリに入るデバイスとして、ウェブカム、デジタルカメラコーダ、アナログビデオコンバータ、アナログまたは デジタルテレビジョンチューナー、ビデオストリームをサポートする静止画カメラがあります。 USBビデオクラス特定リクエストとデータをキャプチャ、デコードし、表示します。 ビデオコントロール(VC)とビデオストリーム(VS)の両方をサポートします。USBビデオクラス規格のバージョン1.0と1.1をサポートします。

キャプチャされるリクエストの種類:

  • ビデオコントロール(VC) リクエスト
    • インターフェイスコントロールリクエスト
      • パワーモードコントロール
      • エラーコードコントロールのリクエスト
    • ユニットとターミナルコントロールのリクエスト
      • カメラターミナルコントロールリクエスト
      • セレクタユニットコントロールリクエスト
      • ユニットコントロールの処理リクエスト
      • 拡張ユニットコントロールリクエスト
  • ビデオストリーム(VS)リクエスト
    • インターフェースコントロールリクエスト
      • ビデオプローブとコミットコントロール
      • ビデオ静止プローブと静止コミットコントロール
      • 同期ディレイコントロール
      • 静止画トリガーコントロール
      • キーフレーム生成コントロール
      • フレームセグメント更新コントロール
      • エラーコードのストリームコントロール

さらに、クラス特定リクエストのキャプチャで、ビデオデコーダはビデオと静止画 ペイロードデータ(バルクとアイソクロナス)もキャプチャします。

以下のイメージはUSBトレースでデコード、表示されたビデオリクエストパケットです。

ベンダークラスデコーダ

ベンダークラスデコーダを使用して、ベンダー独自のUSBデバイスクラスに属するデバイス(クラスコード:0xFF)用に カスタムデバイスクラスデコーダを書くことができます。
この機能を実行するには以下の2ステップを行ってください:

  1. ベンダー独自クラスデコーダDLLをダウンロード (ダウンロード)
  2. カスタムデバイスクラスデコーダDLLを書く (サンプルコードのダウンロード)

上記2つのDLLはUSBトレースのインストールディレクトリにコピーして使用してください。

Step1: ベンダー独自クラスデコーダをダウンロード

こちらよりベンダー特定クラスデコーダをダウンロードすることができます。 VendorDecoder.dll をUSBトレースのインストールディレクトリに解凍して下さい。(例:\Program Files\USBTrace\)

Step2: DLLカスタムデバイスクラスデコーダを書く

以下の2つのエクスポートされた関数が実装されたウインドウズDLLを書きます。

テスト済みのカスタムデバイスクラスデコーダ・サンプルコードを是非ダウンロードしてご利用下さい。 このサンプルを編集して、任意のデバイスクラスデコーダを実装することができます。

リクエスト名を取得

BOOL GetReqName([IN] UCHAR bmRequestType, [IN] UCHAR bRequest, [IN] USHORT wValue, [IN] USHORT wIndex, [IN] PVOID pData, [IN] ULONG nDataLen, [OUT] PCHAR sReqName, [IN] USHORT reqNameLen);

この関数で、受けたリクエストの名前を返さなければなりません。(例:"SetPortDetails")名前はsReqName パラメータ内に収めます。 bmRequestType, bRequest, wValue, wIndexといったリクエスト詳細はUSB規格(セットアップパケット8バイト)の通りです。 リクエストデータとデータ幅(pData, nDataLen)も与えられます。reqNameLenはsReqNameバッファの幅を特定します。

提供するリクエスト名がログビューに表示されます。(USBトレースキャプチャデータリスト)

リクエスト情報を取得

この関数でリクエスト情報の詳細を返さなければなりません。

BOOL GetReqInfo([IN] UCHAR bmRequestType, [IN] UCHAR bRequest, [IN] USHORT wValue, [IN] USHORT wIndex, [IN] BOOL in, [IN] PVOID pData, [IN] ULONG nDataLen, [OUT] PCHAR sInfoString, [IN][OUT] PUSHORT pInfoStringLen);

リクエスト情報の詳細は以下のフォーマットのsInfoString パラメータに書き込みます:

"<header>;<param1>=<value1>;<param2>=<value2>"

Example: "VENDOR_SEND_COMMAND;Command Code=0x21;Control=CT_NONE"

追加情報ビューに表示されます。

pInfoStringLen は、sInfoStringの幅を示します。 与えられたpInfoStringLenが十分でない場合は、 同じ変数で要求された幅を提供する関数は機能しません。

DLL名は vsdecoder.dllです。このDLLはvendordecoder.dllと共に、USBトレースのインストールディレクトリにコピーされる必要があります。 詳細は、サンプルDLLソースコードをご覧下さい。

USBモニタリングソフトウェアの違い

HHD USBモニタUSBTraceは、 どちらもUSBのモニタを行うソフトウェアですが、それぞれのソフトウェアは、以下のような違いがあります。
詳しい説明は、それぞれのソフトウェアのページをご参照ください。

  • usbdi.sysの通信をモニタするため、ハードウェアのUSBアナライザに近い使い勝手
  • マスストレージデバイスなどのパケットの解析を行える
  • シリアルモニタやネットワークモニタとおなじ操作性のため、USBに限らず、PC上の様々な通信をモニタしたい場合は、使い勝手が良い
  • 廉価なライトエディションから、フル機能のプロフェッショナル版まであるため、選択範囲が広い
  • USBアナライザになれた方・USBデバイスの開発者や、USBデバイスのアプリケーション開発者には使いやすいツールです。
  • フィルタドライバを使用しないため、デバイスのエナムレーションから解析可能
  • フィルタドライバを使用しないため、PnPシステムを妨害しない
  • トリガやフィルタの設定が可能
  • URBのキャプチャの他、USB IOCTL、PnP、Power IRPもキャプチャ可能
  • キャプチャしたログをリクエストのタイプとリクエストのバッファ内容で検索できる高度な検索機能
  • USBドライバの開発者向けのツールと考えられます。

どちらの製品も、それぞれ特徴のある製品ですので、用途に応じて使い分けてください。
また、どちらも試用期間がありますので、まずはそれぞれの機能をお試し下さい。