問題タブ [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.

0 投票する
0 に答える
131 参照

c++ - NTFS システムの最後のクラスタ

ファイルの最後のクラスターを見つける方法を明確にする必要があります。クラスター情報を取得する方法のコード スニペットを次に示します。

正しいクラスターが見つかったかどうかはわかりません。最後のクラスターを見つけるために、最初に最後のクラスターのサイズを見つけ、次に+ Extents[lastExtentN].NextVcn.QuadPart- 1Extents[lastExtentN - 1].NextVcn.QuadPartで場所を見つけました。たとえば、私の出力では次のようになります。Extents[lastExtentN].Lcn.QuadPartlengthOfCluster

私のコードと出力は意味がありますか? 出力される数値はバイト単位ですか?

0 投票する
3 に答える
892 参照

c# - 複雑な構造を持つ C# の deviceIOControl の呼び出し

そのため、デバイス ドライバーの 1 つと通信する C# ラッパーを作成しようとしています。(単体テストの作成) ドライバーは新しいものですが、古い C++ ヘッダーに対してコーディングされているため、構造レイアウトが定義されており、実際には変更できません。

そのため、デバイスが DeviceIOControl を渡すことを期待している C++ 構造を複製しました。

更新 #3 - コードを同じ問題のあるデモ コードに変更します。また、他の人が使いやすいように質問をクリーンアップします。以下の私の回答を参照してください

ドライバー側では、渡されたバッファーのサイズをチェックするため、への呼び出しは失敗します。C# 側では、deviceIOControlオブジェクトが小さすぎてサイズとしてMarshal.SizeOf()返さ52れます。関数は「合格」しますが、データが正しく渡されていないと確信しています。852Size=StructLayout

問題はこれであると確信していpublic Points[] p = new Points[10];ます。これは本質的に多次元配列であるため、Marshal.StructToPtr() がこれを正しくマーシャリングしていないと思います。

それで、私の質問はこれも可能だと思いますか?C# は、その構造体の配列に対してメモリ内に適切な量のスペースを作成する方法を知るのに十分スマートである可能性があるようです..しかし、そうではないでしょうか?

私が考えた代替案は「機能する」可能性があります。

  1. オブジェクトを byte[] に変換して元に戻すカスタム シリアライザーを作成し、メタデータはゼロにします。- 理想的ではありません。

  2. 混合 clr c++ dll を作成し、それをウェッジとして使用することは可能でしょうか。しかし、私の懸念は、同じ問題が発生するだけで、マネージ C++ だけでしょうか? または、混合モードでも、マネージされていないオブジェクトをラップして C# で使用するマネージ クラスを作成する必要があります。しかし、問題はそれをdeviceIOcontrolに渡す方法になります.C#からそれを行うと、物事を正しくマーシャリングしようとするという現在の問題が発生しますか? または、DeviceIOControl を呼び出す C++ 呼び出しに渡す場合、渡された各管理対象オブジェクトの管理対象外の型を取得する方法を知る必要があります。

  3. オブジェクトを作成して deviceIOControl を呼び出す C++ 関数を書くだけで、パラメーターが制御不能になる可能性があるため、あまり考えられませんか?

  4. あきらめて、すべて C++ で行います。実際にハードウェアの単体テストを作成しようとしていますが、VS の新しい cpp 単体テストはかなりうまく統合されています...

私もこの前の質問を見て試してみましたが、私のシーンは少し違うと思います。構造体の配列を含むネストされた構造体のアン/マーシャリング

更新 2 オブジェクトをドライバーに送信しようとしていることを明確にする必要があります (少なくともまだ)。

これが私がそれを呼んでいる方法です。

0 投票する
3 に答える
2392 参照

c++ - GPT ディスク上の特定のパーティションのパーティション タイプを C++ で取得する

私は、Windows ドライブで低レベルで操作する必要があるプロジェクトに取り組んでおり、主に Windows API 呼び出しを使用しています。しかし、ドライブを操作する前に、そこに存在するパーティションの種類を知る必要があります。

これは、MBR でフォーマットされたディスクではかなり簡単です。

DRIVE_LAYOUT_INFORMATION_EXの配列を含むformat の構造体を返しますPARTITION_INFORMATION_EX。MBR ディスクでは、要素にPARTITION_INFORMATION_EX.Mbr.PartitionTypeはパーティション タイプの一意の識別子が含まれます。NTFS0x07Extended0x05

ただし、これは GPT ディスクではそれほど単純ではありません。パーティションの先頭から識別子を読み取れることはわかっていますが、これは などの API 呼び出しで処理したいと考えていますDeviceIoControlDeviceIoControlGPT ディスクで実行するPARTITION_INFORMATION_EX.Mbr.PartitionTypeと、通常の値とはまったく異なる値が含まれます。

GUID は、パーティションの種類ではなく、パーティションの目的を教えてくれるだけなので、私には役に立たないことに注意してください。ドライブがNTFS、FATなどであるかどうかを調べようとしています。

0 投票する
1 に答える
1482 参照

c++ - C++ プログラムを使用して Windows サーバー 2008/2012 でディスクを初期化する方法

C++ プログラムを使用して、Windows サーバー 2008/2012 上の既存のディスクのプロパティでディスクを初期化しようとしています。

ディスク管理制御コードDeviceIoControl()のメソッドとIOCTL_DISK_CREATE_DISKコードIOCTL_DISK_SET_DRIVE_LAYOUT_EX, IOCTL_DISK_SET_PARTITION_INFO_EXを使用して、ディスクを使用できるようにします。

少し検索して、次のコードスニペットを取得しました

へのすべての呼び出しは、エラー 1 のコード (つまり、関数が正しくない)DeviceIoControl()の最後の呼び出しを除いて成功しています。IOCTL_DISK_SET_PARTITION_INFO_EXこの理由は何でしょうか?

最後の呼び出しをコメントアウトすると、ディスクは raw ディスクとして初期化されますが、これは要件を満たしていません。

上記のサンプルは、MBR パーティション スタイル専用です。GPT、... スタイルのサンプルが見つかりませんでした。誰かが知っている場合はリンクを提供してください。

0 投票する
0 に答える
763 参照

c# - I2C の DeviceIoControlCE

私は何日も前から問題に頭を悩ませてきました。あなたの助けをお願いします。

Windows CE7 を実行しているボードから I2C に接続しようとしています。ボードは Boundary Devices Nitrogen6X です。

これをC#でコーディングしようとしています。

多くのグーグルと試行錯誤の後、I2Cでほとんどすべてを実行できるようになりました(つまり、ほとんどのコマンドを機能するメソッドにラップしました)。もちろん、まだできないことは読み書きです。私はいくつかの異なる実装を試し、機能すると思われる C および C++ コードを移植しました。無駄に。現在、ここにコピーする 2 つの実装にさらに力を入れています。

これらの実装はどちらも私にとってはうまくいきません。どちらもエラー管理部分に入り、どちらもエラー番号 87 (ERROR_INVALID_PARAMETER) を報告します。

この種の問題について経験のある人はいますか?誰かが私が間違っていることを指摘できますか?

編集 1: おそらく、ボードの I2C3: の SDA および SCL ピンでいくつかの信号を「見よう」としていることに言及する必要があります。I2C バスに接続されている実際のデバイスはありません。確認ビットが受信されないため、最初のバイト (アドレス + 読み取り/書き込み) が送信された後に何らかのエラーが発生することが予想されます。ただし、コードにエラー 87 が表示され、スコープから見た信号に変化はありません (どちらもアイドル状態で高いままです)。

(コード スニペットが続きます)

最初のものはポインターなどを使用しており、おそらく C++ コードに近いものです。

私が取り組んでいる 2 番目のオプションは、マネージドとアンマネージドの間でマーシャリングを行うものです。

編集2:私が持っている(おそらく)動作するコード(実行できない)は、提供されたドライバーからのものであり、部分的に独占的である可能性があります(したがって共有できません)。ただし、次の定義を含む I2C バスのヘッダーをオンラインで見つけました。

ここで行われているように、最初はパラメーターに「null」を指定しようとしましたが、それでも同じエラーコードが表示されました。

編集 3: 同じドライバーから、構造体の定義:

編集 4: ref@ctacke がコメントで提案したように、構造体に a を渡すバージョンを実装してみました。私はまだ同じエラーが発生するので、彼が考えていた方法とは異なることをしたに違いないと思います。スニペットは次のとおりです。

編集 5:
オンラインで見つけました ( http://em-works.googlecode.com/svn/trunk/WINCE600/PLATFORM/COMMON/SRC/SOC/COMMON_FSL_V2_PDK1_9/I2C/PDK/i2c_io.cpp ) 次のコード:

私はそれを 100% 理解しているとは言えませんが、Windows の命名規則 ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa378932(v=vs.85).aspx ) からすると、送信する必要があるサイズ パラメータは、すべてを含む転送の合計バイト数であるように見えます。私は自分でその数を把握しようとしましたが、これまでのところできませんでした. または、構造体をバイト配列に変換するために何かを試みることも可能だと思います。システムがそれを理解するには、特定のバイト順が必要だと思います。
誰でもそれに参加できますか?

0 投票する
1 に答える
1811 参照

c - アプリからドライバーへの DeviceIoControl を使用したデータ送信

データドライバーをアプリに送信できます。

アプリ内:

ドライバーで:

結果は"eeee"アプリケーション コンソールに出力されます。

しかし、アプリのデータをドライバーに送信する方法がわかりません。DeviceIoControl の 3、4 パラメーターは、入力バッファーと長さです。
アプリに追加するchar InputBuffer[1024] = "InputBuffer's data";と、ドライバーはこのデータをどのように受け取ることができますか? DbgPrint()アプリから受け取ったデータに使用したい。


答えを選びたい。コメントしないで答えてください。

0 投票する
2 に答える
309 参照

c++ - DeviceIoControl によって割り当てられたメモリを解放する

で呼び出すDeviceIoControlIOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS、構造体にデータ (配列)VOLUME_DISK_EXTENTSへのポインターが格納されます。Extents私のコードで作成された構造体は私によって割り当て解除されていますが、ポインターの配列は邪魔なようです。

そのメモリを解放する必要がありますか?どうすれば解放できますか?

0 投票する
1 に答える
529 参照

windows - D の Windows SCSI ReadCapacity16

D を使用して Windows のボリュームに scsi ReadCapacity16 (0x9E) を送信しようとしています。Windows の非問い合わせ呼び出しのみが、Windows カーネルの「不正な関数」で機能しません。

問い合わせのみが機能するため、Windows カーネルを介して非問い合わせを送信するためのトリックはありますか? これを機能させるためのヒントはありますか?私は数週間調査しましたが、これを解決していません。

これはCDBの例です:

\\.\physicaldrive0 CDB バッファーの内容: 9e 10 00 00 00 00 00 00 - 00 00 00 00 00 20 00 00 sgio.exceptions.IoctlFailException@sgio\exceptions.d(13): ioctl エラー コードは 1 です。関数が正しくありません。

ここでは、CDB が DeviceIoControl 呼び出し用のバッファーにコピーされます。これは、Inquiry コマンドを正常に送信するのと同じコード パスです (ただし、readcap では失敗します)。以下に貼り付けたgithubのコード: