問題タブ [winusb]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Windows 上のソフトウェア ベースの Android アクセサリ
アプリケーションを使用して、コンピュータを Android アクセサリに変えたいと考えています。したがって、専用のハードウェアの代わりに、電話をアクセサリ モードに切り替える単なる PC になり、ホスト ハードウェアに関連付けられた電話で Java アプリを起動し、通信チャネルを作成します。
Linuxでlibusbを使用してこれを行うためのサンプルコード(およびいくつかのJava Androidアプリ)を見つけました。標準の VID と PID を使用して電話機を「開く」ことで機能します。次に、モデル、バージョンなどのメタデータとともに、アクセサリ モードをオンにするコマンドを送信します。
電話がアクセサリ モードをサポートしている場合、電話は切断され、別の PID で再列挙されます。サンプル コードは、それがあったかどうかを確認し、新しいデバイスを開きます。
ただし、これをWindowsで実行しようとしています。LibUsbDotNetのようないくつかの USB ライブラリを見つけましたが、それらはすべて WinUSB/libusb ドライバーを使用するデバイスを必要とするようです。LibUsbDotNet のツールを使用して携帯電話用の libusb ドライバーを生成し、古い汎用リムーバブル ドライブにインストールしました。しかし、これは、必要なときに電話をリムーバブル ドライブとしてアクセスできないことを意味するため、これは解決策ではありません。
VID と PID に基づいて接続された USB デバイスを開き、それにいくつかの raw コマンドを送信できる方法 (できればライブラリ) はありますか?
その後、デバイスは別の PID で再列挙されます。これを使用して、独自の WinUSB ドライバーを作成できるため、問題はありません。アクセサリ モードをオンにするには、デフォルト ドライバを介して、またはその周りにいくつかのコマンドを挿入する必要があります。
(私は .NET ソリューションを好みますが、Windows であれば何でも問題なく、独自の相互運用ラッパーを作成できます)
windows - Windows USBクラスドライバーをカスタムドライバーに置き換えますか?
誰かが助けてくれるのではないかと思いますが、これは少し専門家の問題です。
多数のUSBデバイスを読み取って分析する必要があるアプリケーションがあります(同時にではなく、それぞれが別々のテストで実行され、理論的には異なるマシンで実行できます)。
各USBデバイスはUSBHIDクラスに基づいており、さまざまな会社によって製造されています。これらのUSBデバイスはいずれもPCで実行するようには設計されていませんが、異なるプラットフォーム向けですが、デバイスをテストするためのものです。クライアントは、テストアプリケーションをPCから実行するように要求しました。
一部のデバイスは起動し、Windowsによって認識され、Windowsに組み込まれている汎用HIDクラスドライバーを使用して正しく初期化および起動します。その後、デバイスはテスト対象のデータの正しいデータパケットの送信を開始します。
一部のデバイスは起動し、ウィンドウによって認識されます。ウィンドウはそれらを起動しようとしますが、完全に初期化できず、半分初期化された状態のままになります。ビーグルプロトコルアナライザーを使用して本物のプラットフォームから初期化パケットをキャプチャし、LibUSBDotNetライブラリを使用して初期化シーケンスの残りのパケットを複製し、パケットの送信を正しく開始できるため、これは問題ありません。
私が抱えている問題は、特定の1つのデバイスにあります(まだテストしていないデバイスがいくつかあるため、そのうちの1つでも同じ問題が発生する可能性があります)。問題は、Windows HIDクラスドライバーがデバイスを認識し、初期化して開始しようとすることです。これは、流行の後に機能し、デバイスがデータの送信を開始します。
問題は、送信されるデータが本物のプラットフォームに送信されるデータ(完全なデータのサブセットのみを含む)とは異なることです。これは、Windowsがデバイスを別のモードに初期化したかのようです。
USBプロトコルアナライザーを使用してPCと純正プラットフォームの両方から初期化パケットをキャプチャすると、Windowsがわずかに異なる初期化パケットを送信していることがわかります。Windowsがすでに起動した後、LibUSBDotNetを使用して正しいパケットを再送信しても、デバイスは効果がないようです。
私の問題は、Windowsが標準のHIDクラスドライバーを使用してデバイスを初期化しようとするのを止める必要があることです。デバイスマネージャーでドライバーを削除しようとしましたが、それでも初期化されます(そしてドライバーはデバイスマネージャーで魔法のように再割り当てされます)。私はいくつかの調査を行いましたが、可能な代替案があります:
Windowsがデバイスの特定のVID/PIDに割り当てる特定のドライバーを作成しますが、それは何もしません。次に、LibUSBDotNetを使用して、自分のコード内からデバイスに正しい初期化シーケンスを送信できます。
WinUSBのようなものを使用して、デバイスに適切なドライバーを作成します(または、1のような「デッド」ドライバーを作成することもできます。
特定のVID/PIDが定義されたドライバーは、組み込みのUSB HIDクラスドライバーよりもWindowsで使用されますか?そうでなければ、私はこのルートを下るのに時間を無駄にするだろうか?
私のMacは問題のあるデバイスを正しく初期化することに注意してください。クライアントに、アプリケーションをMac用に開発できるかどうかを尋ねましたが、その答えはWindowsだけでイライラしていました。
比較的低レベルでUSBと通信した経験はありますが、適切なWindowsドライバーを作成した経験はありません(そのため、あまり心配する必要はありません)。誰かが良い行動方針を提案できますか(私が選択した行動方針を見つけるためだけにPC用のドライバーを書く方法を調査するのに何週間も無駄にする前に、私が必要なものを提供できません)。
どんな助けや提案も大歓迎です。
ありがとう、リッチ
以下の提案を試した後に追加されました:
LibUsbDotNet infウィザードを使用して必要なファイルを作成し、それらをインストールしようとしましたが、これは機能しているように見えました。確かに、デバイスはHIDデバイスではなくlibusb-win32デバイスとしてデバイスマネージャーに表示され、関連するドライバーはlibusbドライバーでした。これを行った後でも、デバイスは初期化され、間違ったタイプのデータパケットの送信を開始しているように見えますが、これらのパケットはクラスドライバーによって処理されなくなり、失われるだけです。
WinUSB用の同様のinf作成ウィザードを備えたZadigにも出くわしましたが、これはまったく同じ結果でした。
同僚は、デバイスをこのモードに切り替えているのはWindows自体ではなく、デバイスがWindowsマシンに接続されていることを識別し、それ自体をこのモードに切り替えている可能性があることを示唆しています。私はこれが事実であると思う、その場合私は立ち往生している-クライアントと別の会話をする時間。
助けてくれてありがとう。
.net - WinUSB ドライバーのインストール、エラー 0x00000003
次の .inf ファイルは、Microsoft WinUSB インストール ガイドから変更されました。
ハードウェア キー USBPRINT\DatamaxM4308-MarkII013B、ベンダーおよび PID は正しいはずです (公式のドライバー .inf ファイルからコピー)
Vista 32 ビットにドライバーをインストールしようとすると、「操作を完了できませんでした (エラー 0x00000003)」という メッセージが表示されます。
C:\Windows\inf\setupapi.dev.log には次のログが記録されます。
私は何を間違っていますか?winusb.sys をドライバーのフォルダー構造にコピーする必要がありますか? これは CoInstaller を使用して自動的に行われると思いましたか?
フォルダ構造は次のとおりです。
Datamax.Inf:
.net - ウィンドウ ハンドルなしで RegisterDeviceNotification を使用するにはどうすればよいですか?
VB.NET で winusb を使用して USB デバイスに接続する DLL ライブラリを作成しています。
これは DLL であるため、ウィンドウがありません。また、ライブラリのユーザーにもウィンドウがない可能性があります (コマンド ライン アプリなど)。
私が見た例では、デバイスのアタッチとデタッチのすべての使用を検出しますRegisterDeviceNotification
。これには、アタッチ/デタッチ メッセージを受信するためのウィンドウ ハンドルが必要です。
これらのメッセージをハンドルを取得するウィンドウなしで関数に直接受け取るにはどうすればよいですか?
multithreading - メソッドと関数の呼び出しを行いますか
異なるスレッドからメソッドを呼び出すことに関して質問があります。さて、私はUSBデバイスと通信するためにWinUSBドライバーを使用しています。デバイスからデータを読み取るための別のスレッドがあります。デバイスへのコマンドはメインスレッド内で設定されます。実際、私はWinUSB_WritePipeメソッドとWinUSB_ReadPipeメソッドを使用してそのような操作を行っています。データが読み取られるスレッドでは、構造が重複している非同期の読み取りメソッドとWaitForMultipleObjectを使用します。私のデバイスには設定する必要のあるいくつかの機能があり、これはメインスレッドのGUIを介して行われます。
私はいくつかの奇妙な行動を観察しています。私の質問は、このメソッドへの呼び出し(たとえば、mutexを使用)をロックして、一度に1つのスレッドだけがメソッドにアクセスまたは呼び出す必要があるかどうかです。
古い方法:
新しい方法:
これは非常に単純化されたコードであり、問題を説明するためだけのものであり、プログラミングスキルを反映していません。:)もちろん、同じミューテックスでロックしてから、メインスレッドで同じメソッドを呼び出します。
問題をできるだけ単純に説明したいと思います...繰り返しますが、これらのメソッドへの呼び出しを別のスレッドでロックする必要がありますか?
よろしくお願いします。本当に感謝しています!
Br、Nix
windows - libUSB / WinUSB から WinDDK ドライバー ポートへ
WDK (カーネル モード) を使用して、libUSB ドライバーを Windows ドライバーに移植したいと考えています。libUSB が内部で winUSB を使用していることがわかりました (libUSB ソースから)。
これは私が libusb で行うことです。
libusb_open_device_with_vid_pid を使用してハンドルを取得します
または libusb は内部的に pSetupDiGetClassDevsA およびその他の pSetupDi*** 関数を使用します
libusb_control_transfer または内部的に WinUSB の WinUsb_WritePipe を使用してデータを送信します
カーネルモードのWDKでこれと同等の機能は何ですか? 使用できるサンプルはありますか?
注: カーネル モードを要求する理由は、このデータを取得し、HID ミニ ドライバーとして再ルーティングする必要があるためです。
kernel - カーネルモードからのWinUSBデバイスへのアクセス
関数ドライバーとしてWinUSBドライバー(winusb.sys)を使用しているUSBデバイスがあります。次に、このデバイスにアクセスするビデオキャプチャドライバー(カーネルモードドライバーである必要があります)を作成する必要があります。
私の質問は、カーネルモードからWinUSBデバイスにアクセスして操作できますか?もしそうなら、そうするためのドキュメントはありますか?
私が見つけたすべてのドキュメントは、WinUSB.dllを使用してユーザーモードからWinUSBにアクセスすることについて話しているが、これは私にとってのオプションではない。IoGetDeviceObjectPointer()を使用して、USBデバイスで通信しているUSBパイプに必要なファイルハンドルを取得しようとしましたが、呼び出しは常にSTATUS_ACCESS_DENIEDで失敗します。USBデバイス用に独自のKMDFドライバーを作成できることは知っていますが、既に配置されているWinUSBドライバーを使用する方がはるかに簡単です。
どんな助けでも大歓迎です。
windows - WinUSBのインストール
WinUSBで少し実験したかった。WinDDKをインストールし、ドライバー用の最初のINFファイルを作成しようとしています。これを行うには、 MSDNガイドに従っています。このガイドには、サンプルINFファイルと、「セクション名のUSB_Installを適切なDDInstall値に変更する」手順が含まれています。
十分に公平ですが、唯一の問題は、「適切なDDInstall値」が何であるかがわからないことです。
私は実際にはINFファイルの専門家ではなく、ガイドがおそらくサンプルファイルのセクション名を変更するように求めていると推測できます。
[USB_Install]
セクションヘッダーとは異なるものに。私が見つけたDDInstallに関する唯一の説明は、このセクション( MSDNでも)をどうするかについての一般的な説明です。
私の質問は、[USB_Install]
文字列の代わりにINFファイルに何を入れるべきかということです。
windows - WinUSB BulkTransfer受信を使用するlibusb Windowsが一貫していない
libusbx を使用して Windows 経由でカスタム USB デバイスと通信しようとしています。デバイス用の WinUSB ドライバーがインストールされており、何らかの通信を行うことができます。思うように動かないだけです。
私は、基本的にPCから基本的な双方向通信を取得しようとしています.1バイトを送信し、いくつかのバイト数が返されることを期待しています。現在、デバイスをリセットしてバイトを送信するプログラムを実行すると、1 バイトしか返されません。プログラムを再実行すると、次のバイトだけが返されます。最終的に私が期待したものを受け取るまで、これはさらに数回起こります。
例: PC は「a」を送信します。
期待される出力は
私が実際に得るものは次のとおりです。
シリアル通信を使用して COM ポート経由で USB デバイスをテストすると、すべてが期待どおりに動作します。
実行中のコードのペーストビンは次のとおりです: http://pastebin.com/bQtyS6vq
誰かが同様の問題を経験したことがありますか、または修正のための提案はありますか?
android - USB経由でAndroidデバイスと通信するUSBホストとしてのWindows PC
USB 経由で Android アプリから Windows PC 上のサーバーにデータを (プログラムで) 転送したいと考えています。Web を 3 ~ 4 日以上検索しましたが、サンプル コードなどが見つかりませんでした。
Java、C#などでこれを実現する方法はありますか? adb 経由で接続を確立しましたが、adb はオプションではありません。