問題タブ [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 投票する
2 に答える
2742 参照

delphi - バッテリーのシリアル番号を正しく取得するには?

Delphi 7 では、システムに接続されたバッテリに関する情報をカプセル化するオブジェクトを実装するライブラリに取り組んでいます。バッテリーのシリアル番号を取得することを除いて、うまく機能しています。

この呼び出しに使用しているコードは次のとおりです。

残念ながら、DeviceIoControl()常に返さFalseれ、後で確認するGetLastError()と、エラー 87、「パラメーターが正しくありません」で返されます。

InformationLevelを からBatterySerialNumberに変更するだけでコードが完全に機能するため、これはあまり意味がありませんBatteryUniqueIDhbatまた、以前のコードの他の呼び出しでバッテリーへのハンドル ( ) を使用したことがありますがGetSerialNumber、それらはすべて正常に動作し、これが失敗した後に他の呼び出しを行うこともできるので、それは問題ではありません。

何か案は?私は本当に途方に暮れています。

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

windows - IDENTIFY DEVICE COMMAND の送信 - RAID での ATA PASS THROUGH - SSD

私の目的は、RAID 構成のシステムでソリッド ステート ドライブを検出することです。smartmontools の次のコマンドを使用すると、ビット 434 (217) が SSD の値 1 を示していることがわかります: smartctl -i -r ataioctl,2 /dev/csmi0,0

同じ 512 バイトのデータを読み取ろうとして、次の 2 つの方法で IDENTIFY DEVICE コマンドを送信しようとしています。

方法 1 は DeviceIoControl() set GetLastError() as 87 (ERROR_INVALID_PARAMETER) で失敗します。何が問題なのかを理解するのを手伝ってもらえますか?私は正しい方向に進んでいますか?

方法 2 には info->IoctlHeader.ReturnCode = 3 があり、これは CSMI_SAS_STATUS_INVALID_PARAMETER を意味します (提供された CSMI バッファーが小さすぎます)。

///////// 方法 1 /////////

//////// 方法 2 //////////

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

usb - DeviceIoControl が「機能が正しくありません」で失敗するのはなぜですか

USB ドライバと通信しようとしています。ハンドルを取得できますが、一度使用するDeviceIoControlと失敗し、GetLastError()エラーは正しくない関数であると表示されます。これをデバッグする方法に困惑しています。XP 32ビットマシンを使用しています。

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

c# - C# で DeviceIoControl と FSCTL_MAKE_MEDIA_COMPATIBLE を使用して Live File System (LiveUDF) ディスクをファイナライズする方法は?

C# で Live File System (または「Live UDF」) 光ディスクをファイナライズしようとしています。MSDN および TechNet の記事とさまざまなフォーラムへの投稿を読んで理解したところによると、Image Mastering API (または IMAPI) はこのタイプのファイルシステムをサポートしていません。また、コーディング作業で IMAPI を使用して LiveUDF ディスクをファイナライズすることに失敗しました。その結果、FSCTL_MAKE_MEDIA_COMPATIBLE 制御コードを使用して DeviceIoControl 関数を使用しています。

まず、DeviceIoControl を同期的に呼び出していましたが、関数は 1117 を返し、ディスクは最終的に数分後にファイナライズされました。最終的な失敗または実際の成功の場合にのみプロセスを返す必要があるため、この結果は受け入れられません。

次に、CreateFile で FILE_FLAG_OVERLAPPED (0x40000000) dwFlagsAndAttributes フラグを指定してデバイス ハンドルを開き、NativeOverlapped オブジェクトを DeviceIoControl 呼び出しに渡すことで、DeviceIoControl を非同期的に呼び出します。その前に、明らかに、オーバーラップ イベントを処理するために IOCompletionCallback を設定しました。

説明したように DeviceIoControl を非同期で呼び出すと、(同期的に呼び出された場合と同様に) ほとんどすぐに 1117 が返され、IOCompletionCallback メソッドは呼び出されず、ディスクは数分後にファイナライズされます。

私の質問は: C# と DeviceIoControl を使用して Windows 7 プラットフォーム上の C# で Live File System (または「Live UDF」) 光ディスクをファイナライズするにはどうすればよいですか (プロセスが完了するまで「待機」する機能を使用して、同期的または非同期的に)最終的な成功または失敗の結果をキャプチャするため)?

よろしくお願いします。

0 投票する
5 に答える
5955 参照

c# - C#WriteFile()は、USBドライブのセクター242で書き込みを停止します

USBストレージデバイスのすべてのバイトに0xFFを書き込むために、次のコードを記述しました。何らかの理由で、WriteFile()セクター242で呼び出しがエラーになり始めます。これを2つの別々のUSBストレージデバイスで実行し、16進エディターでデバイスを調べました。セクター242は、FAT16形式のデバイスではファイルアロケーションテーブルの開始であり、NTFSデバイスではブートエリアの開始であるように見えます。これらの正確な場所でエラーが発生していることは確かではありませんが、この動作を変更する方法がわかりません。HRESULT失敗したときに受け取っているのはWriteFile-2147024891ですE_ACCESSDENIED。何が問題を引き起こしているのか誰かが知っていますか?

注:ローカルシステムでこのコードを実行する場合は、USBデバイスの物理デバイスIDをハードコーディングしているため、十分に注意してください。書き込みを試みているデバイスでdeviceId変数を更新してください。あなたはあなたのハードドライブを破壊したくありません。

編集/更新

サードパーティのツールを使用してUSBデバイスの低レベルのワイプを実行した後、これを正常に機能させることができました。ドライブが完全にゼロになった後、デバイスに正常に書き込むことができました。有効なfatまたはntfsファイルシステムとの使用を認識するとすぐに、Windowsがデバイスをロックしているように見えます

とペアリングされDeviceIoControlていると、デバイスのロックウィンドウが無効になっていないようです。

DeviceIoControl有効なファイルシステムを備えたドライブを使用して、WindowsでリムーバブルUSBデバイスを正常にロックする方法を知っている人はいますか?

私は自分がやろうとしていることを実行するいくつかのサードパーティツールを使用しましたが、それらは正常に機能します。私はそれが可能であることを知っていますが、私が読んだすべてのMSDNドキュメントは問題の解決に役立っていません。

編集/更新2

これはhttps://web.archive.org/web/20130507212546/http://msdn.microsoft.com/en-us/library/ff551353.aspxから取得されます

アプリケーションは、DASD I / Oを発行する前に、ボリュームをロックするか、ボリュームをマウント解除するか、またはその両方を行う必要があります。これはWindowsVistaの新機能であり、潜在的に悪意のある手法に対処するために行われました。

  1. ファイルシステムは、ディスクの予約済みセクションへのすべての書き込み操作をブロックします。この場合、これらの予約済みセクションには、MBRと2つのFATエリアが含まれます。これらの領域をブロックするには、FSCTL_LOCK_VOLUMEを送信してボリュームをロックする必要があります。この構造は、実際の書き込み操作を実行するのと同じボリュームハンドルで発行する必要があります。開いているファイルハンドルがある場合、この要求は失敗する可能性があります。この場合、アプリケーションはFSCTL_DISMOUNT_VOLUMEを発行することにより、ファイルシステムのマウント解除を強制できます。ただし、ファイルハンドルが閉じられるまで、ボリュームは実際にはマウント解除されません。それまで、アプリケーションは、現在開いているのと同じファイルハンドルを使用して、DASD I/Oを発行し続けることができます。

  2. 書き込み操作がブロックされるファイルシステムに認識されているボリュームスペースを超える拡張領域があります。この領域への書き込み操作を許可するには、ボリューム・ハンドルでFSCTL_ALLOW_EXTENDED_DASD_IOを発行する必要があります。

Win32 APIルーチンDeviceIoControlを使用して、以前のすべてのFSCTSを発行できます。

これはまさに上記のコードで実装しているものだと思いますが、正しく機能していないようです。ハンドルを取得し、デバイスをロックおよびマウント解除しているので、保護された領域に正しく書き込むことができるはずですか?

編集/更新3

これがディスクとボリュームを開く現在の順序です。ロック、マウント解除などの方法は、私たちが間違っていると思う順序で機能します。

私はまだ同じ結果を得ています、それはディスクがゴミ箱に捨てられたときはいつでも機能します。

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

winapi - DeviceIOControl に WindowsHookEx を設定します。どのフック ID を使用しますか?

MSDN に記載されている使用可能な idHook 値には、次のものがあります。

  • WH_CALLWNDPROC
  • WH_CALLWNDPROCRET
  • WH_CBT WH_DEBUG
  • WH_FOREGROUNDIDLE
  • WH_GETMESSAGE
  • WH_JOURNALPLAYBACK
  • WH_JOURNALRECORD
  • WH_キーボード
  • WH_KEYBOARD_LL
  • WH_MOUSE
  • WH_MOUSE_LL
  • WH_MSGFILTER
  • WH_SHELL
  • WH_SYSMSGFILTER

では、フック DeviceIOControl 関数 (コンソール アプリケーション用) にはどの idHook を使用する必要がありますか? または、他のフック方法を使用できますか?

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

c++ - C++ で DeviceIoControl 関数を使用してシステム予約ドライブを識別する

関数を使用して、ドライブがシステム予約ドライブ (PhysicalDrive0またはC-Drive)であるかどうかを識別しようとしていDeviceIoControlます。ただし、私のコードは常にすべてのドライブに対して true を返します。

  • bResultは常に 0 を返し、関数が成功したことを示します。
  • pdg->PartitionTypeジャンク情報があっても返品不可true
0 投票する
0 に答える
244 参照

c# - C から C# への変換、WinAPI 関数の呼び出し: ControlIoDevice

C で記述されたコードを C# (Compact Framework 2.0) に変換しようとしています (RFID リーダーを備えた Windows CE デバイス用です)。

C ではこのシステム コールは正常に機能しますが、C# では機能しません。

Cのコード

C# のコード

DLL は次のようにインポートされます。

C# での現在の実装では、bRet = false であり、これは C で取得された値であるため、I は true である必要があります。

これもゼロを返します:

どんな助けでも本当に感謝します!

よろしくお願いします!

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

debugging - FSCTL_LOCK_VOLUME で DeviceIoControl を使用してボリュームをロックします。デバッガの問題

FSCTL_LOCK_VOLUME で DeviceIoControl を使用して、直接ディスクの読み取り/書き込みを行う前に USB ペン ドライブをロックしています。プログラムは動作します - 時々。ロック呼び出し自体に問題があります。Visual Studio 2008 でコマンドをステップ実行すると、結果は正しく、ロックは毎回成功します。コードを実行すると (デバッグかどうかに関係なく)、無効なハンドルで散発的に呼び出しが失敗します。唯一の顕著な違いは、ステッピング時に 0.5 秒の一時停止があることです。これには満足していますが、呼び出しを実行/デバッグするとすぐに失敗します。

これがどこに落ちているかについてのヒントを教えてください。

これは真の技術者のためのものだと思います!

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

c++ - 入力 unsigned char バッファ C++ を使用した DeviceIoControl

DeviceIOControlドライバーに 128 バイトのバッファーを配置するのに問題があります。次のコードを使用します。

常に 0x6 エラーが発生します。何が間違っているのでしょうか?

upd 私のハンドル作成関数: