問題タブ [deviceiocontrol]
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.
c# - Pinvoke DeviceIoControl パラメーター
を使用して C# プロジェクトに取り組んでいDeviceIoControl
ます。関連するPinvoke.net ページで署名を調べました。
私は見たことがありませんでしobject
たが、MSDNのドキュメントは有望に聞こえました:[MarshalAs(
UnmanagedType.AsAny
)]
実行時にオブジェクトの型を決定し、オブジェクトをその型としてマーシャリングする動的な型。このメンバーは、プラットフォーム呼び出しメソッドに対してのみ有効です。
私の質問は次のとおりです。この署名を使用する「最良の」および/または「適切な」方法は何ですか?
たとえば、構造体であることがIOCTL_STORAGE_QUERY_PROPERTY
期待InBuffer
されますSTORAGE_PROPERTY_QUERY
。new
その構造体を定義し、インスタンスを作成して、それを Pinvoke 署名に渡すことができるように思えます。
しかし、私はSystem.ExecutionEngineException
それをやったばかりなので、次のように変更しました:
少なくとも、呼び出したときに例外はスローされませんでした。それは非常に醜く、お尻に大きな痛みがあります。私が望んでいたように、マーシャラーはローカル構造体との間のデータのコピーを処理できませんか?
出力データは固定サイズの構造体ではないため、扱いにくい場合があります。マーシャラーがそれを自動的に処理できない可能性があることは理解しており、必要に応じて HGlobal とコピー ビジネスを実行しても問題ありません。
追加:
この質問は最初は役に立ちましたが、最終的には定数が正しくありませんでした。
私はunsafe
コンストラクトの使用に反対しているわけではありません。( fixed
-sizestruct
メンバーにはこれが必要です。)
c++-cli - DeviceIoControl は C++ および C# で動作しますが、C++/CLI で呼び出されると ERROR_INVALID_FUNCTION を返します
ファイル名のリストを取得するために MFT を列挙しようとしています。
このコードは、Win32 プロジェクトで使用すると機能します。
しかし、C++/CLI で同じコードを使用すると、DeviceIoControl
falseGetLastError
が返され、ERROR_INVALID_FUNCTION が返されます。同じコードを C# に変換すると、機能します。
何が起こっているのですか?
c++ - DeviceIoControl を介してキーボード入力を送信する
過去 3 時間ほど、キーボード デバイスに書き込むことでキーボード入力を送信しようと試みてきました。キーボード デバイスを見つけて開くことができましたが、最後の手順で行き詰まっています。DeviceIoControl パラメーターをフォーマットする方法が正確にはわかりません。また、値の取得を開始する場所もわかりません。
現在、別の回答に投稿された Interception というライブラリから部分的に以下を取得しています。スペースを節約するために、デバイスを開くものはすべて省略しました。
DeviceIoControl 呼び出しの後に GetLastError を呼び出すと、戻り値 ERROR_INVALID_FUNCTION(1) が返されます。IOCTL_WRITE が正しい値ではないことを意味していると思いますが、正しい値を見つける方法がまったくわからず、いくら検索してもそれ以上得られませんでした。
windows - IOCTL_DISK_GET_LENGTH_INFO を指定した Windows DeviceIoContro() には非常に長い時間がかかります
IOCTL_DISK_GET_LENGTH_INFO を使用した DeviceIoContro() の呼び出しは、マウントされていないドライブで 1 分以上 Windows で保持されます。オンラインドライブの長さを調査して印刷しようとしています。この保留動作は、ユーザー インターフェイスでは受け入れられません。誰かがこれを回避する良い方法を持っていますか?
「\\.\PhysicalDrive0」のように、Windows で物理ディスク名の呼び出しを使用しています。停止しているドライブは DVD ドライブ、つまりリムーバブルです。十分な時間があれば、Windowsがドライブをスピンアップできるかどうかは気にしません。そのままでは、ドライブにディスクがなく、Windows はドライブをオンラインにしようと長い間待機しているようです。ドライブがスピンアップしていない場合、すぐに失敗するようにします。
前もって感謝します。
スコット・ムーア
このコードは次のとおりです。
int testsize( /** 設定するドライブ番号/ int drive, / * ディスクのサイズを返す */ long long *size )
{
}
windows-8 - Windows 7 と Windows 8 で DeviceIoControl() 関数の動作が異なる
DeviceIoControl 関数を使用して、ハードディスク シリアルを取得しようとしています。そして、同じパラメータでそれを呼び出すと、出力バッファに異なる値が与えられます。
私はそれを
ここで、hPhysicalDriveIOCTL = CreateFile (TEXT(deviceName), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
c++ - OID_802_11_BSSID_LIST の DeviceIoControl エラー 87
ネットワーク GUID から利用可能なアクセス ポイントを取得しようとしていますが、常に DeviceIoControl() のエラー 87 (間違ったパラメーター) が発生します。どのパラメーターが間違っているのかわからないので、しばらく頭がおかしくなりました! 私は何時間もグーグルで検索してきましたが、解決策が見つかりません。コードは次のとおりです。
Broadcom 802.11n ネットワーク アダプタである wsGuid = L"\\.\{8D36491D-C393-4D71-B10A-153C4FA69AEE}" でこのリストを取得しようとしています。
編集: Win7 ワークステーションで試しています。私はそれが非推奨であることを知っています(したがって、WlanGetNetworkBssList()を使用して新しいバージョンの移植性も追加しましたが、うまく機能しています)。(この同じ win7 ワークステーションで) 古いバージョンのデバッグ中にエラーが発生しました。おそらく問題は次のとおりです。コードが正しい場合、NDIS IOCTL は Win7 以降でも動作していますか?
winapi - USB読み取りのデバッグ
サードパーティの 64 ビット DLL を使用してカスタム USB デバイスにアクセスするコードをデバッグしています。私の環境は、Windows 8.1 x64 上の Microsoft Visual Studio 2012 です。
不完全で信頼できないドキュメントによると、DLL は USBDEVFS_CONTROL ioctl を発行して、接続された USB デバイスから 1 バイトを読み取ることになっています。定義には以下が含まれます
ここbmRequestType
で、bRequest
、wValue
、およびはwIndex
、デバイスの製造元によって提供される定数であり、特定のコマンドを含むバッファーです。ByteArray
uint8_t[64]
DLL は、アプリケーション固有のパラメーターを受け取り、それらを にパックして、-> ->ByteArray
を呼び出します。ユーザーモードで見ることができる最後の分解は、ksproxy.ax
Kernelbase.dll
ntdll.dll
ByteArray
ドキュメントによると、ステップバイステップ デバッガーを使用すると、 が想定どおりに正確に構築されていることが簡単にわかります。usbdevfs_ctrltransfer
しかし、構造、またはそれに相当する Windowsが見つかりません。
具体的にはwIndex
、ドキュメントで指定されている の値が古いバージョンのハードウェアに適用され、Windows DLL が実際に0x0400
の代わりに を使用していると思われます0x0402
。
この無署名のショートを検証するためのヒント (ハードウェアまたはソフトウェアの USB スニファー、エミュレーターなどを含む) をいただければ幸いです。
アップデート
https://reverseengineering.stackexchange.com/questions/2416/how-to-reverse-engineer-simple-usb-device-windows-linuxとhttps://reverseengineering.stackexchange.com/questions/1786/usb-dongleを読む-トラフィック監視。これらのツールは Windows 8.1 x64 と互換性がないようです。
c++ - SCSI INQUIRY コマンドの DeviceIoControl がエラー 50 を返す
IOCTL コマンドを使用して USB スキャナにアクセスしようとしています。これは Windows 7 上にあります。以前は IOCTL コーディングを扱ったことがなかったので、最初に、クイック検索で見つけたものに基づいて次のスニペットを試しました。
Windows 7 の 32 ビット バージョンと 64 ビット バージョンの両方を試しましたが、結果はどちらも同じです (エラー 50 : 要求はサポートされていません)。興味深いことに、2 番目の DeviceIoControl 呼び出しが機能し、デバイスの VID/PID とファームウェア バージョンが返されます。
エラー メッセージに基づいて、この IOCTL はサポートされていないと思います。しかし、調べてみると、この IOCTL コードはすべてのデバイスで必須であることがわかったので、何か間違っているに違いありません。INQUIRY コマンドが成功するようにするには、このコードをどのように変更する必要がありますか?
c++ - ファイルの最後のクラスターを見つける
ターゲット ファイルの最後のクラスターを見つけて、そこからバイナリ データを読み取ろうとしています。私は CreateFile() から始めて、その結果を DeviceIoControl() で使用し、制御コード FSCTL_GET_RETRIEVAL_POINTERS を指定しました。
だから私は次に何をすべきか本当に知りません。LARGE_INTEGER Lcn
から表示RETRIEVAL_POINTERS_BUFFER
すると、現在の範囲を表す膨大な数が得られます。NO_ERROR
また、すべてのクラスター データが正常に読み取られたと仮定して、スイッチ エラーのケースが発生します。ファイルの最後のクラスターを見つけるのに役立つ Lcn 番号は何ですか?