よくある質問(FAQ)

WinDriver デバイスドライバー開発ツールキットに関する技術的な質問と回答

Tip: お探しの回答が見つからない場合は、テクニカルドキュメント(KB)も参照してください。
一般 評価・購入 PCI / PCIe USB デバッグ Kernel PlugIn 割り込み DMA Linux Windows

該当する Q&Aが見つかりませんでした。キーワードを変更してみてください。

デバイスドライバーとは、ハードウェアをコントロールするソフトウェアモジュールです。WinDriver を使用すると、WinDriver の低レベルなカーネルドライバー(windrvr6.sys 等)を利用して、このコードをユーザーモードで記述できます。したがって、ドライバー開発の深い知識は必要ありません(WinDriver アーキテクチャ参照)。
また Kernel PlugIn 機能により、ユーザーモードで開発したコードをカーネルモードに移行することもできます(PCI/ISA の場合)。
作成したコードがユーザーモードであれカーネルモードであれ、ハードウェアをコントロールするものであれば、それはドライバーです。

WinDriver を使用することで次の利点があります。
  • コスト削減:開発工数を最大 90% 削減できます。
  • 信頼性:数千項目に及ぶテストを実施済み。開発時間とデバッグ時間を大幅に短縮できます。
  • 市場性:最新 OS・カーネルへの迅速な追従により、タイム・トゥ・マーケットを短縮できます。
  • 柔軟性:Windows・Linux・macOS に対応。1 つのプラットフォーム向けで開発しても、他のプラットフォームへの展開が容易です。
  • 安定性:Jungo 社の経験豊富なエンジニアが開発したカーネルモジュールが基盤となっており、多くの OS/プラットフォーム/BIOS の組合せでテスト済みです。
ただし、ドライバーの「付加価値部分」(デバイス固有のロジック)はお客様自身で開発する必要があります。

いいえ、必要ありません。WinDriver を使用すると、ユーザーモードでデバイスドライバーのコーディングを行います。お勧めする開発ステップ:
  1. DriverWizard を起動します。
  2. グラフィカルな Wizard を使用して、コードを 1 行も記述せずにハードウェアを診断します(レジスタの読み書き、DMA テスト、割り込みの監視など)。
  3. [Generate Code] を選んでドライバースケルトンを生成します。C / C++・C#・Python・Java に対応しています。
  4. 生成されたコードをベースに、デバイス固有のロジックを追加します。
  5. 32bit または 64bit コンパイラでビルドして完成です。

はい。WinDriver ツールキットの全機能を備えた 30 日間無料評価版を提供しています。PCI 評価版またはUSB 評価版よりダウンロードできます。評価期間の延長をご希望の場合は、お問い合わせフォームよりご連絡ください。

v11.50 以降ではライセンスチェックの変更と VID Lock の導入により、バージョン間の互換性はありません。それ以前のバージョンでは基本的に後方互換ですが、動作保証はしておりません。

1 台の PC に複数バージョンの WinDriver ベースドライバーをインストールする場合は、バージョンごとにカーネルドライバー(.sys ファイル)の名前を変更することを強くお勧めします。

注意: Kernel PlugIn は後方互換性がありません。新しいバージョンにアップグレードする際は、新バージョンの WinDriver を使用して Kernel PlugIn ドライバーを必ずリビルドしてください。

アンインストール手順ページを参照してください。なお、Web 上の手順は最新バージョンを対象としています。古いバージョンをご使用の場合は、WinDriver のユーザーマニュアルの該当章を参照してください。
評価・購入・ライセンス テクニカルドキュメント →

お見積りをご希望の場合は、価格・ライセンス体系ページを参照するか、お問い合わせフォームよりご連絡ください。

登録版を使用する際には、コードに license registration string を登録する必要があります。評価版で生成したコードにはデモ用のライセンス文字列が含まれており、登録版の license registration string に置き換える必要があります。

登録方法は WinDriver ユーザーマニュアルの WDU_Init()(USB)/ WDC_DriverOpen()(PCI/ISA)の説明を参照してください。

WinDriver のインストールは開発マシン用です。配布先マシンには WinDriver をインストールする必要はありませんが、作成したドライバーのバイナリ(.sys ファイルと INF ファイル)が必要です。配布の詳細は ユーザーマニュアルの「ドライバーの配布」章を参照してください。

重要: ドライバーを複数の製品(異なる VID/PID)に配布する場合は、それぞれに対応したライセンスが必要です。詳細はライセンス体系ページを確認してください。

WDC_PciScanDevices() でデバイスを検出し、WDC_PciGetDeviceInfo() でメモリ範囲を取得します。次に WDC_PciDeviceOpen() を呼び出してメモリをユーザー空間・カーネル空間にマップします。ユーザーモードからの直接アクセスか、WD_Transfer() 経由のカーネルモードアクセスが利用できます。

はい。Thunderbolt アダプターが正しく設定され、OS がデバイスを認識している場合、WinDriver は通常の PCIe デバイスとして扱います(v14.7.0 以降)。

注意: マザーボードのチップセットや BIOS 設定によっては、Thunderbolt ポートの PCIe トンネリングが無効になっている場合があります。デバイスが OS に認識されない場合は、BIOS 設定でThunderbolt の PCIe サポートが有効になっているか確認してください(ベンダーのドキュメントを参照)。

"Shared" はリソースへの排他ロックを決定します。Non-sharable なリソースは排他ロックされ、解放されるまで別のアクセスは失敗します。デバイスレジスタは共有できません。PCI リソースと割り込みは一般的に共有可能に設定すべきです。fNotSharable フラグで状態を確認できます。

技術的にはできますが、同期の問題からお勧めしません。ベストプラクティスは、1 つのプロセスがハードウェアへの直接アクセスを担い、他のプロセスはそのプロセスを通じて通信する設計です。

USB の場合、同じデバイスに対して複数回 WDU_Init() を呼び出すと、最初の呼び出し以降は attach 通知を受け取れません。WDU_Uninit() を呼び出してから再度初期化してください。

大規模なマルチプロセス共有が必要な場合は、WinDriver for Servers の IPC / バッファ共有 API の利用を検討してください。

WinDriver 10.3.1 以降では、ドライバーの INF ファイルに PciCfgRwCompat レジストリキーを 1 に設定します。v11.1.0 以降ではフラグ値を修正します。WinDriver\util\wdreg ディレクトリの wdreg コマンドを使用して再インストールしてください。
USB

WDU_ResetDevice() 関数を使用します。

これは WD_USBD_STATUS_BUFFER_OVERRUN で、デバイスがリクエストしたよりも多くのデータを転送しようとしたことを示します。
対策:
  1. バッファサイズを最大パケットサイズの倍数に設定する。
  2. デバイスがリクエスト量を超えるデータを送信しないようにするプロトコルを実装する。
ファームウェアを確認し、USB バスアナライザーで問題を診断することをお勧めします。

WDU_Init() を使用して、接続・切断通知のコールバックを登録します。コールバック関数内でデバイスの接続状態を管理してください。

WDU_GetStringDesc() 関数を使用してインデックスで文字列ディスクリプタを取得できます。

いいえ。WinDriver USB はクライアントデバイス向けのドライバー開発ツールです。USB ハブやホストコントローラードライバーの開発は対象外です。

はい。WinDriver では Windows 向けに WDU_Stream 系関数によるアイソクロナスストリーミング転送をサポートしています。
デバッグ・開発ツール テクニカルドキュメント →

Debug Monitor(wddebug_gui または wddebug)は、WinDriver のカーネルモジュールが出力するリアルタイムのデバッグ情報を収集・表示するツールです。

起動後、Trace モードに設定すると、すべての WinDriver API コールとカーネル操作の詳細ログを取得できます。問題のお問い合わせの際は、Trace モードで取得したログをご提供ください。

wddebug_gui(GUI 版)は見やすく検索が容易ですが Qt 依存があります。wddebug(コンソール版)はスクリプトやリモートセッション向けで動作が速く、ソースコードが提供されています。

  • Windows: WinDbg(カーネルデバッガ)でクラッシュダンプを解析します。カーネル PlugIn 内に KdPrint() を追加するとカーネルデバッガに直接メッセージを送れます。
  • Linux: クラッシュ後に dmesg でカーネルログを確認します。printk() でカーネルメッセージを追加できます。
  • WD_DebugAdd() を使用すると、Debug Monitor にメッセージを送ることができます。

はい。WinDriver のユーザーモードコードは通常の Win32 アプリケーションとして動作するため、Visual Studio(または VS Code・その他の C / C++ IDE)のネイティブデバッガで直接デバッグできます。
追加ツール:
  • Windows:Dr. Memory(メモリリーク検出)、WinDbg(カーネルデバッグ)
  • Linux:valgrind(メモリリーク検出)、dmesg(カーネルメッセージ)

はい。各デバイスに一意のハンドルが割り当てられるため、複数のデバイスを同時に管理できます。C・Java・Python のサンプルは単純化のため1デバイスのみ開きますが、複数ハンドルの使用はできます。USB や .NET のサンプルでは複数デバイスの処理例が示されています。

WinDriver は基本的にクロスプラットフォームです。DriverWizard で CMakeLists.txt を生成してビルドすると移植が容易になります。名前変更したドライバーを使用している場合は、ターゲット OS で新しい DriverWizard プロジェクトを作成して動作を確認してから、既存コードを段階的にマージしていくアプローチをお勧めします。

Kernel PlugIn は WinDriver に標準で含まれており、追加費用は不要です。通常の WinDriver ライセンス(PCI/ISA)があれば使用できます。

Windows で DriverWizard が生成した Kernel PlugIn コードをコンパイルするには、Windows Driver Kit(WDK)が必要です。DriverWizard で Kernel PlugIn のスケルトンコードとプロジェクトファイルを自動生成できます。Linux では、対象カーネルに合ったヘッダーと WinDriver に含まれる Kernel PlugIn 関連ファイルを使用してビルドします。

一般的な原因:
  1. パラメータ設定が正しくない。
  2. コード内のすべての箇所でドライバー名が正しく設定されていない(大文字で記述し、拡張子なし)。
  3. ドライバーが正しくインストールされていない。ファイルパスと wdreg でのインストールコマンドを確認する。
  4. 登録ユーザーの場合、WD_KernelPlugInOpen() より前に WD_License() が呼ばれていない。

Kernel PlugIn から割り込みを有効化しつつ、ユーザーモードから無効化しようとした際に発生します。
解決策:WD_IntDisable() をアトミック操作として呼び出す際、Kernel PlugIn が割り込みを再有効化する前に無効化が完了するように実装してください。

KP_IntEnable() から KP_IntAtIrql() および KP_IntAtDpc() に渡されるプライベートなコンテキストデータです。ユーザー定義の構造体へのポインタを渡すことで、割り込みハンドラー内で任意のデータにアクセスできます。

Kernel PlugIn のグローバル変数とローカル変数はノンページメモリに配置されます。WinDriver の malloc() もカーネルから呼び出された場合はノンページメモリを割り当てます。
ユーザーモードのポインタから渡されたデータには、KP_IntAtIrql() 内で安全にアクセスするためにノンページメモリへコピーする必要があります。

DriverWizard で Kernel PlugIn コードを生成するか、KP_PCI サンプルを参照してください。KP_IntAtIrql() で割り込みステータスレジスタを読み取り、自分のハードウェアが割り込みを生成したか確認します(fIsMyInterrupt = TRUE を設定)。割り込みのアクノリッジを行い、遅延処理が必要な場合は TRUE を返します。KP_IntAtDpc() で低優先度の処理を行います。

いいえ。WinDriver が要求するコールバック関数のみ __cdecl で宣言する必要があります。独自に追加した関数については任意の呼び出し規約を使用できます。

Kernel PlugIn モジュール自体は C で記述する必要があります。ただし、Kernel PlugIn を呼び出すユーザーモードアプリケーションは WinDriver がサポートするすべての言語(C#・VB.NET・Java・Python)で記述できます。DriverWizard は選択した言語に関わらず C で Kernel PlugIn コードを生成します。

ユーザーモード割り込みハンドラーでは通常 500〜2,000 回/秒が限度です。それ以上の割り込みレートが必要な場合は、Kernel PlugIn を使用してカーネルモードで割り込みを処理することで数十万回/秒の処理が可能になります。

はい、大幅に改善されます。ユーザーモードの割り込み処理には OS のコンテキストスイッチのオーバーヘッドが伴いますが、Kernel PlugIn に移行するとカーネル内で直接処理され、マイクロ秒レベルのレイテンシが期待できます。処理の重要な部分のみを Kernel PlugIn に移行し、その他はユーザーモードで行う設計がお勧めです。

WDC_IntEnable() に渡す WD_INTERRUPT 構造体内に転送コマンドを設定してステータスレジスタを読み取ります。dwOptionsINTERRUPT_CMD_COPY フラグを設定すると読み取り値が保存されます。Kernel PlugIn を使用する場合は、割り込みハンドラールーティン内で直接読み取れます。

Scatter/Gather バッファで 1MB 以上を割り当てる場合は、WDC_DMASGBufLock()dwOptionsDMA_LARGE_BUFFER フラグを設定してください。
連続バッファの場合は WDC_DMAContigBufLock() を使用し、早い段階(OS 起動直後)でメモリを確保するほど成功率が上がります。Windows では NonPagedPoolSize レジストリエントリを増やすことも検討してください。

DMA メモリはキャッシュなし(ノンキャッシュ)で割り当てられますが、通常のメモリはキャッシュが有効です。WDC_DMAContigBufLock() または WD_DMA 構造体の dwOptionsDMA_ALLOW_CACHE フラグを設定することで、キャッシュ付き DMA バッファを割り当てられます(Windows x86/x86_64 環境でお勧め)。

Linux カーネル 6.2 以降(RHEL では 5.14 以降)では CMA(Contiguous Memory Allocator)の検証が厳格化されました。WinDriver v16.5.0 以降では、非 CMA 環境での WDC_DMAContigBufLock() がデフォルトでブロックされます。

回避策: DMA_OVERRIDE_CMA_VALIDATION フラグを設定することで、非 CMA 環境でも動作を継続できます。ただし、この設定はシステムの安定性に影響する可能性があるため、長期的には CMA 対応設計への移行をお勧めします。詳細は リリースノート を参照してください。

WinDriver は割り込みサービスルーティンと DMA バッファロックをサポートします。WDC_DMAContigBufLock()WDC_DMASGBufLock()・または低レベルの WD_DMALock() で物理アドレスを取得し、WinDriver のハードウェアアクセス API を使用して DMA コントローラを自前でプログラムしてください。詳細はマニュアルの DMA セクション(11.2, 11.3)を参照してください。

カーネルのバージョンが一致しているか確認してください。WinDriver の Kernel PlugIn は、インストールされているカーネルと同じバージョンのヘッダでビルドする必要があります。また、WinDriver の kp_linux*.o_shipped ファイルが対象カーネルバージョン向けにビルドされているかも確認してください。

Linux の連続メモリ割り当て(kmalloc)には通常 128KB の上限があります。より大きなバッファを割り当てるには以下の方法を試してください:
  • Scatter/Gather DMA(WDC_DMASGBufLock())を使用する。
  • カーネル起動パラメータで CMA リージョンを拡張する。
  • システムのメモリ断片化を減らすため、OS 起動直後に割り当てを行う。

WinDriver v16.x はLinux Secure Boot 署名に対応しています。独自のキーペアを生成し、MOK(Machine Owner Key)として登録することで、署名済みカーネルモジュールをロードできます。詳細は WinDriver のインストールガイドの Secure Boot セクションを参照してください。

WDM(Windows Driver Model)は Windows のカーネルモードドライバーの基盤アーキテクチャです。WinDriver は WDM の複雑な内部仕様を直接扱う必要なく、ユーザーモードからハードウェアアクセスを可能にします。WinDriver 自体の低レベルカーネルモジュール(windrvr6.sys)が WDM に準拠しており、お客様のコードはその上で動作します。

Windows 11 / 10 / Server 環境でドライバーを一般配布するにはデジタル署名が必要です。以下の 2 つのサービスを利用できます。

はい。WinDriver v16.1.0 以降で Windows 10 / 11 for ARM64 をサポートしています。ARM64 向けの WinDriver ランタイムと生成されたコードを ARM64 コンパイラでビルドすることで、ARM64 Windows デバイス上でドライバーを動作させることができます。

お探しの回答が見つかりませんでしたか?