問題タブ [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# - DeviceIoControlは出力バッファを設定しません
に問題がありDeviceIOControl
ます。物理ドライブからディスクジオメトリを読み取ろうとしていますが、出力バッファが設定されていません。
これが私のコードのサンプルです。これは、ディスクジオメトリを取得し、ディスクがリムーバブルかどうかを返すことになっている単純な関数です。
そしていくつかのデータ構造:
私が入手した使用された列挙型
変数は設定されます(このbytesReturned
場合は24に設定されます)が、dg
変数はすべてゼロです。
DeviceIoControl
同じ結果で他のいくつかの関数を試しました:bytesReturned
が設定されていますが、出力バッファはすべてゼロです。
私のテスト環境
- OS:Windows 7 Pro 64
- IDE:Visual Studio 2010
- ターゲットフレームワーク:.Net 4.0
windows - IOCTLはどのように機能しますか?
IOCTLがどのように機能するか知りたいです。私は基本を知っています:
DeviceIoControl()->kernel32.dll->ntdll.dll->ユーザーモードからカーネルモードに移行した瞬間->I/Oマネージャー->IRP
問題は、IOCTLがユーザーモードからカーネルモードにどのように移行するかです。割り込みゲート、コールゲート、または他の何かですか?
IOCTL(Windows Internals以外)の詳細を説明する記事/本を知っている場合は、リンクを投稿してください。
c++ - デバイス固有 ID (ハードウェア シリアル ID とボリューム シリアル ID) Windows
私は Windows API をいじり回しており (WMI は信頼できないため、WMI には近づかないように言われています)、HD と接続された USB デバイスのデバイス シリアル番号を取得しようとしています。しかし、機能の大部分は、デバイスの実際の製造元固有のシリアル番号ではなく、ボリューム シリアル ID にアクセスするように設計されているようです。これらのボリューム シリアルは、ドライブが最後にフォーマットされた日時に基づいて計算されているようです。
まあ、これは私が開発したいアプリケーションには適していません - デバイスがフォーマットされていて、同じ情報がそのデバイスにコピーされている場合、彼らが私のアプリケーションを起動したときに、内部情報を処理できる必要があります (ボリューム シリアル ID を使用すると失われます。
http://www.winsim.com/diskid32/のコードを見ましたが、ボリュームのシリアル ID を返すだけのようです。編集: 実際には、以下の出力でわかるように、この値はボリューム シリアルとは異なります。
コードの最初のビット (GetVolumeInformation を使用) のシリアルは、コマンド プロンプトで「vol」と入力したときに取得したドライブの 16 進数値の 10 進数バージョンです。つまり、これがボリューム シリアルです。以下の数値は から返されるものDeviceIoControl(hwDrive, IOCTL_STORAGE_QUERY_PROPERTY...
です。これは、 diskid32のプログラマーが私のドライブ用に取得した ID と同じですが、以下の実際のシリアル番号とは異なります。困惑。
USB ドライブの場合:PSP_DEVICE_INTERFACE_DETAIL_DATA
構造体を使用して、USB ドライブの場合は次のような GUID デバイス列挙にアクセスできます。
\?\usbstor#disk&ven_toshiba&prod_mk5059gsxp&rev_gn00#203216187542_ _ &0#{53f563 07-b6bf-11d0-94f2-00a0c91efb8b}
そのデバイス情報のこの部分はシリアルであり、おそらく次のとおりです。
203216187542_ _
さらに、diskpart.exe (コマンド ライン パーティション プログラム) をロードし、システム HDD と外部 USB ドライブのドライブの詳細を確認しましたが、どちらも上記の値と一致しませんでした。
東芝 MK5055GSXF ATA デバイス ディスク ID: 00005B9E
東芝 MK5059GSXP USB デバイス ディスク ID: 51260D08
ここで何が起こっているのでしょうか?実際のデバイスの実際の製造シリアル番号にアクセスするには、どこで、どのようにすればよいですか?
どんな助けでも大歓迎です!
c# - C#/pinvoke DeviceIoControl 呼び出しで、ガベージ データと共に読み取った 0 バイトが返されるのはなぜですか?
正常に動作するアンマネージド C++ Windows コンソール アプリがあります。私はC#でそれをしたい。必要な Kernel32.dll シンボルの DllImport ステートメントを実行しました。
次に、次のアプリケーション コードがあります。
私の C# アプリは "Bytes read = 0" を出力し、ジオメトリ メンバーの値はガベージです。私は確かに DllImport とマーシャリングの専門家ではありません。私が間違っていることを理解するのを手伝ってください。DeviceIoControl の 5 番目のパラメーターを「ref DiskGeometry」に変更し、(IntPtr と alloc の代わりに) 呼び出しの直前に作成されたものを渡すと、出力されるジオメトリ メンバーの値はすべて 0 になります。
windows-8 - Windows XP、Vista、および 7 では HDD のシリアル番号が 2 バイトごとに反転するが、Windows 8 では反転しない
ソフトウェアのライセンスを取得するためのキーとして使用するために、 HDD のシリアル番号を取得する必要があります。この URL でdiskid32コードを使用しました: http://www.winsim.com/diskid32/diskid32.html IOCTL_STORAGE_QUERY_PROPERTYの IO 制御コードでDeviceIoControl Win32 API を 使用しました。
出来た。しかし、HDD自体に印刷されている実際のシリアル番号を再確認すると、番号の2バイトごとに反転していることがわかりました.
簡単な解決策は、単にバイトを元に戻すことです。Windows XP、Vista、および 7 では機能しましたが、Windows 8 では反転する必要はありません。
Windows XP、Vista、および 7 でバイトが反転した正確な理由と、Windows 8 で反転しない理由を知りたいです。次の Windows はどうですか?
マイナーな変更を加えたコードの一部:
c# - 物理ディスクサイズが正しくありません(IoCtlDiskGetDriveGeometry)
以下のコードを使用して物理ディスクのサイズを取得しましたが、返されるサイズが正しくありません。他のツールでサイズを確認しました。
以下のコードは報告します
総ディスク容量:8.249.955.840バイト
そしてそれは
総ディスク容量:8.254.390.272バイト
実際の/正しい物理ディスクサイズを取得するにはどうすればよいですか?USBドライブと通常のハードドライブでテスト済み。コードは長いので、ここでは部分的に分けて表示します。
構造:
ネイティブメソッド:
メインエントリー:
c# - C#で読み取られたrawディスクがわずかにシフトされたオフセットから読み取られるのはなぜですか?
rawディスクを読み取ろうとしています。ドライブを正常に開き、有効なハンドル(CreateFile)を取得し、そのハンドルのオフセットをゼロに設定し(SetFilePointerEx)、データをバッファーに読み取りましたByte[]
(ReadFile)。ここまでは順調ですね。しかし、いくつかの不明な理由で、バッファを比較すると(実際にそれを理解するのに時間がかかりました)、サードパーティのユーティリティ(Disk Investigator)が示すものと比較します。ブート情報(ジャンプ命令)は含まれていませんが、ディスクデータは修正されていますが、オフセット85 = 0x55から始まります。したがって、ボリュームブート情報の途中のどこかにあります。
何故ですか?何かありますか、私は行方不明です(明らかに私はそうです)?
システム:Windows 8(VmWare Workstation内)
コード:
CreateFile(他の場所)
PInvokeメソッド:
列挙:
winapi - 利用可能なすべての変更ジャーナル レコードの列挙
変更ジャーナル レコードの列挙に問題があります。
ご覧のとおり、Timeout
は非ゼロであり、BytesToWaitFor
非ゼロでもあります。FSCTL_READ_USN_JOURNAL
呼び出しが変更ジャーナルの最後に到達すると、Timeout
数秒待機してから、範囲内のすべての (0 個以上の) 使用可能なレコードを返す必要があることを理解しましたBytesToWaitFor
。ただし、何らかの理由で、完全に異なる動作を監視しています。DeviceIoControl
withFSCTL_READ_USN_JOURNAL
およびその他のリストされたパラメーターには、ファイル システムで新しい変更が発生するまで数分かかる場合があります。リクエストREAD_USN_JOURNAL_DATA.Timeout
の期間を制限しないのはなぜですか?FSCTL_READ_USN_JOURNAL
c# - フォルダー ID の取得 C#
ファイルとフォルダーをその存続期間全体にわたって追跡しようとしています (それらは移動または名前変更されている可能性があります)。検索を行ったところ、FileSystemWatcherがファイルとフォルダーを追跡する最も一般的な方法であることがわかりましたが、アプリケーションが常に実行されている場合と実行されていない場合があるため、これはうまくいきません。ID を使用してフォルダーを追跡することにしました。
このスタック投稿への回答から、ID からファイルを追跡する方法を見つけました。この回答のアプローチ B に基づいて、ファイル ID を正常に取得できます。
検索中に、 FSCTL_GET_OBJECT_IDを使用して解決策を見つけたと述べているこのスタック投稿を見つけました。この関数の使用方法を理解するためにかなりの時間を費やしましたが、頭を包むことはできません。C# 内からネイティブ Windows 関数を呼び出した経験は基本的にありません。
誰かがこれを正しい方向に押し進めることができますか? 明らかな何かが欠けているに違いないと感じています。
C# がファイル/フォルダー ID にアクセスできない理由はありますか? ファイル/フォルダーの追跡は一般的ではありませんか?
編集、コードの追加:
MSDN の投稿によると、無効なパラメーターである DeviceIoControl からエラー "87" が返されます (レピュテーションの制限により、これ以上リンクを投稿できません)。