WinDriver デバイスドライバー開発ツールキットに関する技術的な質問と回答
該当する Q&Aが見つかりませんでした。キーワードを変更してみてください。
windrvr6.sys 等)を利用して、このコードをユーザーモードで記述できます。したがって、ドライバー開発の深い知識は必要ありません(WinDriver アーキテクチャ参照)。WDU_Init()(USB)/ WDC_DriverOpen()(PCI/ISA)の説明を参照してください。
.sys ファイルと INF ファイル)が必要です。配布の詳細は ユーザーマニュアルの「ドライバーの配布」章を参照してください。WDC_PciScanDevices() でデバイスを検出し、WDC_PciGetDeviceInfo() でメモリ範囲を取得します。次に WDC_PciDeviceOpen() を呼び出してメモリをユーザー空間・カーネル空間にマップします。ユーザーモードからの直接アクセスか、WD_Transfer() 経由のカーネルモードアクセスが利用できます。
WDU_Init() を呼び出すと、最初の呼び出し以降は attach 通知を受け取れません。WDU_Uninit() を呼び出してから再度初期化してください。PciCfgRwCompat レジストリキーを 1 に設定します。v11.1.0 以降ではフラグ値を修正します。WinDriver\util\wdreg ディレクトリの wdreg コマンドを使用して再インストールしてください。
WDU_ResetDevice() 関数を使用します。
WD_USBD_STATUS_BUFFER_OVERRUN で、デバイスがリクエストしたよりも多くのデータを転送しようとしたことを示します。WDU_Init() を使用して、接続・切断通知のコールバックを登録します。コールバック関数内でデバイスの接続状態を管理してください。
WDU_GetStringDesc() 関数を使用してインデックスで文字列ディスクリプタを取得できます。
WDU_Stream 系関数によるアイソクロナスストリーミング転送をサポートしています。
wddebug_gui または wddebug)は、WinDriver のカーネルモジュールが出力するリアルタイムのデバッグ情報を収集・表示するツールです。wddebug_gui(GUI 版)は見やすく検索が容易ですが Qt 依存があります。wddebug(コンソール版)はスクリプトやリモートセッション向けで動作が速く、ソースコードが提供されています。
KdPrint() を追加するとカーネルデバッガに直接メッセージを送れます。dmesg でカーネルログを確認します。printk() でカーネルメッセージを追加できます。WD_DebugAdd() を使用すると、Debug Monitor にメッセージを送ることができます。Dr. Memory(メモリリーク検出)、WinDbg(カーネルデバッグ)valgrind(メモリリーク検出)、dmesg(カーネルメッセージ)CMakeLists.txt を生成してビルドすると移植が容易になります。名前変更したドライバーを使用している場合は、ターゲット OS で新しい DriverWizard プロジェクトを作成して動作を確認してから、既存コードを段階的にマージしていくアプローチをお勧めします。
wdreg でのインストールコマンドを確認する。WD_KernelPlugInOpen() より前に WD_License() が呼ばれていない。WD_IntDisable() をアトミック操作として呼び出す際、Kernel PlugIn が割り込みを再有効化する前に無効化が完了するように実装してください。
KP_IntEnable() から KP_IntAtIrql() および KP_IntAtDpc() に渡されるプライベートなコンテキストデータです。ユーザー定義の構造体へのポインタを渡すことで、割り込みハンドラー内で任意のデータにアクセスできます。
malloc() もカーネルから呼び出された場合はノンページメモリを割り当てます。KP_IntAtIrql() 内で安全にアクセスするためにノンページメモリへコピーする必要があります。
__cdecl で宣言する必要があります。独自に追加した関数については任意の呼び出し規約を使用できます。
WDC_IntEnable() に渡す WD_INTERRUPT 構造体内に転送コマンドを設定してステータスレジスタを読み取ります。dwOptions に INTERRUPT_CMD_COPY フラグを設定すると読み取り値が保存されます。Kernel PlugIn を使用する場合は、割り込みハンドラールーティン内で直接読み取れます。
WDC_DMASGBufLock() の dwOptions に DMA_LARGE_BUFFER フラグを設定してください。WDC_DMAContigBufLock() を使用し、早い段階(OS 起動直後)でメモリを確保するほど成功率が上がります。Windows では NonPagedPoolSize レジストリエントリを増やすことも検討してください。
WDC_DMAContigBufLock() または WD_DMA 構造体の dwOptions に DMA_ALLOW_CACHE フラグを設定することで、キャッシュ付き DMA バッファを割り当てられます(Windows x86/x86_64 環境でお勧め)。
WDC_DMAContigBufLock() がデフォルトでブロックされます。DMA_OVERRIDE_CMA_VALIDATION フラグを設定することで、非 CMA 環境でも動作を継続できます。ただし、この設定はシステムの安定性に影響する可能性があるため、長期的には CMA 対応設計への移行をお勧めします。詳細は リリースノート を参照してください。
WDC_DMAContigBufLock()・WDC_DMASGBufLock()・または低レベルの WD_DMALock() で物理アドレスを取得し、WinDriver のハードウェアアクセス API を使用して DMA コントローラを自前でプログラムしてください。詳細はマニュアルの DMA セクション(11.2, 11.3)を参照してください。
kp_linux*.o_shipped ファイルが対象カーネルバージョン向けにビルドされているかも確認してください。
kmalloc)には通常 128KB の上限があります。より大きなバッファを割り当てるには以下の方法を試してください:
WDC_DMASGBufLock())を使用する。windrvr6.sys)が WDM に準拠しており、お客様のコードはその上で動作します。
お探しの回答が見つかりませんでしたか?